Pointer dereference with tainted offset

Смещение из небезопасного источника, и разыменуйте, может выйти за пределы

Описание

Этот дефект происходит, когда указатель разыменовывает, использует переменную смещения из неизвестного или небезопасного источника. Чтобы рассмотреть весь вход снаружи текущего аналитического периметра как небезопасный, используйте -consider-analysis-perimeter-as-trust-boundary.

Эта проверка фокусируется на динамически выделенных буферах. Для статических буферных смещений смотрите Array access with tainted index.

Риск

Индекс может найтись вне допустимой области значений массивов. Если испорченный индекс находится вне области значений массивов, он может вызвать:

  • Недостаточное наполнение буфера / подписывает, или пишущий в память перед началом буфера.

  • Переполнение буфера, или пишущий в память после конца буфера.

  • По чтению буфера или доступу к памяти после конца целенаправленного буфера.

  • Под чтением буфер или память доступа перед началом целенаправленного буфера.

Атакующий может использовать недопустимое чтение или записать, чтобы поставить под угрозу вашу программу.

Фиксация

Подтвердите индекс, прежде чем вы будете использовать переменную, чтобы получить доступ к указателю. Проверяйте, чтобы убедиться, что переменная в допустимой области значений и не переполняется.

Примеры

развернуть все

#include <stdio.h>
#include <stdlib.h>
enum {
    SIZE10  =  10,
    SIZE100 = 100,
    SIZE128 = 128
};
extern void read_pint(int*);

int taintedptroffset(void) {
    int offset;
    scanf("%d",&offset);
    int* pint = (int*)calloc(SIZE10, sizeof(int));
    int c = 0;
    if(pint) {
        /* Filling array */
        read_pint(pint);
        c = pint[offset];
        free(pint);
    }
    return c;
}

В этом примере функция инициализирует целочисленный указатель pint. Указатель разыменовывается с помощью входного индекса offset. Значение offset мог найтись вне области значений указателя, вызвав ошибку из области значений.

Коррекция — индекс проверки прежде разыменовывает

Одна возможная коррекция должна подтвердить значение offset. Продолжите разыменование указателя только если offset в допустимой области значений.

#include <stdlib.h>
#include <stdio.h>
enum {
    SIZE10  =  10,
    SIZE100 = 100,
    SIZE128 = 128
};
extern void read_pint(int*);

int taintedptroffset(void) {
    int offset;
    scanf("%d",&offset);
    int* pint = (int*)calloc(SIZE10, sizeof(int));
    int c = 0;
    if (pint) {
        /* Filling array */
        read_pint(pint);
        if (offset>0 && offset<SIZE10) {
            c = pint[offset];
        }
        free(pint);
    }
    return c;
}

Информация о результате

Группа: испорченные данные
Язык: C | C++
Значение по умолчанию: Off
Синтаксис командной строки: TAINTED_PTR_OFFSET
Удар: низко
ID CWE: 122, 124, 129, 823
Введенный в R2015b