Указатель разыменовывает с испорченным смещением

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

Описание

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

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

Риск

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

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

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

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

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

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

Фиксация

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

Примеры

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

#include <stdlib.h>

enum {
    SIZE10  =  10,
    SIZE100 = 100,
    SIZE128 = 128
};
extern void read_pint(int*);

int taintedptroffset(int i) {
    int* pint = (int*)calloc(SIZE10, sizeof(int));
    int c = 0;
    if(pint) {
        /* Filling array */
        read_pint(pint);
        c = pint[i];
        free(pint);
    }
    return c;
}

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

Исправление — индекс проверки прежде разыменовывает

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

#include <stdlib.h>

enum {
    SIZE10  =  10,
    SIZE100 = 100,
    SIZE128 = 128
};
extern void read_pint(int*);

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

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

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

Введенный в R2015b