Top Banner
60

Автоматическая генерация патчей для уязвимого исходного кода

Jul 26, 2015

Download

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Автоматическая генерация патчей для уязвимого исходного кода
Page 2: Автоматическая генерация патчей для уязвимого исходного кода

Автоматическая генерация патчей для уязвимого исходного кода

Владимир КочетковApplication Inspector/Compiling Applications

Analysis/Team LeadPositive Technologies

Positive Hack Days V

Page 3: Автоматическая генерация патчей для уязвимого исходного кода

Disclaimer

Page 4: Автоматическая генерация патчей для уязвимого исходного кода

Кто мы?

Page 5: Автоматическая генерация патчей для уязвимого исходного кода

Разработчики PT Application Inspector!

Page 6: Автоматическая генерация патчей для уязвимого исходного кода

Application Inspector― Жесткий dogfooding

― Анализ на пределе возможностей ?AST

― Генерация векторов атак

― Концепция «большой красной кнопки»

― Собственная разработка

Page 7: Автоматическая генерация патчей для уязвимого исходного кода

Application Inspector― Интеграция с PT Application Firewall (aka

«виртуальные патчи»)

Но хочется большего…

Page 8: Автоматическая генерация патчей для уязвимого исходного кода

Чего мы хотим?

Page 9: Автоматическая генерация патчей для уязвимого исходного кода

Генерировать патчи для уязвимого кода!!

Page 10: Автоматическая генерация патчей для уязвимого исходного кода

Как поймать уязвимость?― Знать «как не должно быть»: необходимые и

достаточные формальные признаки уязвимости

― Знать «как есть»: доказать наличие этих признаков в анализируемом коде

― Построить по множеству выявленных признаков вектор атаки

Page 11: Автоматическая генерация патчей для уязвимого исходного кода

Формальные признаки инъекции― Потенциально уязвимая операция PVO(text):

операция прямой или косвенной интерпретации текста text на формальном языке

― text = transform(argument), где argument – элемент множества аргументов точки входа EP, а transform – функция промежуточных преобразований

― Существует и достижимо хотя бы одно множество таких значений элементов EP, при которых происходит изменение структуры синтаксического дерева значения text, достигающего PVO

Page 12: Автоматическая генерация патчей для уязвимого исходного кода

Формализуемость уязвимостей к атакам

Строго формализуемые Слабо формализуемые

Injections Access Control

Buffer Overflow Session Management

Heap Overflow CSRFInteger Overflow Concurrency

Memory Management Domain(Logical)

… …

Page 13: Автоматическая генерация патчей для уязвимого исходного кода

Что у нас есть?

Page 14: Автоматическая генерация патчей для уязвимого исходного кода

Symbolic Execution Context Graph!

Page 15: Автоматическая генерация патчей для уязвимого исходного кода

DisclaimerТолько обзор. Подробности будут представлены на

SIBECRYPT’15Новосибирск, 7-12сентября 2015

Page 16: Автоматическая генерация патчей для уязвимого исходного кода

Symbolic Execution Context GraphSECG – граф, изоморфный CFG и содержащий в каждом узле информацию о контексте символьного выполнения

Контекст символьного выполнения – условие достижимости текущей точки выполнения + множества условных состояний всех объектов и переменных, достижимых в текущей области видимости

Page 17: Автоматическая генерация патчей для уязвимого исходного кода

Symbolic Execution Context Graph

ε �֜ {}

Page 18: Автоматическая генерация патчей для уязвимого исходного кода

Symbolic Execution Context Graph

