4. Техники обнаружения уязвимостей
Динамический анализ кода (DAST)
Фаззинг входящих параметров (Fuzz testing/Black Box)
Инструментация кода
Статический анализ кода (SAST)
Pattern matching
Анализ не самой программы, а какого-либо её представления
(AST/CFG/PDG)
Гибридный анализ
Совмещение результатов полученных статическим и
динамическим анализом.
5. Статический анализ кода
Необходимо иметь доступ к исходным кодам
приложения
Позволяет не только искать уязвимости, но и проверять
различные свойства программ
Преимущество: не нужно развернутого приложения
Большинство академических методов статического
анализа, не позволяют анализировать большие
приложения
Тяжело проверить полученные результаты
6. Динамический анализ кода.
Настройки конфигурации
Не нужно иметь доступ к исходным кодам приложения,
но необходимо установленное приложение
Не зависит от языка, на котором написано приложение
Легко реализуется и легко проверить результаты анализа
Сложно оценить покрытие кода при проведении анализа
Можно уничтожить веб приложение
7. Гибридный анализ.
Необходимо иметь доступ как к исходным кодам
приложения, так и развернутое приложение.
Есть возможность проверить полученные результаты, но
необходимо скомбинировать результаты статического
анализа и динамического.
При “плохой” реализации, возникают в полном объеме
все минусы динамического анализа
Отчеты содержат большое количество результатов, не
относящихся к уязвимостям.
8. Реализованные цели.
Производить анализ при отсутствии развернутого приложения.
Небольшое количество ложных срабатывании (false positive)
Автоматическая генерация эксплойтов!
9. Описание алгоритма.
По исходному коду строится промежуточное представление
программы.
По промежуточному представлению создается абстрактная
интерпретация программы.
По абстрактной интерпретации производятся символические
вычисления.
19. Ход выполнения: ООП
<?php
class ParamGetter {
public function getParam($param) {
return $_GET[$param];
}
}
$x = new ParamGetter();
print $x->getParam('name');
20. Ход выполнения: пространство имен
<?php
…
use Modules/Params;
$x = new ParamGetter();
print $x->getParam('name');
21. Ход выполнения: глобальные переменные
<?php
$flag = False;
function f() {
global $flag;
if ($flag) // меняется в функции g()
print $_GET['x']; // false positive
g();
}
function g() { // вызывается в трех местах
global $flag;
$flag = !$flag;
}
f(); g();
f(); g();
$flag
g()
print $_GET['x']
f()
Main:
Line 17
Main:
Line 18
… … …
комбинаторный
взрыв
22. Ход выполнения: присваивание по ссылке
<?php
function f($x, &$y) {
$y = $x;
}
$x = $_GET['x'];
$y = NULL;
f($x, $y);
print $y;
23. Ход выполнения: зависимости модулей
Файл не является точкой входа
<?php // module1.php
$x = $_GET['x'];
require('module2.php');
?>
<?php // module2.php
print $x;
?>
38. Дополнительные сложности 2
• Определение подключаемых модулей по результату
запроса к базе данных
• Для компилируемых языков отсутствие части
зависимостей не дает собрать проект
• Символьное решение методами SAT может работать
очень долго: необходимы эвристики и ограничение по
времени
• Можно решать уравнения не на множестве строк а на
множестве регулярных выражений для них
• Всегда есть место для оптимизации
39. Другие виды уязвимостей
• Не все типы уязвимостей стоит ловить подобным
методом (Pattern Matching, Fingerprinting, ошибки
конфигурации)
• При расширении подхода становится возможным искать
и более сложные инъекции (хранимые XSS, SQLi)