1 added
1 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: реверс-инжиниринг кода, безопасность, фаззинг, тестирование приложений, статический анализ, динамический анализ, анализатор, american fuzzy lop, afl, security-oriented fuzzing, coverity, pvs studio и clang static analyzer</p>
1
<p>Теги: реверс-инжиниринг кода, безопасность, фаззинг, тестирование приложений, статический анализ, динамический анализ, анализатор, american fuzzy lop, afl, security-oriented fuzzing, coverity, pvs studio и clang static analyzer</p>
2
<p>Многие знают, а некоторые с успехом используют в процессе разработки<strong>статический анализ кода</strong>. Это эффективный, довольно быстрый и достаточно удобный способ контроля качества разрабатываемого кода. Кроме того, на этапе тестирования можно попробовать и<strong>динамический анализ</strong>. Про отличия между этими методиками написано очень много, но в нашем случае достаточно лишь вспомнить, что статический анализ осуществляется без выполнения кода (к примеру, во время компиляции), а динамический анализ - в процессе выполнения.</p>
2
<p>Многие знают, а некоторые с успехом используют в процессе разработки<strong>статический анализ кода</strong>. Это эффективный, довольно быстрый и достаточно удобный способ контроля качества разрабатываемого кода. Кроме того, на этапе тестирования можно попробовать и<strong>динамический анализ</strong>. Про отличия между этими методиками написано очень много, но в нашем случае достаточно лишь вспомнить, что статический анализ осуществляется без выполнения кода (к примеру, во время компиляции), а динамический анализ - в процессе выполнения.</p>
3
<p>Когда анализируют компилируемый код с точки зрения безопасности, то под динамическим анализом зачастую подразумевается<strong>фаззинг</strong>- методику тестирования, во время которой на вход программы подаются случайные или невалидные данные.<strong>Преимущество фаззинга</strong>- отсутствие ложных срабатываний, которые достаточно часто встречаются во время применения статических анализаторов.</p>
3
<p>Когда анализируют компилируемый код с точки зрения безопасности, то под динамическим анализом зачастую подразумевается<strong>фаззинг</strong>- методику тестирования, во время которой на вход программы подаются случайные или невалидные данные.<strong>Преимущество фаззинга</strong>- отсутствие ложных срабатываний, которые достаточно часто встречаются во время применения статических анализаторов.</p>
4
<h2>American Fuzzy Lop (AFL)</h2>
4
<h2>American Fuzzy Lop (AFL)</h2>
5
-
<p>В последнее время широкую популярность приобрёл фаззер от Michal Zalewski -<a>American Fuzzy Lop</a>(AFL). Это связано с его эффективностью, а также тем, что он отличается инструментацией кода на этапе компиляции, производительностью и ориентированностью на практическое применение. В<strong>American Fuzzy Lop</strong>не используются SMT solver'ы, поэтому AFL должен быть менее требовательным к ресурсам, следовательно, работать быстрее.</p>
5
+
<p>В последнее время широкую популярность приобрёл фаззер от Michal Zalewski -<a>American Fuzzy Lop</a>(AFL). Это связано с его эффективностью, а также тем, что он отличается инст��ументацией кода на этапе компиляции, производительностью и ориентированностью на практическое применение. В<strong>American Fuzzy Lop</strong>не используются SMT solver'ы, поэтому AFL должен быть менее требовательным к ресурсам, следовательно, работать быстрее.</p>
6
<p>Давайте посмотрим, как можно использовать этот инструмент и проведём эксперимент, сравнив результаты работы AFL с результатами ряда инструментов для статического анализа.</p>
6
<p>Давайте посмотрим, как можно использовать этот инструмент и проведём эксперимент, сравнив результаты работы AFL с результатами ряда инструментов для статического анализа.</p>
7
<p>Итак, для начала надо понять, работает ли фаззер на практике, а также определиться с тем, что будем фаззить. Для проверки возьмём заведомо уязвимую версию библиотеки<a>libcurl</a>- 7.34.0. Эта версия имеет уязвимость, описанную в<a>CVE-2015-3145</a>(речь идёт об уязвимости в функции sanitize_cookie_path()).</p>
7
<p>Итак, для начала надо понять, работает ли фаззер на практике, а также определиться с тем, что будем фаззить. Для проверки возьмём заведомо уязвимую версию библиотеки<a>libcurl</a>- 7.34.0. Эта версия имеет уязвимость, описанную в<a>CVE-2015-3145</a>(речь идёт об уязвимости в функции sanitize_cookie_path()).</p>
8
<p>Эта функция обрабатывает входные данные<strong>некорректно</strong>. Если вы передадите в неё путь, состоящий из нуль-байта либо двойной кавычки, библиотека назначит нуль-байт по отрицательному указателю массива<strong>new_path</strong>, следовательно, испортит память на куче.</p>
8
<p>Эта функция обрабатывает входные данные<strong>некорректно</strong>. Если вы передадите в неё путь, состоящий из нуль-байта либо двойной кавычки, библиотека назначит нуль-байт по отрицательному указателю массива<strong>new_path</strong>, следовательно, испортит память на куче.</p>
9
<p>В первую очередь давайте проверим, каким образом на данную уязвимость реагируют статические инструменты анализа:<strong>PVS Studio</strong>,<strong>Coverity</strong>,<strong>Clang Static Analyzer</strong>.</p>
9
<p>В первую очередь давайте проверим, каким образом на данную уязвимость реагируют статические инструменты анализа:<strong>PVS Studio</strong>,<strong>Coverity</strong>,<strong>Clang Static Analyzer</strong>.</p>
10
<h3>Clang Static Analyzer</h3>
10
<h3>Clang Static Analyzer</h3>
11
<p>В Clang делаем так:</p>
11
<p>В Clang делаем так:</p>
12
$ cd curl $ mkdir build-clang $ cd build-clang $ cmake -DCMAKE_C_COMPILER=/path/to/clang/ccc-analyzer -DCMAKE_CXX_COMPILER=/path/to/clang/ccc-analyzer -DCMAKE_BUILD_TYPE=release ../ $ scan-build -o html make<p>Далее в директории html видим результат анализа:</p>
12
$ cd curl $ mkdir build-clang $ cd build-clang $ cmake -DCMAKE_C_COMPILER=/path/to/clang/ccc-analyzer -DCMAKE_CXX_COMPILER=/path/to/clang/ccc-analyzer -DCMAKE_BUILD_TYPE=release ../ $ scan-build -o html make<p>Далее в директории html видим результат анализа:</p>
13
<h3>Coverity</h3>
13
<h3>Coverity</h3>
14
<p>Теперь Coverity. Он перехватывает вызовы компилятора и запускался со следующими параметрами:</p>
14
<p>Теперь Coverity. Он перехватывает вызовы компилятора и запускался со следующими параметрами:</p>
15
$ cov-analyze --dir cov --all --security --enable-constraint-fpp --enable-single-virtual --enable-fnptr --enable-callgraph-metrics -j 2 --inherit-taint-from-unions --override-worker-limit<h3>PVS Studio</h3>
15
$ cov-analyze --dir cov --all --security --enable-constraint-fpp --enable-single-virtual --enable-fnptr --enable-callgraph-metrics -j 2 --inherit-taint-from-unions --override-worker-limit<h3>PVS Studio</h3>
16
<p>Что касается PVS Studio, то тут требуется Windows. Однако в trial-версии имена проблемных файлов не показываются, но мы ведь уже знаем строку и тип ошибки, а значит, для бинарной оценки этого будет вполне достаточно.<strong>PVS Studio</strong>запускался в режиме монитора, причём для простоты сборки задействовался скрипт<strong>build-libcurl-windows</strong>. Ниже мы приводим не весь вывод PVS Studio:</p>
16
<p>Что касается PVS Studio, то тут требуется Windows. Однако в trial-версии имена проблемных файлов не показываются, но мы ведь уже знаем строку и тип ошибки, а значит, для бинарной оценки этого будет вполне достаточно.<strong>PVS Studio</strong>запускался в режиме монитора, причём для простоты сборки задействовался скрипт<strong>build-libcurl-windows</strong>. Ниже мы приводим не весь вывод PVS Studio:</p>
17
<p>Результат нашей работы следующий:<strong>никакой из статических анализаторов проблему не обнаружил</strong>!</p>
17
<p>Результат нашей работы следующий:<strong>никакой из статических анализаторов проблему не обнаружил</strong>!</p>
18
<p>Что же, давайте теперь попробуем<strong>запустить процесс фаззинга</strong>. Но мы сделаем это в следующей части нашей статьи и подробно узнаем, как надо использовать<strong>American Fuzzy Lop для тестирования приложений</strong>. Следите за обновлениями блога!</p>
18
<p>Что же, давайте теперь попробуем<strong>запустить процесс фаззинга</strong>. Но мы сделаем это в следующей части нашей статьи и подробно узнаем, как надо использовать<strong>American Fuzzy Lop для тестирования приложений</strong>. Следите за обновлениями блога!</p>
19
19