Вебинар: Использование статических анализаторов кода при разработке безопасного ПО - 19.12
Продвинутые статические анализаторы учитывают данные, которые передаются между процедурами/функциями, чтобы выявить большее количество ошибок и дефектов безопасности. Это важно при выявлении таких ошибок, как выход за границу буфера, утечка конфиденциальных данных (анализ помеченных данных), разыменование нулевых указателей и т.д. Связано это с тем, что создание некого ресурса, его использование и освобождение часто разнесены по разным функциям.
Для выявления ошибок, возникающих при взаимодействии нескольких процедур, статические анализаторы используют технологию межпроцедурного контекстно-чувствительного анализа кода. Если эти функции находятся в разных программных модулях, то необходимо использовать межмодульный анализ.
Рассмотрим пример ошибки, найденной с помощью межмодульного анализа инструментом PVS-Studio в коде проекта Midnight Commander (язык C).
Начнём с функции widget_destroy в файле widget-common.c:
void widget_destroy (Widget * w)
{
send_message (w, NULL, MSG_DESTROY, 0, NULL);
g_free (w);
}
Для нас важно, что функция освобождает буфер памяти, адрес которого она получает через аргумент w.
Теперь посмотрим на код в файле editcmd.c:
gboolean edit_close_cmd (WEdit * edit)
{
Widget *w = WIDGET (edit);
....
widget_destroy (w); // <= Здесь освободили память
if (....) .... else
{
edit = find_editor (DIALOG (g));
if (edit != NULL)
widget_select (w); // <= Сейчас заглянем внутрь
}
}
Обратите внимание, что в начале адрес структуры Widget передаётся в функцию widget_destroy, где происходит освобождение буфера памяти. Далее этот указатель передаётся в функцию widget_select, приведённую ниже:
void widget_select (Widget * w)
{
WGroup *g;
if (!widget_get_options (w, WOP_SELECTABLE))
return;
....
}
Она просто передаёт указатель дальше в функцию widget_get_options:
static inline gboolean
widget_get_options (const Widget * w, widget_options_t options)
{
return ((w->options & options) == options);
}
Здесь мы добрались до места, где возникает неопределённое поведение, связанное с использованием данных в уже освобождённом буфере памяти. Анализатор PVS-Studio сигнализирует об этом предупреждением:
V774 The 'w' pointer was used after the memory was released.
Это относительно простой случай, где было задействованы только два файла: widget-common.c и editcmd.c. Ошибки могут быть выявлены и в более длинных цепочках вызова процедур, расположенных в трёх и более файлах. Однако на практике у статических анализаторов есть ограничения на глубину анализа вызовов. Они связаны как с теоретическими сложностями (проблема остановки), так и практическими (большая вычислительная сложность). Поэтому статический анализ кода полезно дополнять динамическим.
ГОСТ Р 71207-2024 — Статический анализ программного обеспечения. В разделе терминов дано следующее определение межмодульного анализа:
Статический анализ, при котором выполняется совместный анализ программы или нескольких программ, состоящих из нескольких программных модулей, и выявляемые свойства программы затрагивают процедуры или переменные из различных модулей.
Дополнительные ссылки
0