Use of tainted pointer

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

Описание

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

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

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

Примечание

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

Риск

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

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

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

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

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

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

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

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

Фиксация

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

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

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

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

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

Примеры

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

#include<stdlib.h>
void taintedptr(void) {
	char *p = getenv("ARG");
	char x = *(p+10);  
}

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

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

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

#include<stdlib.h>
#include <string.h> 
void taintedptr(void) {
	char *p = getenv("ARG");
	if(*p!=NULL && strlen(p)>10)
	{
	char x = *(p+10);
	}
}

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

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