exponenta event banner

Отмена привязки указателя с запятнанным смещением

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

Описание

Этот дефект возникает, когда указатель использует переменную смещения из неизвестного или небезопасного источника. Чтобы считать все входные данные вне текущего периметра анализа небезопасными, используйте -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++
По умолчанию: Откл.
Синтаксис командной строки: TAINTED_PTR_OFFSET
Воздействие: Низкий
CWE ID: 122, 124, 129, 823
Представлен в R2015b