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

60

Upload: vladimir-kochetkov

Post on 26-Jul-2015

786 views

Category:

Presentations & Public Speaking


1 download

TRANSCRIPT

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

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

Analysis/Team LeadPositive Technologies

Positive Hack Days V

Disclaimer

Кто мы?

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

Application Inspector― Жесткий dogfooding

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Injections Access Control

Buffer Overflow Session Management

Heap Overflow CSRFInteger Overflow Concurrency

Memory Management Domain(Logical)

… …

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

Symbolic Execution Context Graph!

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

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

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

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

Symbolic Execution Context Graph

ε �֜ {}

Symbolic Execution Context Graph

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

Symbolic Execution Context Graph

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

Symbolic Execution Context Graph

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

Symbolic Execution Context Graph

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

Symbolic Execution Context Graph

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

Symbolic Execution Context Graph

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

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 выводится…

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

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

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

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

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

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

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

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

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

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

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

<a href=" ">

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

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

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

Формула уязвимости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"] + "\">" )

Формула уязвимости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"] + "\">" ) В результате нахождения значений

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

м

м

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

Контекстный вектор атакиУязвимое выражение:"<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"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<a href='∅'>

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

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

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

Opening bracket: <

Tag name: a

Attribute definition

Attribute name: href

Assignment sign

2-quoted attr. value: Closing bracket: >

Строгое вычисление типа точки инъекции

2-quoted attribute (semantic: URL) value

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

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

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

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

Типизация

Типизация

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

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

Типизация

Санитизация

Санитизация

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

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

Санитизация

Валидация

Валидация

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

Валидация

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

√ Buffer Overflow

√ Heap Overflow

√ Integer Overflow

? Memory Management Attacks

? Access Control Attacks

? Session Fixation

? CSRF

x Race Conditions

x Domain(Logical) Attacks

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

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

{DEMO}

Вопросы?

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

[email protected]@kochetkov_v

Application Inspector/Compiling Applications Analysis/Team LeadPositive Technologies