exponenta event banner

Указатель функции с абсолютным адресом

Константное выражение используется, так как адрес функции уязвим для ввода кода

Описание

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

Bug Finder рассматривает выражения с любой комбинацией литеральных констант в качестве абсолютного адреса. Единственным исключением является случай, когда значение выражения равно нулю.

Риск

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

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

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

Не используйте абсолютный адрес с указателями функций.

Примеры

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

extern int func0(int i, char c);
typedef int (*FuncPtr) (int, char);

FuncPtr funcptrabsoluteaddr() {
    return (FuncPtr)0x08040000; 
}

В этом примере функция возвращает указатель функции на адрес 0x08040000. Если злоумышленник знает этот абсолютный адрес, он может скомпрометировать вашу программу.

Исправление - адрес функции

Одной из возможных корректировок является использование адреса существующей функции.

extern int func0(int i, char c);
typedef int (*FuncPtr) (int, char);

FuncPtr funcptrabsoluteaddr() {
    return &func0;
}

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

Группа: Безопасность
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: FUNC_PTR_ABSOLUTE_ADDR
Воздействие: Низкий
ИДЕНТИФИКАТОР CWE: 587
Представлен в R2015b