exponenta event banner

Использование запятнанного указателя

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

Описание

Этот дефект возникает в следующих случаях:

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

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

Примечание

В одном указателе код может иметь экземпляры Use of lainted pointer, Pointer dereference with tainted offset и Tainted NULL или строку с ненулевым окончанием. Bug Finder поднимает только первый обнаруженный дефект запятнанного указателя.

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

Риск

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

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

  • Вызовите сбой программы.

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

Если указатель не используется для чтения, злоумышленник может:

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

  • Вызовите сбой программы.

  • Измените значение переменной программы на непредвиденное.

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

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

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

  • Убедитесь, что указатель не имеет значение NULL.

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

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

Примеры

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

#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++
По умолчанию: Откл.
Синтаксис командной строки: TAINTED_PTR
Воздействие: Низкий
CWE ID: 690, 822
Представлен в R2015b