Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

527 views

Published on

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

Published in: Technology
  • Be the first to comment

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

  1. 1. Автоматическая генерация патчей для уязвимого исходного кода Владимир Кочетков Application Inspector/Compiling Applications Analysis/Team Lead Positive Technologies Positive Hack Days V
  2. 2. Disclaimer
  3. 3. Кто мы?
  4. 4. Разработчики PT Application Inspector!
  5. 5. Application Inspector ― Жесткий dogfooding ― Анализ на пределе возможностей ?AST ― Генерация векторов атак ― Концепция «большой красной кнопки» ― Собственная разработка
  6. 6. Application Inspector ― Интеграция с PT Application Firewall (aka «виртуальные патчи») Но хочется большего…
  7. 7. Чего мы хотим?
  8. 8. Генерировать патчи для уязвимого кода!!
  9. 9. Как поймать уязвимость? ― Знать «как не должно быть»: необходимые и достаточные формальные признаки уязвимости ― Знать «как есть»: доказать наличие этих признаков в анализируемом коде ― Построить по множеству выявленных признаков вектор атаки
  10. 10. Формальные признаки инъекции ― Потенциально уязвимая операция PVO(text): операция прямой или косвенной интерпретации текста text на формальном языке ― text = transform(argument), где argument – элемент множества аргументов точки входа EP, а transform – функция промежуточных преобразований ― Существует и достижимо хотя бы одно множество таких значений элементов EP, при которых происходит изменение структуры синтаксического дерева значения text, достигающего PVO
  11. 11. Формализуемость уязвимостей к атакам Строго формализуемые Слабо формализуемые Injections Access Control Buffer Overflow Session Management Heap Overflow CSRF Integer Overflow Concurrency Memory Management Domain(Logical) … …
  12. 12. Что у нас есть?
  13. 13. Symbolic Execution Context Graph!
  14. 14. Disclaimer Только обзор. Подробности будут представлены на SIBECRYPT’15 Новосибирск, 7-12сентября 2015
  15. 15. Symbolic Execution Context Graph SECG – граф, изоморфный CFG и содержащий в каждом узле информацию о контексте символьного выполнения Контекст символьного выполнения – условие достижимости текущей точки выполнения + множества условных состояний всех объектов и переменных, достижимых в текущей области видимости
  16. 16. Symbolic Execution Context Graph ε {}
  17. 17. Symbolic Execution Context Graph ε { parm' { ε Request.Params["parm1"] } }
  18. 18. Symbolic Execution Context Graph Request.Params["cond1"] == "true" { parm' { ε Request.Params["parm1"] } }
  19. 19. Symbolic Execution Context Graph Request.Params["cond1"] != "true" { parm' { Request.Params["cond1"] != "true" Request.Params["parm1"] } }
  20. 20. Symbolic Execution Context Graph Request.Params["cond1"] != "true" && Request.Params["cond2"] == "true" { parm' { Request.Params["cond1"] != "true" Request.Params["parm1"] } }
  21. 21. Symbolic Execution Context Graph Request.Params["cond1"] != "true" && Request.Params["cond2"] != "true" { parm' { Request.Params["cond1"] != "true" Request.Params["parm1"] } }
  22. 22. Symbolic Execution Context Graph Request.Params["cond1"] != "true" { parm' { Request.Params["cond2"] == "true" Request.Params["parm2"] || Request.Params["cond2"] != "true" "<div>Harmless value</div>" } }
  23. 23. 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 выводится…
  24. 24. Формула уязвимости!
  25. 25. Формула уязвимости Request.Params["cond1"] != "true" ⇒ Response.Write( "<a href="" + parm ∈ { Request.Params["cond2"] == "true" ⇒ Request.Params["parm2"] ; Request.Params["cond2"] != "true" ⇒ "<div>Harmless value</div>" } + "">" )
  26. 26. Формула уязвимости Request.Params["cond1"] != "true" ⇒ Response.Write( "<a href="" + parm ∈ { Request.Params["cond2"] == "true" ⇒ Request.Params["parm2"] } + "">" )
  27. 27. Формула уязвимости Request.Params["cond1"] != "true" && Request.Params["cond2"] == "true" ⇒ Response.Write( "<a href="" + Request.Params["parm2"] + "">" )
  28. 28. Формула уязвимости Request.Params["cond1"] != "true" && Request.Params["cond2"] == "true" ⇒ Response.Write( "<a href="" + Request.Params["parm2"] + "">" ) Какое значение Request.Params["parm2"] приведет к выходу за пределы токена?
  29. 29. Определяемое типом точки инъекции!
  30. 30. <a href=" "> Тип точки инъекции вычисляется синтаксической эвристикой в результате прохода по уязвимому выражению в обе стороны от нее Вычисление типа точки инъекции
  31. 31. Формула уязвимости 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"] + "">" )
  32. 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"] + "">" ) В результате нахождения значений неизвестных в условии формулы уязвимости строится… м м
  33. 33. Контекстный вектор атаки!
  34. 34. Контекстный вектор атаки Уязвимое выражение: "<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"
  35. 35. Чего у нас нет?
  36. 36. В SECG есть все, что нам нужно!* * и все, что пока не нужно – тоже есть
  37. 37. Правильный патч ― Вносит минимум изменений ― Сохраняет семантику кода ― Решает проблему ― Не создает новых
  38. 38. ― Знать «как не должно быть»: необходимые и достаточные формальные признаки уязвимости ― Знать «как есть»: доказать наличие этих признаков в анализируемом коде ― Изменив код, устранить хотя бы один из необходимых признаков Как сгенерировать патч?
  39. 39. Устраняемые признаки инъекции ― Потенциально-уязвимая операция PVO(text): операция прямой или косвенной интерпретации текста text на формальном языке ― text = transform(argument), где argument – элемент множества аргументов точки входа EP, а transform – функция промежуточных преобразований ― Существует и достижимо хотя бы одно множество таких значений элементов EP, при которых происходит изменение структуры синтаксического дерева значения text, достигающего PVO
  40. 40. Способы устранения инъекции http://www.slideshare.net/kochetkov.vladimir/how-to-develop- a-secure-web-application-and-stay-in-mind-phdays-3/87 • Типизация • Валидация • Санитизация
  41. 41. Вектор атаки vs патч Вектор атаки Патч Достаточно найти один путь от точки входа до PVO и один набор значений векторных переменных Необходимо найти все пути от точки входа до PVO и все множество наборов значений векторных переменных Тип точки инъекции может быть вычислен эвристикой Тип точки инъекции должен быть вычислен строго наряду с ее семантикой Работоспособность приложения может быть нарушена Приложение должно оставаться работоспособным
  42. 42. Строгое вычисление типа точки инъекции Шаг #1: подставляем в уязвимое выражение вместо каждого taint-источника уникальный спецсимвол: <a href='∅'> Шаг #2: разбираем строку модифицированным парсером островного языка, допускающем появление спецсимвола в произвольном токене. Шаг#3: Ищем в дереве разбора узлы, содержащие спецсимвол, и по их типу определяем тип точки инъекции. Шаг#4: По типу точки инъекции определяем ее семантику.
  43. 43. Opening bracket: < Tag name: a Attribute definition Attribute name: href Assignment sign 2-quoted attr. value:Closing bracket: > Строгое вычисление типа точки инъекции 2-quoted attribute (semantic: URL) value
  44. 44. Сохранение семантики кода - Приоритет контрмер: 1) Типизация 2) Санитизация 3) Валидация - Учет всех условий достижимости PVO и значений ее аргументов при типизации и санитизации - Применение контрмеры точно в месте возникновения уязвимости
  45. 45. Типизация
  46. 46. Типизация 2-quoted attribute (semantic: URL) value - типизация возможна Запись в parm опасного значения
  47. 47. Типизация
  48. 48. Санитизация
  49. 49. Санитизация Text (semantic: TEXT) value - типизация невозможна, возможна санитизация Запись в parm опасного значения
  50. 50. Санитизация
  51. 51. Валидация
  52. 52. Валидация Типизация и санитизация невозможны, возможна валидация
  53. 53. Валидация
  54. 54. Патчи для прочих классов атак? √ Injections √ Buffer Overflow √ Heap Overflow √ Integer Overflow ? Memory Management Attacks ? Access Control Attacks ? Session Fixation ? CSRF x Race Conditions x Domain(Logical) Attacks
  55. 55. Когда мы хотим?
  56. 56. Прямо сейчас!!!
  57. 57. {DEMO}
  58. 58. Вопросы? Владимир Кочетков vkochetkov@ptsecurity.com @kochetkov_v Application Inspector/Compiling Applications Analysis/Team Lead Positive Technologies

×