Use of tainted pointer

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

Описание

Этот дефект возникает, когда:

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

  • Тонированный указатель размера - размер зоны памяти, на который указывает небезопасный указатель, не проверяется.

Примечание

На одном указателе у вашего кода могут быть образцы Use of tainted pointer, Pointer dereference с tainted offset и Tainted NULL или non-null-termined string. Bug Finder поднимает только первый испорченный дефект указателя, который находит.

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

Риск

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

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

  • Из-за сбоя вашей программы.

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

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

  • Чтение конфиденциальных данных.

  • Из-за сбоя вашей программы.

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

Зафиксировать

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

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

  • Проверьте, что указатель не имеет значение NULL.

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

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

Примеры

расширить все

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

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

Коррекция - Контрольный указатель

Одной из возможных коррекций является санирование указателя перед его использованием. Этот пример проверяет, является ли указатель 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
Влияние: Низкое
ИДЕНТИФИКАТОР CWE : 690, 822
Введенный в R2015b