Автоматическая генерация патчей для уязвимого...
TRANSCRIPT
Автоматическая генерация патчей для уязвимого исходного кода
Владимир КочетковApplication Inspector/Compiling Applications
Analysis/Team LeadPositive Technologies
Positive Hack Days V
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)
… …
DisclaimerТолько обзор. Подробности будут представлены на
SIBECRYPT’15Новосибирск, 7-12сентября 2015
Symbolic Execution Context GraphSECG – граф, изоморфный CFG и содержащий в каждом узле информацию о контексте символьного выполнения
Контекст символьного выполнения – условие достижимости текущей точки выполнения + множества условных состояний всех объектов и переменных, достижимых в текущей области видимости
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"
Правильный патч
― Вносит минимум изменений
― Сохраняет семантику кода
― Решает проблему
― Не создает новых
― Знать «как не должно быть»: необходимые и достаточные формальные признаки уязвимости
― Знать «как есть»: доказать наличие этих признаков в анализируемом коде
― Изменив код, устранить хотябы один из необходимыхпризнаков
Как сгенерировать патч?
Устраняемые признаки инъекции― Потенциально-уязвимая операция PVO(text):
операция прямой или косвенной интерпретации текста text на формальном языке
― text = transform(argument), где argument – элемент множества аргументов точки входа EP, а transform – функция промежуточных преобразований
― Существует и достижимо хотя бы одно множество таких значений элементов EP, при которых происходит изменение структуры синтаксического дерева значения text, достигающего PVO
Способы устранения инъекцииhttp://www.slideshare.net/kochetkov.vladimir/how-to-develop-a-secure-web-application-and-stay-in-mind-phdays-3/87
• Типизация
• Валидация
• Санитизация
Вектор атаки 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
Вопросы?
Владимир Кочетков
[email protected]@kochetkov_v
Application Inspector/Compiling Applications Analysis/Team LeadPositive Technologies