Use of tainted pointer

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

Описание

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

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

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

Примечание

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

Чтобы рассмотреть весь вход снаружи текущего аналитического периметра как небезопасный, используйте -consider-analysis-perimeter-as-trust-boundary.

Риск

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

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

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

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

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

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

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

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

Фиксация

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

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

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

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

Дефект все еще появляется в теле функции санитизации. Однако, если вы используете функцию санитизации вместо нескольких случаев, дефект появляется только однажды. Можно выровнять по ширине дефект и скрыть его в более поздних отзывах при помощи аннотаций кода. Смотрите Результаты 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