Обнаружение уязвимостей в web- приложениях, написанных на Python, средствами динамического анализа исходных кодов Заливин Д.А. Козлов Д.Д. Петухов А.А.
2 Наиболее распространенные веб- уязвимости 70% сайтов открыты для взлома* *IEEE Security and Privacy, vol.4, no
3 Пример уязвимости S1: $skip = $_GET["skip"]; S2: if ($skip < 0) S3: $skip = 0; S4: $QueryOffset = $skip. ", 10"; S5: mysql_connect(); S6: mysql_select_db("myDB"); S7: $request= "SELECT fld_Text FROM news LIMIT ".$QueryOffset; S8: $result=mysql_query($request); Нормальный запрос: SELECT fld_Text FROM news LIMIT 0, 10 Однако при skip=10; DELETE FROM news; будет выполнен запрос : SELECT fld_Text FROM news LIMIT 10; DELETE FROM news;
4 Существующие методы обнаружения уязвимостей Тестирование на проникновение Задаются шаблоны значений HTTP-параметров Задаются шаблоны ожидаемых ответов Проводится сканирование Динамический анализ Tainted mode Есть для Perl, Ruby, PHP Статический анализ Tainted mode на графе потоков данных программы Есть для Java, PHP
5 Цель работы Выявление уязвимостей, связанных с некорректной обработкой входных данных в web-приложениях на языке Python посредством динамического анализа исходных кодов
6 Предположения Все данные, полученные через HTTP-запросы, считаются ненадежными Все ресурсы, локальные по отношению к web- приложению, считаются надежными Ненадежные данные могут стать надежными вследствие специальной обработки
7 Уязвимость Ненадежные данные не должны использоваться при построении HTTP-ответов Ненадежные данные не должны сохраняться в локальных хранилищах данных Ненадежные данные не должны использоваться при конструировании команд к внешним по отношению к Web-приложению сервисам Ненадежные данные не должны использоваться при формировании исходного кода для интерпретации на лету
8 Tainted mode S1: $skip = $_GET["skip"]; S2: if ($skip < 0) S3: $skip = 0; S4: $QueryOffset = $skip. ", 10"; S5: mysql_connect(); S6: mysql_select_db("myDB"); S7: $request= "SELECT fld_Text FROM news LIMIT ".$QueryOffset; S8: $result=mysql_query($request);
9 Список конструкций, возвращающих ввод пользователя параметры запросов, значения cookie, заголовки запросов в примере: массив $_GET Список критических к вводу функций работа с СУБД, ФС, почтой, интерпретатором ОС системные вызовы вывод HTML в браузер клиента в примере: mysql_connect, mysql_select_db, mysql_query Список конструкций, фильтрующих ввод пользователя кодирование служебных символов (> >hn;) экранирование служебных символов ( \) приведение к типу (строку к целому) в примере: $Skip = 0 Tainted mode Конфигурация
10 Алгоритм: Для каждого аргумента каждой критической к вводу функции F j построить граф зависимостей по данным В каждом графе выделить пути от корня F j ко всем переменным, инициализируемым от пользовательского ввода, X i Если среди выделенных путей существует путь без вершины с фильтрацией ввода, сигнализировать о возможной уязвимости Уязвимость - это отсутствие проверки для входного параметра X i относительно критической к вводу функции F j, {(X i, F j )} Tainted mode Алгоритм
11 Реализация 1)Модификация встроенных строковых типов 2)Присваивание входным данным метки Taint 3)Распространение метки Taint 4)Снятие метки Taint 5)Реагирование на Taint данные
12 Модификация встроенных типов Встроенные в язык Python структуры для представления строк дополнены полем меткой Taint, сигнализирующей, прошла ли эта строка проверку на корректность или нет
13 Присваивание входным данным метки Taint Флаг Taint устанавливается, если строковая переменная инициализируется от данных HTTP- запроса
14 Распространение метки Taint - Флаг Taint устанавливается, если строковая переменная получает свое значение от других переменных с поднятым флагом taint
15 Снятие метки Taint - Флаг Taint снимается, если строковая переменная проходит функцию проверки на корректность данных
16 Реагирование на Taint данные
17 Результаты 1)Разработан метод динамического анализа для обнаружения уязвимостей, связанных с некорректной обработкой пользовательского ввода 2)Произведена его реализация путем модификации интерпретатора Python 3)Проведена настройка метода на специфику технологии mod_python
18 Относительность «опасных» символов Для различных критических к пользовательскому вводу функций опасны различные конструкции Реализация фильтрации пользователем Существует много альтернативных способов произвести фильтрацию пользовательского ввода Ошибки в алгоритмах фильтрации Ручная перенастройка метода при применении различных фреймворков Поиск фильтрующих функций во фреймворке Поиск оберток критических функций во фреймворке Tainted mode Недостатки метода
19 Спасибо за внимание! Вопросы?