ε �֜ { parm' א { ε �֜ Request.Params["parm1"] } }

Page 19: Автоматическая генерация патчей для уязвимого исходного кода

Symbolic Execution Context Graph

Request.Params["cond1"] == "true" �֜ { parm' א { ε �֜ Request.Params["parm1"] } }

Page 20: Автоматическая генерация патчей для уязвимого исходного кода

Symbolic Execution Context Graph

Request.Params["cond1"] != "true" �֜ { parm' א { Request.Params["cond1"] != "true" �֜ Request.Params["parm1"] } }

Page 21: Автоматическая генерация патчей для уязвимого исходного кода

Symbolic Execution Context Graph

Request.Params["cond1"] != "true" && Request.Params["cond2"] == "true" �֜ { parm' א { Request.Params["cond1"] != "true" �֜ Request.Params["parm1"] } }

Page 22: Автоматическая генерация патчей для уязвимого исходного кода

Symbolic Execution Context Graph

Request.Params["cond1"] != "true" && Request.Params["cond2"] != "true" �֜ { parm' א { Request.Params["cond1"] != "true" �֜ Request.Params["parm1"] } }

Page 23: Автоматическая генерация патчей для уязвимого исходного кода

Symbolic Execution Context Graph

Request.Params["cond1"] != "true" �֜ { parm' א { Request.Params["cond2"] == "true" �֜ Request.Params["parm2"] || Request.Params["cond2"] != "true" �֜ "<div>Harmless value</div>" } }

Page 24: Автоматическая генерация патчей для уязвимого исходного кода

Request.Params["cond1"] != "true" �֜ { parm' א { Request.Params["cond2"] == "true" �֜ Request.Params["parm2"] || Request.Params["cond2"] != "true" �֜ "<div>Harmless value</div>" } }

Symbolic Execution Context Graph

По SECG для каждой PVO выводится…

Page 25: Автоматическая генерация патчей для уязвимого исходного кода

Формула уязвимости!

Page 26: Автоматическая генерация патчей для уязвимого исходного кода

Формула уязвимостиRequest.Params["cond1"] != "true" ⇒

Response.Write( "<a href=\"" + parm ∈ { Request.Params["cond2"] == "true" ⇒ Request.Params["parm2"] ; Request.Params["cond2"] != "true" ⇒ "<div>Harmless value</div>" } + "\">" )

Page 27: Автоматическая генерация патчей для уязвимого исходного кода

Формула уязвимостиRequest.Params["cond1"] != "true" ⇒

Response.Write( "<a href=\"" + parm ∈ { Request.Params["cond2"] == "true" ⇒ Request.Params["parm2"] } + "\">" )

Page 28: Автоматическая генерация патчей для уязвимого исходного кода

Формула уязвимостиRequest.Params["cond1"] != "true"&&Request.Params["cond2"] == "true" ⇒

Response.Write( "<a href=\"" + Request.Params["parm2"] + "\">" )

Page 29: Автоматическая генерация патчей для уязвимого исходного кода

Формула уязвимостиRequest.Params["cond1"] != "true"&&Request.Params["cond2"] == "true" ⇒

Response.Write( "<a href=\"" + Request.Params["parm2"] + "\">" )

Какое значение Request.Params["parm2"] приведет к выходу за пределы токена?

Page 30: Автоматическая генерация патчей для уязвимого исходного кода

Определяемое типом точки инъекции!

Page 31: Автоматическая генерация патчей для уязвимого исходного кода

<a href=" ">

Тип точки инъекции вычисляется синтаксической эвристикой в результате прохода по уязвимому

выражению в обе стороны от нее

Вычисление типа точки инъекции

Page 32: Автоматическая генерация патчей для уязвимого исходного кода

Формула уязвимостиRequest.Params["cond1"] != "true"&&Request.Params["cond2"] == "true" &&(Request.Params["parm2"] == "\"><script>alert(0)</script>" || Request.Params["parm2"] == "\"onmouseover=\"alert(0)") ⇒

Response.Write( "<a href=\"" + Request.Params["parm2"] + "\">" )

Page 33: Автоматическая генерация патчей для уязвимого исходного кода

Формула уязвимостиRequest.Params["cond1"] != "true"&&Request.Params["cond2"] == "true" &&(Request.Params["parm2"] == "\"><script>alert(0)</script>" || Request.Params["parm2"] == "\"onmouseover=\"alert(0)") ⇒

Response.Write( "<a href=\"" + Request.Params["parm2"] + "\">" ) В результате нахождения значений

неизвестных в условии формулы уязвимости строится…

м

м

Page 34: Автоматическая генерация патчей для уязвимого исходного кода

Контекстный вектор атаки!

Page 35: Автоматическая генерация патчей для уязвимого исходного кода

Контекстный вектор атакиУязвимое выражение:"<a href=\"" + Request.Params["parm2"] + "\">"

Тип точки инъекции:HTML: 2-quoted attribute value

Векторные переменные:Request.Params["parm2"] = "\"><script>alert(0)</script>"

Условные переменные:Request.Params["cond1"] = "__AI_akhivldp"Request.Params["cond2"] = "true"

Page 36: Автоматическая генерация патчей для уязвимого исходного кода

Чего у нас нет?

Page 37: Автоматическая генерация патчей для уязвимого исходного кода

В SECG есть все, что нам нужно!*

* и все, что пока не нужно – тоже есть

Page 38: Автоматическая генерация патчей для уязвимого исходного кода

Правильный патч

― Вносит минимум изменений

― Сохраняет семантику кода

― Решает проблему

― Не создает новых

Page 39: Автоматическая генерация патчей для уязвимого исходного кода

― Знать «как не должно быть»: необходимые и достаточные формальные признаки уязвимости

― Знать «как есть»: доказать наличие этих признаков в анализируемом коде

― Изменив код, устранить хотябы один из необходимыхпризнаков

Как сгенерировать патч?

Page 40: Автоматическая генерация патчей для уязвимого исходного кода

Устраняемые признаки инъекции― Потенциально-уязвимая операция PVO(text):

операция прямой или косвенной интерпретации текста text на формальном языке

― text = transform(argument), где argument – элемент множества аргументов точки входа EP, а transform – функция промежуточных преобразований

― Существует и достижимо хотя бы одно множество таких значений элементов EP, при которых происходит изменение структуры синтаксического дерева значения text, достигающего PVO

Page 42: Автоматическая генерация патчей для уязвимого исходного кода

Вектор атаки vs патчВектор атаки Патч

Достаточно найти один путь от точки входа до PVO и один набор значений векторных переменных

Необходимо найти все пути от точки входа до PVO и все множество наборов значений векторных переменных

Тип точки инъекции может быть вычислен эвристикой

Тип точки инъекции должен быть вычислен строго наряду с ее семантикой

Работоспособность приложения может быть нарушена

Приложение должно оставаться работоспособным

Page 43: Автоматическая генерация патчей для уязвимого исходного кода

Строгое вычисление типа точки инъекцииШаг #1: подставляем в уязвимое выражение вместо каждого taint-источника уникальный спецсимвол:

<a href='∅'>

Шаг #2: разбираем строку модифицированным парсером островного языка, допускающем появление спецсимвола в произвольном токене.

Шаг#3: Ищем в дереве разбора узлы, содержащие спецсимвол, и по их типу определяем тип точки инъекции.

Шаг#4: По типу точки инъекции определяем ее семантику.

Page 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

Page 45: Автоматическая генерация патчей для уязвимого исходного кода

Сохранение семантики кода- Приоритет контрмер:

1) Типизация2) Санитизация3) Валидация

- Учет всех условий достижимости PVO и значений ее аргументов при типизации и санитизации

- Применение контрмеры точно в месте возникновения уязвимости

Page 46: Автоматическая генерация патчей для уязвимого исходного кода

Типизация

Page 47: Автоматическая генерация патчей для уязвимого исходного кода

Типизация

2-quoted attribute(semantic: URL) value- типизация возможна

Запись в parm опасногозначения

Page 48: Автоматическая генерация патчей для уязвимого исходного кода

Типизация

Page 49: Автоматическая генерация патчей для уязвимого исходного кода

Санитизация

Page 50: Автоматическая генерация патчей для уязвимого исходного кода

Санитизация

Text(semantic: TEXT) value- типизация невозможна,возможна санитизация

Запись в parm опасногозначения

Page 51: Автоматическая генерация патчей для уязвимого исходного кода

Санитизация

Page 52: Автоматическая генерация патчей для уязвимого исходного кода

Валидация

Page 53: Автоматическая генерация патчей для уязвимого исходного кода

Валидация

Типизация и санитизацияневозможны, возможнавалидация

Page 54: Автоматическая генерация патчей для уязвимого исходного кода

Валидация

Page 55: Автоматическая генерация патчей для уязвимого исходного кода

Патчи для прочих классов атак?√ Injections

√ Buffer Overflow

√ Heap Overflow

√ Integer Overflow

? Memory Management Attacks

? Access Control Attacks

? Session Fixation

? CSRF

x Race Conditions

x Domain(Logical) Attacks

Page 56: Автоматическая генерация патчей для уязвимого исходного кода

Когда мы хотим?

Page 57: Автоматическая генерация патчей для уязвимого исходного кода

Прямо сейчас!!!

Page 58: Автоматическая генерация патчей для уязвимого исходного кода

{DEMO}

Page 59: Автоматическая генерация патчей для уязвимого исходного кода

Вопросы?

Владимир Кочетков

[email protected]@kochetkov_v

Application Inspector/Compiling Applications Analysis/Team LeadPositive Technologies

Page 60: Автоматическая генерация патчей для уязвимого исходного кода