Use of tainted pointer

Указатель из небезопасного источника может быть NULL или указать на неизвестную память

Описание

Этот дефект происходит когда:

  • Испорченный Нулевой указатель — указатель не подтвержден против NULL.

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

Примечание

На одном указателе ваш код может иметь экземпляры Использования испорченного указателя, Указатель разыменовывают с испорченным смещением, и Испорченным NULL или не пустой отключенной строкой. Средство поиска ошибки повышает только первый испорченный дефект указателя, который оно находит.

Риск

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

  • Измените переменные состояния критической программы.

  • Заставьте свою программу отказывать.

  • Выполните нежелательный код.

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

  • Считайте уязвимые данные.

  • Заставьте свою программу отказывать.

  • Измените переменную программы к неожиданному значению.

Фиксация

Избегайте использования указателей из внешних источников.

В качестве альтернативы, если вы доверяете внешнему источнику, санируете указатель, прежде чем разыменуют. В отдельной функции санитизации:

  • Проверяйте, что указатель не является ПУСТЫМ.

  • Проверяйте размер ячейки памяти (если возможный). Эта вторая проверка подтверждает, ожидает ли размер данных, указатель указывает на соответствия размеру вашу программу.

Дефект все еще появляется в теле функции санитизации. Однако, если вы используете функцию санитизации вместо нескольких случаев, дефект появляется только однажды. Можно выровнять по ширине дефект и скрыть его в более поздних отзывах при помощи аннотаций кода. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Выравнивания.

Примеры

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

void taintedptr(int* p, int i) {
    *p = i; 
}

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

Коррекция — избегает использования внешних указателей

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

#include <stdlib.h> 
	int *taintedptr(int i) {
    /* Use heap memory allocated in the application */ 
    int *p = (int *)malloc(sizeof (int)); 
    if (p != NULL) { /* Check for success */
        *p = i;
    }
return p;
}

Коррекция — указатель проверки

Другая возможная коррекция должна санировать указатель перед использованием его. Этот пример использует вторую функцию, чтобы проверять, является ли указатель пустым и может быть разыменован.

Средство проверки все еще показывает дефект в теле функции санитизации, когда вы разыменовываете указатель. Можно добавить аннотации кода, чтобы автоматически выровнять по ширине это, и другие дефекты в органе по санитизации функционируют и скрывают их от списка результатов. Смотрите Аннотируют Код и Скрывают Известные или Приемлемые результаты.

#include <stdlib.h>

int* sanitize_ptr(int* p) {
    int* res = NULL;
    int x;
    
    if (p != NULL) {
        x = *p; /* polyspace DEFECT:TAINTED_PTR,USELESS_WRITE [No action planned] "Check for dereference" */
        res = p;
    }
    return res;
}

void taintedptr(int *p, int i) {
    p = sanitize_ptr(p);
    if (p) {
        *p = i;
    }
}

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

Группа: испорченные данные
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: TAINTED_PTR
Удар: низко
ID CWE: 690, 822

Введенный в R2015b