в Positive Technologies (в любой непонятной ситуации пишем статанализаторы ) • Appsec- и CS-исследователь в области формальных методов анализа и защиты приложений • Активный участник и организатор Positive Development User Group Контакты: [email protected] about.me/vladimir.kochetkov :~$ whoami
формальные модели? – Нет • Уязвимости или недостатки? – Уязвимости • Какого цвета ящик? – Белый в серую крапинку • Результаты анализа? Непростые вопросы (5/6)
формальные модели? – Нет • Уязвимости или недостатки? – Уязвимости • Какого цвета ящик? – Белый в серую крапинку • Результаты анализа? – Воспроизводимые и верифицируемые Непростые вопросы (6/6)
направленных на исследование исключительно исходного кода приложения с целью выявления уязвимостей и позволяющих получать воспроизводимые и верифицируемые результаты» Идеальный процесс статического анализа защищённости (1/2)
analyze(code, data): while n: print(n) n -= 1 if not vulnerable(code, data): # given configuration is secure vulnerable_function_call() else: # given configuration is vulnerable """ eval(analyzer_code) analyze(analyzer_code, analyzer_code) Вездесущая теорема Райса
покрыть нужное количество частных случаев» • «Реальные компьютеры имеют ограниченную память, а потому программы для них эквивалентны конечным автоматам, а не машинам Тьюринга» • Каков «физический» смысл теоремы Райса? «Контраргументы»
Машина Тьюринга состоит из: • бесконечной ячеистой ленты; • управляющего устройства с конечным числом состояний; • таблицы переходов между состояниями. На каждой итерации может: • изменить текущую ячейку; • перейти в другое состояние; • переместиться на соседнюю ячейку.
⇒ (A → q1) _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 A B
⇒ (A → q1) (q1 B) ⇒ (B → q1) _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 A B
экспоненциальную сложность • Утверждать о получении результата анализа возможно только после его завершения, однако при этом: • Лента МТ бесконечна ⇒ • Бесконечно множество неуязвимых конфигураций программы ⇒ • При анализе веток неуязвимых конфигураций, анализатор никогда не достигнет в них начального состояния ⇒ Анализ никогда не завершится, если программа неуязвима Физический смысл теоремы Райса
привычные человеку языковые идиомы, определяет потенциально опасные точки и выводит условия их успешной эксплуатации в терминах всё тех же идиом • Человек верифицирует полученные результаты, классифицируя все обнаруженные анализатором точки и подтверждая выполнимость условий эксплуатации
процессе вычисления алгоритма Для МТ конфигурацию составляют: • позиция считывателя на ленте; • содержимое ленты; • активное состояние. Для реального приложения, полным аналогом конфигурации МТ является состояние всех потоков данных, доступных в каждой точке потока управления. Поток вычисления (2/2)
аппроксимацию её исходной модели вычисления и разрешение её свойств»: • Построение семантических моделей: CFG, DFG, CPG и т.п. • Taint-анализ, анализ достигающих определений • Построение вычислительных моделей (CompFG, сети Петри и т.п) Абстрактная интерпретация
со знаком и формулами: (+a) = (+) (-a) = (-) (-a) * (+b) = (-) (-a) / (+b) = (-) (-a) + (+b) ∈ { a ≤ b ⇒ (+), a > b ⇒ (-) } И применим её: -42 / 8 * 100500 + x = x ≥ -527625 ⇒ (+), x < -527625 ⇒ (-) Опциональное множество -- множество, генерирующая/распознающая функция которого определяется истинностью заданных предикатов
собой в соответствии с графом потока управления • Каждая точка хранит информацию о предикативных состояниях всех доступных в ней переменных Поток вычисления приложения (1/2)
формулу достижимости состояния 2. Формулой, определяющей множество значений, соответствующее описываемому состоянию • Формулы конструируются путём подстановки конструкций кода в ходе его абстрактной интерпретации по семантике символьных вычислений • Формальная форма описания модели – граф потока вычисления Поток вычисления приложения (2/2)
значений входных данных по заданному состоянию; • определять состояние по заданному множеству значений входных данных • Для поиска по ней уязвимостей требуется конкретизация понятия "уязвимое состояние" в зависимости от рассматриваемого класса атак • Один из возможных подходов к конкретизации заключается в сопоставлении аргументов опасных операций со множествами значений возможных векторов атак Возможности модели
множеством векторов атак, актуальных для контекста заданной уязвимой точки выполнения • Для этого необходимо определить критерии состояния защищённости приложения в рамках исследуемого класса уязвимостей Дальнейшее развитие модели
02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); Точка входа a Граница окружения
02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); Точка входа a Точка входа b Граница окружения
b)) 01 var a = Request.Params["a"]; 02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); Точка входа a Точка входа b Граница окружения
b)) 01 var a = Request.Params["a"]; 02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); Точка входа a Точка входа b Граница окружения
02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); Точка входа a Точка входа b Точка выхода fpvo (ftransform (a, b)) Граница окружения Точка инъекции a
02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); Точка входа a Точка входа b Точка выхода fpvo (ftransform (a, b)) Граница окружения Точка инъекции a Точка инъекции b
лексического разбора любого возможного выходного потока данных, на каждую точку инъекции приходится не более одного токена Достаточный критерий защищённости от атак инъекций
атак инъекций тогда, когда в результате лексического разбора любого возможного потока выходных данных, множества токенов, приходящиеся на точки инъекции, являются авторизованными
Отсутствующими зависимостями? • Уравнениями, которые не смог решить SMT-солвер? • Некорректным кодом и любыми конструкциями, которые не смог распознать анализатор? • И т.п… «Неудобные» вопросы (1/2)
Отсутствующими зависимостями? • Уравнениями, которые не смог решить SMT-солвер? • Некорректным кодом и любыми конструкциями, которые не смог распознать анализатор? • И т.п… Просто отдадим их на верификацию пользователю! «Неудобные» вопросы (1/2)
с целью выявления уязвимостей и позволяющих получать воспроизводимые и верифицируемые результаты» Идеальный процесс статического анализа защищённости (2/5)
с целью выявления уязвимостей и позволяющих получать воспроизводимые и верифицируемые результаты» Идеальный процесс статического анализа защищённости (3/5)
с целью выявления уязвимостей и позволяющих получать воспроизводимые и верифицируемые результаты» Идеальный процесс статического анализа защищённости (4/5)
с целью выявления уязвимостей и позволяющих получать воспроизводимые и верифицируемые результаты» Идеальный процесс статического анализа защищённости (5/5)