Positive Technologies • Appsec- и CS-исследователь (формальные методы анализа и защиты приложений) • Организатор Positive Development User Group Контакты: [email protected] https://twitter.com/kochetkov_v https://kochetkov.github.io
Тьюринга состоит из: • бесконечной ячеистой ленты; • управляющего устройства с конечным числом состояний; • таблицы переходов между состояниями. На каждой итерации может: • изменить текущую ячейку; • перейти в другое состояние; • переместиться на соседнюю ячейку.
множество состояний; Γ - конечное непустое множество символов алфавита; b∈Γ - пустой символ; Σ⊆Γ∖b - множество входных символов; q0∈Q - начальное состояние; F⊆Q - множество финальных состояний; δ:Q∖F×Γ → Q×Γ×{L,R} - функция перехода, где: L - сдвиг по ленте влево R - сдвиг по ленте вправо
(_ → q0) halt _ # 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
после остановки анализатора • Лента МТ бесконечна ⇒ бесконечно множество неуязвимых конфигураций программы • При анализе веток неуязвимых конфигураций, анализатор никогда не достигнет начального состояния • Анализатор никогда не остановится, если программа неуязвима
foundations are bound to be nearly useless for generalized, real-world software engineering… Michal Zalewski, "The Tangled Web" В любой непонятной ситуации – аппроксимируй модель!
конфигураций МТ в процессе вычисления алгоритма Для МТ конфигурацию составляют: • позиция считывателя на ленте; • содержимое ленты; • активное состояние. Для реального приложения, полным аналогом конфигурации МТ является состояние всех потоков данных, доступных в каждой точке потока управления.
выполнения, связанных между собой в соответствии с графом потока управления • Каждая точка хранит информацию о предикативных состояниях всех доступных в ней переменных • Предикативное состояние описывается парой элементов: 1. Предикатом, описывающим формулу достижимости состояния 2. Формулой, определяющей множество значений, соответствующее описываемому состоянию • Формулы конструируются путём подстановки фрагментов кода при абстрактной интерпретации в семантике символьных вычислений • Формальная форма описания модели – граф потока вычисления
разрешать элементы множества значений входных данных по заданному состоянию; • определять состояние по заданному множеству значений входных данных • Для моделирования уязвимостей по ней требуется конкретизация понятия "уязвимое состояние" в зависимости от рассматриваемого класса атак • Один из возможных подходов к конкретизации заключается в сопоставлении аргументов опасных операций со множествами значений возможных эксплоитов
перехода от конечных множеств возможных эксплоитов к бесконечным • Для этого необходимо определить критерии состояния защищённости в рамках исследуемого класса уязвимостей
= 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 Граница окружения Модель уязвимого приложения (3/7)
= 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 Граница окружения Модель уязвимого приложения (4/7)
= 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 Граница окружения Модель уязвимого приложения (5/7)
= 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)) Граница окружения Модель уязвимого приложения (6/7) Точка инъекции a
= 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)) Граница окружения Модель уязвимого приложения (7/7) Точка инъекции a Точка инъекции b
лексического разбора любого возможного выходного потока данных, на каждую точку инъекции приходится не более одного токена Достаточный критерий защищённости от атак инъекций
лексического разбора любого возможного потока выходных данных, множества токенов, приходящиеся на точки инъекции, являются авторизованными Необходимый критерий защищённости от атак инъекций
потока вычисления приложения и передаёт её WAF'у • WAF, при обработке каждого HTTP-запроса, подставляет его параметры в формулы модели, вычисляет значения её состояний и анализирует их по необходимому или достаточному критерию
рассмотренную модель и позволяющая разработчикам: • полностью автоматизировать защиту от атак инъекций по достаточному критерию; • реализовывать защиту по необходимому критерию. libprotection.org playground.libprotection.org (ждём байпассов ☺) Что такое LibProtection
и интерполированные строки • Штатная защита кода там, где форматные строки или интерполяция неизбежны Что, если скрестить LibProtection и статанализатор? ;)