How to Develop a Secure Web Application and Stay in Mind? (PHDays 3)
Автоматическая генерация патчей для уязвимого исходного кода
1.
2. Автоматическая генерация
патчей для уязвимого
исходного кода
Владимир Кочетков
Application Inspector/Compiling Applications Analysis/Team Lead
Positive Technologies
Positive Hack Days V
10. Как поймать уязвимость?
― Знать «как не должно быть»: необходимые и достаточные
формальные признаки уязвимости
― Знать «как есть»: доказать наличие этих признаков в
анализируемом коде
― Построить по множеству
выявленных признаков
вектор атаки
11. Формальные признаки инъекции
― Потенциально уязвимая операция PVO(text): операция
прямой или косвенной интерпретации текста text на
формальном языке
― text = transform(argument), где argument – элемент
множества аргументов точки входа EP, а transform –
функция промежуточных преобразований
― Существует и достижимо хотя бы одно множество таких
значений элементов EP, при которых происходит
изменение структуры синтаксического дерева значения
text, достигающего PVO
12. Формализуемость уязвимостей к атакам
Строго формализуемые Слабо формализуемые
Injections Access Control
Buffer Overflow Session Management
Heap Overflow CSRF
Integer Overflow Concurrency
Memory Management Domain(Logical)
… …
16. Symbolic Execution Context Graph
SECG – граф, изоморфный CFG и
содержащий в каждом узле
информацию о контексте
символьного выполнения
Контекст символьного выполнения
– условие достижимости текущей
точки выполнения + множества
условных состояний всех объектов и
переменных, достижимых в текущей
области видимости
31. <a href=" ">
Тип точки инъекции вычисляется синтаксической эвристикой
в результате прохода по уязвимому выражению в обе
стороны от нее
Вычисление типа точки инъекции
37. В SECG есть все, что нам
нужно!*
* и все, что пока не нужно – тоже есть
38. Правильный патч
― Вносит минимум изменений
― Сохраняет семантику кода
― Решает проблему
― Не создает новых
39. ― Знать «как не должно быть»: необходимые и достаточные
формальные признаки уязвимости
― Знать «как есть»: доказать наличие этих признаков в
анализируемом коде
― Изменив код, устранить хотя
бы один из необходимых
признаков
Как сгенерировать патч?
40. Устраняемые признаки инъекции
― Потенциально-уязвимая операция PVO(text): операция
прямой или косвенной интерпретации текста text на
формальном языке
― text = transform(argument), где argument – элемент
множества аргументов точки входа EP, а transform –
функция промежуточных преобразований
― Существует и достижимо хотя бы одно множество таких
значений элементов EP, при которых происходит
изменение структуры синтаксического дерева значения
text, достигающего PVO
42. Вектор атаки vs патч
Вектор атаки Патч
Достаточно найти один путь
от точки входа до PVO и
один набор значений
векторных переменных
Необходимо найти все пути
от точки входа до PVO и все
множество наборов
значений векторных
переменных
Тип точки инъекции может
быть вычислен эвристикой
Тип точки инъекции должен
быть вычислен строго
наряду с ее семантикой
Работоспособность
приложения может быть
нарушена
Приложение должно
оставаться
работоспособным
43. Строгое вычисление типа точки инъекции
Шаг #1: подставляем в уязвимое выражение вместо каждого
taint-источника уникальный спецсимвол:
<a href='∅'>
Шаг #2: разбираем строку модифицированным парсером
островного языка, допускающем появление спецсимвола в
произвольном токене.
Шаг#3: Ищем в дереве разбора узлы, содержащие
спецсимвол, и по их типу определяем тип точки инъекции.
Шаг#4: По типу точки инъекции определяем ее семантику.
44. Opening bracket: <
Tag name: a
Attribute definition
Attribute name: href
Assignment sign
2-quoted attr. value:Closing bracket: >
Строгое вычисление типа точки инъекции
2-quoted attribute (semantic: URL) value
45. Сохранение семантики кода
- Приоритет контрмер:
1) Типизация
2) Санитизация
3) Валидация
- Учет всех условий достижимости PVO и значений ее
аргументов при типизации и санитизации
- Применение контрмеры точно в месте возникновения
уязвимости