Pointer dereference with tainted offset

Смещение от небезопасного источника, и dereference может оказаться вне границ

Описание

Этот дефект возникает, когда разыменование указателя использует переменную смещения от неизвестного или небезопасного источника. Чтобы считать все входы за пределами периметра анализа тока небезопасными, используйте -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
Влияние: Низкое
ИДЕНТИФИКАТОР CWE: 122, 124, 129, 823
Введенный в R2015b