Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Идеальный статический анализ

Идеальный статический анализ

Доклад Владимира Кочеткова (Positive Technologies) для PDUG-секции на PHDays 8.

More Decks by Positive Development User Group

Other Decks in Technology

Transcript

  1. Заголовок ptsecurity.com Идеальный статический анализ Positive Technologies Владимир Кочетков

  2. Заголовок 2 • Руководитель отдела исследований по анализу защищённости приложений

    в Positive Technologies (в любой непонятной ситуации пишем статанализаторы ) • Appsec- и CS-исследователь в области формальных методов анализа и защиты приложений • Активный участник и организатор Positive Development User Group Контакты: vkochetkov@ptsecurity.com about.me/vladimir.kochetkov :~$ whoami
  3. Заголовок 3 Пофантазируем… на тему статического анализа?

  4. Заголовок 4 • Машина или человек? • Эталонные формальные модели?

    • Уязвимости или недостатки? • Какого цвета ящик? • Результаты анализа? Непростые вопросы (1/6)
  5. Заголовок 5 • Машина или человек? – Киборг • Эталонные

    формальные модели? • Уязвимости или недостатки? • Какого цвета ящик? • Результаты анализа? Непростые вопросы (2/6)
  6. Заголовок 6 • Машина или человек? – Киборг • Эталонные

    формальные модели? – Нет • Уязвимости или недостатки? • Какого цвета ящик? • Результаты анализа? Непростые вопросы (3/6)
  7. Заголовок 7 • Машина или человек? – Киборг • Эталонные

    формальные модели? – Нет • Уязвимости или недостатки? – Уязвимости • Какого цвета ящик? • Результаты анализа? Непростые вопросы (4/6)
  8. Заголовок 8 • Машина или человек? – Киборг • Эталонные

    формальные модели? – Нет • Уязвимости или недостатки? – Уязвимости • Какого цвета ящик? – Белый в серую крапинку • Результаты анализа? Непростые вопросы (5/6)
  9. Заголовок 9 • Машина или человек? – Киборг • Эталонные

    формальные модели? – Нет • Уязвимости или недостатки? – Уязвимости • Какого цвета ящик? – Белый в серую крапинку • Результаты анализа? – Воспроизводимые и верифицируемые Непростые вопросы (6/6)
  10. Заголовок 10 «Последовательность действий, как анализатора, так и его оператора,

    направленных на исследование исключительно исходного кода приложения с целью выявления уязвимостей и позволяющих получать воспроизводимые и верифицируемые результаты» Идеальный процесс статического анализа защищённости (1/2)
  11. Заголовок 11 Скажете, невозможно?

  12. Заголовок 12 Кто круче анализирует код: человек или машина?

  13. Машина?

  14. Заголовок analyzer_code = """ n = … # n∈ℕ def

    analyze(code, data): while n: print(n) n -= 1 if not vulnerable(code, data): # given configuration is secure vulnerable_function_call() else: # given configuration is vulnerable """ eval(analyzer_code) analyze(analyzer_code, analyzer_code) Вездесущая теорема Райса
  15. Заголовок • «Это лишь теория, рассматривающая общий случай» • «Достаточно

    покрыть нужное количество частных случаев» • «Реальные компьютеры имеют ограниченную память, а потому программы для них эквивалентны конечным автоматам, а не машинам Тьюринга» • Каков «физический» смысл теоремы Райса? «Контраргументы»
  16. Заголовок 16 Поиграем в машину Тьюринга?

  17. Заголовок 17 Машина Тьюринга Математическая абстракция, представляющая универсальную вычислительную машину.

    Машина Тьюринга состоит из: • бесконечной ячеистой ленты; • управляющего устройства с конечным числом состояний; • таблицы переходов между состояниями. На каждой итерации может: • изменить текущую ячейку; • перейти в другое состояние; • переместиться на соседнюю ячейку.
  18. Заголовок 18 Реализация фильтрующей функции на МТ (1/18) _ #

    A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 A B
  19. Заголовок 19 Реализация фильтрующей функции на МТ (2/18) (q1 A)

    ⇒ (A → q1) _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 A B
  20. Заголовок 20 Реализация фильтрующей функции на МТ (3/18) (q1 A)

    ⇒ (A → q1) (q1 B) ⇒ (B → q1) _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 A B
  21. Заголовок 21 Реализация фильтрующей функции на МТ (4/18) (q1 A)

    ⇒ (A → q1) (q1 B) ⇒ (B → q1) (q1 _) ⇒ (# • q2) _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 A B #
  22. Заголовок 22 Реализация фильтрующей функции на МТ (5/18) (q1 A)

    ⇒ (A → q1) (q1 B) ⇒ (B → q1) (q1 _) ⇒ (# • q2) (q2 #) ⇒ (# ← q2) _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 A B #
  23. Заголовок 23 Реализация фильтрующей функции на МТ (6/18) (q1 A)

    ⇒ (A → q1) (q1 B) ⇒ (B → q1) (q1 _) ⇒ (# • q2) (q2 #) ⇒ (# ← q2) (q2 B) ⇒ (B ← q2) _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 A B #
  24. Заголовок 24 Реализация фильтрующей функции на МТ (7/18) (q1 A)

    ⇒ (A → q1) (q1 B) ⇒ (B → q1) (q1 _) ⇒ (# • q2) (q2 #) ⇒ (# ← q2) (q2 B) ⇒ (B ← q2) (q2 A) ⇒ (A ← q2) _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 A B #
  25. Заголовок 25 Реализация фильтрующей функции на МТ (8/18) (q1 A)

    ⇒ (A → q1) (q1 B) ⇒ (B → q1) (q1 _) ⇒ (# • q2) (q2 #) ⇒ (# ← q2) (q2 B) ⇒ (B ← q2) (q2 A) ⇒ (A ← q2) (q2 _) ⇒ (_ → q3) _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 A B #
  26. Заголовок 26 Реализация фильтрующей функции на МТ (9/18) (q1 A)

    ⇒ (A → q1) (q1 B) ⇒ (B → q1) (q1 _) ⇒ (# • q2) (q2 #) ⇒ (# ← q2) (q2 B) ⇒ (B ← q2) (q2 A) ⇒ (A ← q2) (q2 _) ⇒ (_ → q3) (q3 A) ⇒ (_ → q3) _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 A B #
  27. Заголовок 27 Реализация фильтрующей функции на МТ (10/18) (q1 A)

    ⇒ (A → q1) (q1 B) ⇒ (B → q1) (q1 _) ⇒ (# • q2) (q2 #) ⇒ (# ← q2) (q2 B) ⇒ (B ← q2) (q2 A) ⇒ (A ← q2) (q2 _) ⇒ (_ → q3) (q3 A) ⇒ (_ → q3) (q3 B) ⇒ (_ → q4) _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 B #
  28. Заголовок 28 Реализация фильтрующей функции на МТ (11/18) (q1 A)

    ⇒ (A → q1) (q1 B) ⇒ (B → q1) (q1 _) ⇒ (# • q2) (q2 #) ⇒ (# ← q2) (q2 B) ⇒ (B ← q2) (q2 A) ⇒ (A ← q2) (q2 _) ⇒ (_ → q3) (q3 A) ⇒ (_ → q3) (q3 B) ⇒ (_ → q4) (q4 #) ⇒ (# → q4) _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 #
  29. Заголовок 29 Реализация фильтрующей функции на МТ (12/18) (q1 A)

    ⇒ (A → q1) (q1 B) ⇒ (B → q1) (q1 _) ⇒ (# • q2) (q2 #) ⇒ (# ← q2) (q2 B) ⇒ (B ← q2) (q2 A) ⇒ (A ← q2) (q2 _) ⇒ (_ → q3) (q3 A) ⇒ (_ → q3) (q3 B) ⇒ (_ → q4) (q4 #) ⇒ (# → q4) (q4 _) ⇒ (B • q2) _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 #
  30. Заголовок 30 Реализация фильтрующей функции на МТ (13/18) (q1 A)

    ⇒ (A → q1) (q1 B) ⇒ (B → q1) (q1 _) ⇒ (# • q2) (q2 #) ⇒ (# ← q2) (q2 B) ⇒ (B ← q2) (q2 A) ⇒ (A ← q2) (q2 _) ⇒ (_ → q3) (q3 A) ⇒ (_ → q3) (q3 B) ⇒ (_ → q4) (q4 #) ⇒ (# → q4) (q4 _) ⇒ (B • q2) (q2 B) ⇒ (B ← q2) _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 # B
  31. Заголовок 31 Реализация фильтрующей функции на МТ (14/18) (q1 A)

    ⇒ (A → q1) (q1 B) ⇒ (B → q1) (q1 _) ⇒ (# • q2) (q2 #) ⇒ (# ← q2) (q2 B) ⇒ (B ← q2) (q2 A) ⇒ (A ← q2) (q2 _) ⇒ (_ → q3) (q3 A) ⇒ (_ → q3) (q3 B) ⇒ (_ → q4) (q4 #) ⇒ (# → q4) (q4 _) ⇒ (B • q2) (q2 B) ⇒ (B ← q2) (q2 #) ⇒ (# ← q2) _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 # B
  32. Заголовок 32 Реализация фильтрующей функции на МТ (15/18) (q1 A)

    ⇒ (A → q1) (q1 B) ⇒ (B → q1) (q1 _) ⇒ (# • q2) (q2 #) ⇒ (# ← q2) (q2 B) ⇒ (B ← q2) (q2 A) ⇒ (A ← q2) (q2 _) ⇒ (_ → q3) (q3 A) ⇒ (_ → q3) (q3 B) ⇒ (_ → q4) (q4 #) ⇒ (# → q4) (q4 _) ⇒ (B • q2) (q2 B) ⇒ (B ← q2) (q2 #) ⇒ (# ← q2) (q2 _) ⇒ (_ → q3) _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 # B
  33. Заголовок 33 Реализация фильтрующей функции на МТ (16/18) (q1 A)

    ⇒ (A → q1) (q1 B) ⇒ (B → q1) (q1 _) ⇒ (# • q2) (q2 #) ⇒ (# ← q2) (q2 B) ⇒ (B ← q2) (q2 A) ⇒ (A ← q2) (q2 _) ⇒ (_ → q3) (q3 A) ⇒ (_ → q3) (q3 B) ⇒ (_ → q4) (q4 #) ⇒ (# → q4) (q4 _) ⇒ (B • q2) (q2 B) ⇒ (B ← q2) (q2 #) ⇒ (# ← q2) (q2 _) ⇒ (_ → q3) (q3 #) ⇒ (_ • q3) _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 # B
  34. Заголовок 34 Реализация фильтрующей функции на МТ (17/18) (q1 A)

    ⇒ (A → q1) (q1 B) ⇒ (B → q1) (q1 _) ⇒ (# • q2) (q2 #) ⇒ (# ← q2) (q2 B) ⇒ (B ← q2) (q2 A) ⇒ (A ← q2) (q2 _) ⇒ (_ → q3) (q3 A) ⇒ (_ → q3) (q3 B) ⇒ (_ → q4) (q4 #) ⇒ (# → q4) (q4 _) ⇒ (B • q2) (q2 B) ⇒ (B ← q2) (q2 #) ⇒ (# ← q2) (q2 _) ⇒ (_ → q3) (q3 #) ⇒ (_ • q3) (q3 _) ⇒ (_ → q0) _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 B
  35. Заголовок 35 Реализация фильтрующей функции на МТ (18/18) (q1 A)

    ⇒ (A → q1) (q1 B) ⇒ (B → q1) (q1 _) ⇒ (# • q2) (q2 #) ⇒ (# ← q2) (q2 B) ⇒ (B ← q2) (q2 A) ⇒ (A ← q2) (q2 _) ⇒ (_ → q3) (q3 A) ⇒ (_ → q3) (q3 B) ⇒ (_ → q4) (q4 #) ⇒ (# → q4) (q4 _) ⇒ (B • q2) (q2 B) ⇒ (B ← q2) (q2 #) ⇒ (# ← q2) (q2 _) ⇒ (_ → q3) (q3 #) ⇒ (_ • q3) (q3 _) ⇒ (_ → q0) halt _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 B
  36. Заголовок 36 Модель потока вычисления (q1 A) ⇒ (A →

    q1) ⇒ q1 {AB} (q1 B) ⇒ (B → q1) ⇒ q1 {AB } (q1 _) ⇒ (# • q2) ⇒ q2 {AB#} (q2 #) ⇒ (# ← q2) ⇒ q2 {AB#} (q2 B) ⇒ (B ← q2) ⇒ q2 {AB#} (q2 A) ⇒ (A ← q2) ⇒ q2 { AB#} (q2 _) ⇒ (_ → q3) ⇒ q3 {AB#} (q3 A) ⇒ (_ → q3) ⇒ q3 {B#} (q3 B) ⇒ (_ → q4) ⇒ q4 {#} (q4 #) ⇒ (# → q4) ⇒ q4 {# } (q4 _) ⇒ (B • q2) ⇒ q2 {#B} (q2 B) ⇒ (B ← q2) ⇒ q2 {#B} (q2 #) ⇒ (# ← q2) ⇒ q2 { #B} (q2 _) ⇒ (_ → q3) ⇒ q3 {#B} (q3 #) ⇒ (_ • q3) ⇒ q3 { B} (q3 _) ⇒ (_ → q0) ⇒ q0 {B} Поток вычисления (предикат ⇒ побочные эффекты ⇒ состояние)
  37. Заголовок 37 Докажем неэффективную реализацию фильтрации, используя модель потока вычисления

    Поиск уязвимостей на потоке вычисления МТ (1/5)
  38. Заголовок 38 Поиск уязвимостей на потоке вычисления МТ (2/5) halt

    _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 A B
  39. Заголовок 39 Поиск уязвимостей на потоке вычисления МТ (3/5) (q3

    _) ⇒ (_ → q0) halt _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 A B
  40. Заголовок 40 Поиск уязвимостей на потоке вычисления МТ (4/5) (q1

    #) ⇒ (# • q3) (q3 _) ⇒ (_ → q0) halt _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 # A B
  41. Заголовок 41 Поиск уязвимостей на потоке вычисления МТ (5/5) (q1

    #) ⇒ (# • q3) (q3 _) ⇒ (_ → q0) halt _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 # A B Эксплоит
  42. Заголовок 42 Поиск уязвимостей на потоке вычисления МТ (5/5) (q1

    #) ⇒ (# • q3) (q3 _) ⇒ (_ → q0) halt _ # A B q0 halt q1 # • q2 # • q3 A → q1 B → q1 q2 _ → q3 # ← q2 A ← q2 B ← q2 q3 _ → q0 _ • q3 _ → q3 _ → q4 q4 B • q2 # → q4 A → q4 B → q4 # A B Эксплоит
  43. Заголовок 43 • Анализ всех значимых веток потока вычисления имеет

    экспоненциальную сложность • Утверждать о получении результата анализа возможно только после его завершения, однако при этом: • Лента МТ бесконечна ⇒ • Бесконечно множество неуязвимых конфигураций программы ⇒ • При анализе веток неуязвимых конфигураций, анализатор никогда не достигнет в них начального состояния ⇒ Анализ никогда не завершится, если программа неуязвима Физический смысл теоремы Райса
  44. Заголовок 44 In practice, models built on these foundations are

    bound to be nearly useless for generalized, real-world software engineering… Michal Zalewski, "The Tangled Web" Авторитетное мнение
  45. Заголовок 45

  46. Человек?

  47. Заголовок ([][[]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+([![]]+[][[]]) [+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+[]]+((+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+ []]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![ ]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[ ]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![] +[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(! []+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[ ]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[][(![]+[])[+[]]+([![]]+[] [[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+

    []]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+( !![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[]) [+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+! +[]]]()[+!+[]+[+!+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][(![]+[]) [+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[ ][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+ [!+[]+!+[]]+[+[]])+[])[+!+[]]+(+(+!+[]+[+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]] )[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([ ![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][ []]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([! []]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+! +[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![ ]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+ (!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![] +[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]](!+[]+!+[]+[+!+[]])[+!+[ ]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(+(+!+[]+[+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!! []+[])[+!+[]]])[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(! []+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[ ])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![ ]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([! []]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+! +[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+( !![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+ [])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]](!+[]+!+[] +[+!+[]])[+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+[]]+(+(+!+[]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][ []])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[] )[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]] ])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[]) [!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]] )[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[] )[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+! +[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!! []+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+ []]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]](!+[]+!+[]+[+[]])+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![] +[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+ !+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+( [][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+! +[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[ !+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+ []+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]] УЯЗВИМ ЛИ ДАННЫЙ JAVASCRIPT-КОД? (1/2)
  48. Заголовок ([][[]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+([![]]+[][[]]) [+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+[]]+((+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+ []]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![ ]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[ ]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![] +[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(! []+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[ ]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[][(![]+[])[+[]]+([![]]+[] [[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+

    []]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+( !![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[]) [+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+! +[]]]()[+!+[]+[+!+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][(![]+[]) [+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[ ][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+ [!+[]+!+[]]+[+[]])+[])[+!+[]]+(+(+!+[]+[+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]] )[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([ ![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][ []]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([! []]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+! +[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![ ]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+ (!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![] +[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]](!+[]+!+[]+[+!+[]])[+!+[ ]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(+(+!+[]+[+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!! []+[])[+!+[]]])[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(! []+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[ ])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![ ]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([! []]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+! +[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+( !![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+ [])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]](!+[]+!+[] +[+!+[]])[+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+[]]+(+(+!+[]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][ []])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[] )[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]] ])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[]) [!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]] )[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[] )[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+! +[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!! []+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+ []]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]](!+[]+!+[]+[+[]])+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![] +[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+ !+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+( [][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+! +[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[ !+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+ []+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]] УЯЗВИМ ЛИ ДАННЫЙ JAVASCRIPT-КОД? (2/2)
  49. Заголовок false => ![] true => !![] undefined => [][[]]

    NaN => +[![]] 0 => +[] 1 => +!+[] 2 => !+[]+!+[] 10 => [+!+[]]+[+[]] Array => [] Number => +[] String => []+[] Boolean => ![] Function => []["filter"] eval => []["filter"]["constructor"]( CODE )() window => []["filter"]["constructor"]("return this")() … JSF**CK document.location= location.hash.substring(1)
  50. Заголовок Так что же делать? • Анализатор транслирует код в

    привычные человеку языковые идиомы, определяет потенциально опасные точки и выводит условия их успешной эксплуатации в терминах всё тех же идиом • Человек верифицирует полученные результаты, классифицируя все обнаруженные анализатором точки и подтверждая выполнимость условий эксплуатации
  51. Заголовок Что общего у машины Тьюринга с реальными приложениями?

  52. Заголовок Поток вычисления (1/2) (q1 A) ⇒ (A → q1)

    ⇒ q1 {AB} (q1 B) ⇒ (B → q1) ⇒ q1 {AB } (q1 _) ⇒ (# • q2) ⇒ q2 {AB#} (q2 #) ⇒ (# ← q2) ⇒ q2 {AB#} (q2 B) ⇒ (B ← q2) ⇒ q2 {AB#} (q2 A) ⇒ (A ← q2) ⇒ q2 { AB#} (q2 _) ⇒ (_ → q3) ⇒ q3 {AB#} (q3 A) ⇒ (_ → q3) ⇒ q3 {B#} (q3 B) ⇒ (_ → q4) ⇒ q4 {#} (q4 #) ⇒ (# → q4) ⇒ q4 {# } (q4 _) ⇒ (B • q2) ⇒ q2 {#B} (q2 B) ⇒ (B ← q2) ⇒ q2 {#B} (q2 #) ⇒ (# ← q2) ⇒ q2 { #B} (q2 _) ⇒ (_ → q3) ⇒ q3 {#B} (q3 #) ⇒ (_ • q3) ⇒ q3 { B} (q3 _) ⇒ (_ → q0) ⇒ q0 {B} Поток вычисления (предикат ⇒ побочные эффекты ⇒ состояние)
  53. Заголовок Поток вычисления описывает предикативную последовательность смены конфигураций МТ в

    процессе вычисления алгоритма Для МТ конфигурацию составляют: • позиция считывателя на ленте; • содержимое ленты; • активное состояние. Для реального приложения, полным аналогом конфигурации МТ является состояние всех потоков данных, доступных в каждой точке потока управления. Поток вычисления (2/2)
  54. Заголовок Построение потока вычисления реальных приложений

  55. Заголовок «Интерпретация кода программы по произвольным семантическим правилам, направленным на

    аппроксимацию её исходной модели вычисления и разрешение её свойств»: • Построение семантических моделей: CFG, DFG, CPG и т.п. • Taint-анализ, анализ достигающих определений • Построение вычислительных моделей (CompFG, сети Петри и т.п) Абстрактная интерпретация
  56. Заголовок Абстрактная интерпретация «на пальцах» (1/2) Задача: определить знак результата

    вычисления математического выражения. Например: -42 / 8 * 100500 + x
  57. Заголовок Абстрактная интерпретация «на пальцах» (2/2) Построим свою собственную арифметику

    со знаком и формулами: (+a) = (+) (-a) = (-) (-a) * (+b) = (-) (-a) / (+b) = (-) (-a) + (+b) ∈ { a ≤ b ⇒ (+), a > b ⇒ (-) } И применим её: -42 / 8 * 100500 + x = x ≥ -527625 ⇒ (+), x < -527625 ⇒ (-) Опциональное множество -- множество, генерирующая/распознающая функция которого определяется истинностью заданных предикатов
  58. Заголовок «Абстрактная интерпретация по расширенной конкретной семантике, дополненной правилами вычисления

    неизвестных переменных (символов)» Символьное вычисление (1/2)
  59. Заголовок «Абстрактная интерпретация по расширенной конкретной семантике, дополненной правилами вычисления

    неизвестных переменных (символов)» Символьное вычисление (2/2) 2x^2 + 4 = 12 2x^2 = 12 - 4 2x^2 = 12 - 4 x^2 = (12 - 4) / 2 x = sqrt((12 - 4) / 2) x = sqrt((8) / 2) x = sqrt(4) x = 2
  60. Заголовок Художественная резьба по коду Символьное вычисление реальных приложений

  61. Заголовок Построение среза потока вычисления символьным методом (1/10) var name

    = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  62. Заголовок Построение среза потока вычисления символьным методом (2/10) Response.Write(str1) var

    name = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  63. Заголовок Построение среза потока вычисления символьным методом (3/10) Response.Write({ key1

    == "validkey" ⇒ Encoding.UTF8.GetString(data), }) var name = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  64. Заголовок Построение среза потока вычисления символьным методом (4/10) Response.Write({ key1

    == "validkey" ⇒ Encoding.UTF8.GetString(data), key1 != "validkey" ⇒ "Wrong key!" }) var name = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  65. Заголовок Построение среза потока вычисления символьным методом (5/10) name +

    "in" == "admin" ⇒ Response.Write({ key1 == "validkey" ⇒ Encoding.UTF8.GetString(data), key1 != "validkey" ⇒ "Wrong key!" }) var name = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  66. Заголовок Построение среза потока вычисления символьным методом (6/10) name +

    "in" == "admin" ⇒ Response.Write({ key1 == "validkey" ⇒ Encoding.UTF8.GetString({ string.IsNullOrEmpty(parm) ⇒ new char[0] }), key1 != "validkey" ⇒ "Wrong key!" }) var name = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  67. Заголовок Построение среза потока вычисления символьным методом (7/10) name +

    "in" == "admin" ⇒ Response.Write({ key1 == "validkey" ⇒ Encoding.UTF8.GetString({ string.IsNullOrEmpty(parm) ⇒ new char[0], !string.IsNullOrEmpty(parm) ⇒ Convert.FromBase64String(parm) }), key1 != "validkey" ⇒ "Wrong key!" }) var name = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  68. Заголовок Построение среза потока вычисления символьным методом (8/10) name +

    "in" == "admin" ⇒ Response.Write({ key1 == "validkey" ⇒ Encoding.UTF8.GetString({ string.IsNullOrEmpty( Request.Params["parm"] ) ⇒ new char[0], !string.IsNullOrEmpty( Request.Params["parm"] ) ⇒ Convert.FromBase64String( Request.Params["parm"] ) }), key1 != "validkey" ⇒ "Wrong key!" }) var name = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  69. Заголовок Построение среза потока вычисления символьным методом (9/10) name +

    "in" == "admin" ⇒ Response.Write({ Request.Params["key1"] == "validkey" ⇒ Encoding.UTF8.GetString({ string.IsNullOrEmpty( Request.Params["parm"] ) ⇒ new char[0], !string.IsNullOrEmpty( Request.Params["parm"] ) ⇒ Convert.FromBase64String( Request.Params["parm"] ) }), Request.Params["key1"] != "validkey" ⇒ "Wrong key!" }) var name = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  70. Заголовок Построение среза потока вычисления символьным методом (10/10) Request.Params["name"] +

    "in" == "admin" ⇒ Response.Write({ Request.Params["key1"] == "validkey" ⇒ Encoding.UTF8.GetString({ string.IsNullOrEmpty( Request.Params["parm"] ) ⇒ new char[0], !string.IsNullOrEmpty( Request.Params["parm"] ) ⇒ Convert.FromBase64String( Request.Params["parm"] ) }), Request.Params["key1"] != "validkey" ⇒ "Wrong key!" }) var name = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  71. Заголовок А теперь, в другую сторону!

  72. Заголовок Построение полного потока вычисления (1/10) ε ⇒ { name

    ∈ {ε ⇒ Request.Params["name"]} } var name = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  73. Заголовок Построение полного потока вычисления (2/10) ε ⇒ { name

    ∈ {ε ⇒ Request.Params["name"]} key1 ∈ {ε ⇒ Request.Params["key1"]} } var name = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  74. Заголовок Построение полного потока вычисления (3/10) ε ⇒ { name

    ∈ {ε ⇒ Request.Params["name"]} key1 ∈ {ε ⇒ Request.Params["key1"]} parm ∈ {ε ⇒ Request.Params["parm"]} } var name = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  75. Заголовок Построение полного потока вычисления (4/10) ε ⇒ { name

    ∈ {ε ⇒ Request.Params["name"]} key1 ∈ {ε ⇒ Request.Params["key1"]} parm ∈ {ε ⇒ Request.Params["parm"]} data ∈ { string.IsNullOrEmpty(parm) ⇒ new char[0], !string.IsNullOrEmpty(parm) ⇒ Convert.FromBase64String(parm) } } var name = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  76. Заголовок Построение полного потока вычисления (5/10) (name + "in" ==

    "admin") ⇒ { name ∈ {ε ⇒ Request.Params["name"]} key1 ∈ {ε ⇒ Request.Params["key1"]} parm ∈ {ε ⇒ Request.Params["parm"]} data ∈ { string.IsNullOrEmpty(parm) ⇒ new char[0], !string.IsNullOrEmpty(parm) ⇒ Convert.FromBase64String(parm) } } var name = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  77. Заголовок Построение полного потока вычисления (6/10) (name + "in" ==

    "admin") ⇒ { name ∈ {ε ⇒ Request.Params["name"]} key1 ∈ {ε ⇒ Request.Params["key1"]} parm ∈ {ε ⇒ Request.Params["parm"]} data ∈ { string.IsNullOrEmpty(parm) ⇒ new char[0], !string.IsNullOrEmpty(parm) ⇒ Convert.FromBase64String(parm) } str1 ∈ { (name + "in" == "admin") ⇒ null} } var name = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  78. Заголовок Построение полного потока вычисления (7/10) (name + "in" ==

    "admin") && (key1 == "validkey") ⇒ { name ∈ {ε ⇒ Request.Params["name"]} key1 ∈ {ε ⇒ Request.Params["key1"]} parm ∈ {ε ⇒ Request.Params["parm"]} data ∈ { string.IsNullOrEmpty(parm) ⇒ new char[0], !string.IsNullOrEmpty(parm) ⇒ Convert.FromBase64String(parm) } str1 ∈ { (name + "in" == "admin") ⇒ null} } var name = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  79. Заголовок Построение полного потока вычисления (8/10) (name + "in" ==

    "admin") && (key1 == "validkey") ⇒ { name ∈ {ε ⇒ Request.Params["name"]} key1 ∈ {ε ⇒ Request.Params["key1"]} parm ∈ {ε ⇒ Request.Params["parm"]} data ∈ { string.IsNullOrEmpty(parm) ⇒ new char[0], !string.IsNullOrEmpty(parm) ⇒ Convert.FromBase64String(parm) } str1 ∈ { (name + "in" == "admin") ⇒ null, (name + "in" == "admin") && (key1 == "validkey") ⇒ Encoding.UTF8.GetString(data) } } var name = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  80. Заголовок Построение полного потока вычисления (9/10) (name + "in" ==

    "admin") && (key1 != "validkey") ⇒ { name ∈ {ε ⇒ Request.Params["name"]} key1 ∈ {ε ⇒ Request.Params["key1"]} parm ∈ {ε ⇒ Request.Params["parm"]} data ∈ { string.IsNullOrEmpty(parm) ⇒ new char[0], !string.IsNullOrEmpty(parm) ⇒ Convert.FromBase64String(parm) } str1 ∈ { (name + "in" == "admin") ⇒ null, (name + "in" == "admin") && (key1 == "validkey") ⇒ Encoding.UTF8.GetString(data), (name + "in" == "admin") && (key1 != "validkey") ⇒ "Wrong key!" } } var name = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  81. Заголовок Построение полного потока вычисления (10/10) (name + "in" ==

    "admin") ⇒ { name ∈ {ε ⇒ Request.Params["name"]} key1 ∈ {ε ⇒ Request.Params["key1"]} parm ∈ {ε ⇒ Request.Params["parm"]} data ∈ { string.IsNullOrEmpty(parm) ⇒ new char[0], !string.IsNullOrEmpty(parm) ⇒ Convert.FromBase64String(parm) } str1 ∈ { (name + "in" == "admin") && (key1 == "validkey") ⇒ Encoding.UTF8.GetString(data), (name + "in" == "admin") && (key1 != "validkey") ⇒ "Wrong key!" } Response.Write(str1) } var name = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); if (name + "in" == "admin") { string str1; if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  82. Заголовок • Приложение рассматривается, как множество точек выполнения, связанных между

    собой в соответствии с графом потока управления • Каждая точка хранит информацию о предикативных состояниях всех доступных в ней переменных Поток вычисления приложения (1/2)
  83. Заголовок • Предикативное состояние описывается парой элементов: 1. Предикатом, задающим

    формулу достижимости состояния 2. Формулой, определяющей множество значений, соответствующее описываемому состоянию • Формулы конструируются путём подстановки конструкций кода в ходе его абстрактной интерпретации по семантике символьных вычислений • Формальная форма описания модели – граф потока вычисления Поток вычисления приложения (2/2)
  84. Заголовок • Модель потока вычисления позволяет: • разрешать элементы множества

    значений входных данных по заданному состоянию; • определять состояние по заданному множеству значений входных данных • Для поиска по ней уязвимостей требуется конкретизация понятия "уязвимое состояние" в зависимости от рассматриваемого класса атак • Один из возможных подходов к конкретизации заключается в сопоставлении аргументов опасных операций со множествами значений возможных векторов атак Возможности модели
  85. Заголовок Поиск уязвимостей в потоке вычисления (1/13) Request.Params["name"] + "in"

    == "admin" ⇒ Response.Write({ Request.Params["key1"] == "validkey" ⇒ Encoding.UTF8.GetString({ string.IsNullOrEmpty(Request.Params["parm"]) ⇒ new char[0], !string.IsNullOrEmpty(Request.Params["parm"]) ⇒ Convert.FromBase64String(Request.Params["parm"]) }), Request.Params["key1"] != "validkey" ⇒ "Wrong key!" })
  86. Заголовок Поиск уязвимостей в потоке вычисления (2/13) Request.Params["name"] + "in"

    == "admin" ⇒ Response.Write({ Request.Params["key1"] == "validkey" ⇒ Encoding.UTF8.GetString({ string.IsNullOrEmpty(Request.Params["parm"]) ⇒ new char[0], !string.IsNullOrEmpty(Request.Params["parm"]) ⇒ Convert.FromBase64String(Request.Params["parm"]) }), Request.Params["key1"] != "validkey" ⇒ "Wrong key!" })
  87. Заголовок Поиск уязвимостей в потоке вычисления (3/13) Request.Params["name"] + "in"

    == "admin" ⇒ Response.Write({ Request.Params["key1"] == "validkey" ⇒ Encoding.UTF8.GetString({ !string.IsNullOrEmpty(Request.Params["parm"]) ⇒ Convert.FromBase64String(Request.Params["parm"]) }), Request.Params["key1"] != "validkey" ⇒ "Wrong key!" })
  88. Заголовок Поиск уязвимостей в потоке вычисления (4/13) Request.Params["name"] + "in"

    == "admin" ⇒ Response.Write({ Request.Params["key1"] == "validkey" ⇒ Encoding.UTF8.GetString({ !string.IsNullOrEmpty(Request.Params["parm"]) ⇒ Convert.FromBase64String(Request.Params["parm"]) }), Request.Params["key1"] != "validkey" ⇒ "Wrong key!" })
  89. Заголовок Поиск уязвимостей в потоке вычисления (5/13) Request.Params["name"] + "in"

    == "admin" ⇒ Response.Write({ Request.Params["key1"] == "validkey" ⇒ Encoding.UTF8.GetString({ !string.IsNullOrEmpty(Request.Params["parm"]) ⇒ Convert.FromBase64String(Request.Params["parm"]) }) })
  90. Заголовок Поиск уязвимостей в потоке вычисления (6/13) Request.Params["name"] + "in"

    == "admin" ⇒ Response.Write({ Request.Params["key1"] == "validkey" ⇒ Encoding.UTF8.GetString({ !string.IsNullOrEmpty(Request.Params["parm"]) ⇒ Convert.FromBase64String(Request.Params["parm"]) }) })
  91. Заголовок Поиск уязвимостей в потоке вычисления (7/13) Request.Params["name"] + "in"

    == "admin" && Request.Params["key1"] == "validkey" && !string.IsNullOrEmpty(Request.Params["parm"]) ⇒ Response.Write( Encoding.UTF8.GetString( Convert.FromBase64String(Request.Params["parm"]) ) )
  92. Заголовок Поиск уязвимостей в потоке вычисления (8/13) Request.Params["name"] + "in"

    == "admin" && Request.Params["key1"] == "validkey" && !string.IsNullOrEmpty(Request.Params["parm"]) ⇒ Response.Write( Encoding.UTF8.GetString( Convert.FromBase64String(Request.Params["parm"]) ) )
  93. Заголовок Поиск уязвимостей в потоке вычисления (9/13) Request.Params["name"] + "in"

    == "admin" && Request.Params["key1"] == "validkey" && Encoding.UTF8.GetString( Convert.FromBase64String(Request.Params["parm"]) ) ⊇ "<script>alert(0)</script>" ⇒ Response.Write( Encoding.UTF8.GetString( Convert.FromBase64String(Request.Params["parm"]) ) )
  94. Заголовок Поиск уязвимостей в потоке вычисления (10/13) Request.Params["name"] + "in"

    == "admin" && Request.Params["key1"] == "validkey" && Encoding.UTF8.GetString( Convert.FromBase64String(Request.Params["parm"]) ) ⊇ "<script>alert(0)</script>" ⇒ Response.Write( Encoding.UTF8.GetString( Convert.FromBase64String(Request.Params["parm"]) ) )
  95. Заголовок Поиск уязвимостей в потоке вычисления (11/13) Request.Params["name"] + "in"

    == "admin" && Request.Params["key1"] == "validkey" && Convert.FromBase64String(Request.Params["parm"]) ⊇ Encoding.UTF8.GetBytes("<script>alert(0)</script>") ⇒ Response.Write( Encoding.UTF8.GetString( Convert.FromBase64String(Request.Params["parm"]) ) )
  96. Заголовок Поиск уязвимостей в потоке вычисления (12/13) Request.Params["name"] + "in"

    == "admin" && Request.Params["key1"] == "validkey" && Request.Params["parm"] = Convert.ToBase64String( Encoding.UTF8.GetBytes("<script>alert(0)</script>") ) ⇒ Response.Write( Encoding.UTF8.GetString( Convert.FromBase64String(Request.Params["parm"]) ) )
  97. Заголовок Поиск уязвимостей в потоке вычисления (13/13) Request.Params["name"] = "adm"

    Request.Params["key1"] = "validkey" Request.Params["parm"] = "PHNjcmlwdD5hbGVydCgwKTwvc2NyaXB0Pg==" ⇒ Response.Write( Encoding.UTF8.GetString( Convert.FromBase64String(Request.Params["parm"]) ) )
  98. Заголовок • Точность детектирования можно улучшить через решение уравнений со

    множеством векторов атак, актуальных для контекста заданной уязвимой точки выполнения • Для этого необходимо определить критерии состояния защищённости приложения в рамках исследуемого класса уязвимостей Дальнейшее развитие модели
  99. Заголовок 99

  100. Заголовок Формальная модель инъекций

  101. Заголовок Модель уязвимого приложения (1/7) 01 var a = Request.Params["a"];

    02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); Граница окружения
  102. Заголовок Модель уязвимого приложения (2/7) 01 var a = Request.Params["a"];

    02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); Точка входа a Граница окружения
  103. Заголовок Модель уязвимого приложения (3/7) 01 var a = Request.Params["a"];

    02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); Точка входа a Точка входа b Граница окружения
  104. Заголовок Модель уязвимого приложения (4/7) Точка выхода fpvo (ftransform (a,

    b)) 01 var a = Request.Params["a"]; 02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); Точка входа a Точка входа b Граница окружения
  105. Заголовок Модель уязвимого приложения (5/7) Точка выхода fpvo (ftransform (a,

    b)) 01 var a = Request.Params["a"]; 02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); Точка входа a Точка входа b Граница окружения
  106. Заголовок Модель уязвимого приложения (6/7) 01 var a = Request.Params["a"];

    02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); Точка входа a Точка входа b Точка выхода fpvo (ftransform (a, b)) Граница окружения Точка инъекции a
  107. Заголовок Модель уязвимого приложения (7/7) 01 var a = Request.Params["a"];

    02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); Точка входа a Точка входа b Точка выхода fpvo (ftransform (a, b)) Граница окружения Точка инъекции a Точка инъекции b
  108. Заголовок Точка инъекции Фрагмент формулы состояния достижимой точки потока вычисления,

    множество значений которого зависит от входных данных: ε ⇒ Response.Write( "<img src='//host/1/" + { Request.Params["a"] != null ⇒ Request.Params["a"] } + "' onclick='f(" + { Request.Params["b"] != null ⇒ Request.Params["b"] } ")'/>" )
  109. Заголовок Суть атаки инъекции Атаки инъекции направлены на внедрение в

    точки инъекции грамматических конструкций, не предусмотренных логикой приложения
  110. Заголовок Модель атаки (HTML/URL, нет инъекции) 01 var a =

    Request.Params["a"]; 02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); image.jpg Граница окружения < img src = ' // host / 1 / image.jpg ' …
  111. Заголовок Модель атаки (HTML/URL, инъекция URL-пути) 01 var a =

    Request.Params["a"]; 02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); ../image.jpg Граница окружения < img src = ' // host / 1 / .. / image.jpg ' …
  112. Заголовок Модель атаки (HTML/URL, инъекция HTML-атрибута) 01 var a =

    Request.Params["a"]; 02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); 'onerror='alert(0) Граница окружения < img src = ' // host / 1 / ' onerror = ' alert ( 0 ) ' …
  113. Заголовок Модель атаки (HTML/URL, инъекция HTML-тега) 01 var a =

    Request.Params["a"]; 02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); '><script>alert(0)</script> Граница окружения < img src = ' // host / 1 / ' > < script > alert(0) </ script >' …
  114. Заголовок Считаем токены • Нет атаки — 1 токен в

    точке инъекции • Есть атака — более 1 токена в точке инъекции
  115. Заголовок Приложение защищено от атак инъекций тогда, когда в результате

    лексического разбора любого возможного выходного потока данных, на каждую точку инъекции приходится не более одного токена Достаточный критерий защищённости от атак инъекций
  116. Заголовок Что если сама логика приложения подразумевает наличие более одного

    токена в какой-либо точке инъекции? Достаточный критерий не всегда применим
  117. Заголовок Модель атаки (HTML/JavaScript, нет инъекции) 01 var a =

    Request.Params["a"]; 02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); Граница окружения … onclick = ' f ( { "f1" : "val1" , "f2" : "val2" } ) ' /> { "f1": "val1", "f2": "val2" }
  118. Заголовок Необходимый критерий защищённости от атак инъекций Приложение защищено от

    атак инъекций тогда, когда в результате лексического разбора любого возможного потока выходных данных, множества токенов, приходящиеся на точки инъекции, являются авторизованными
  119. Заголовок Статическая верификация уязвимостей (1/6) http://host/path?name=adm&key1=validkey&parm=PHNjcmlwdD5hbGVydCgwKTwv c2NyaXB0Pg== Request.Params["name"] + "in"

    == "admin" ⇒ Response.Write({ Request.Params["key1"] == "validkey" ⇒ Encoding.UTF8.GetString({ string.IsNullOrEmpty(Request.Params["parm"]) ⇒ new char[0], !string.IsNullOrEmpty(Request.Params["parm"]) ⇒ Convert.FromBase64String(Request.Params["parm"]) }), Request.Params["key1"] != "validkey" ⇒ "Wrong key!" })
  120. Заголовок Статическая верификация уязвимостей (2/6) http://host/path?name=adm&key1=validkey&parm=PHNjcmlwdD5hbGVydCgwKTwv c2NyaXB0Pg== "adm" + "in"

    == "admin" ⇒ Response.Write({ "validkey" == "validkey" ⇒ Encoding.UTF8.GetString({ string.IsNullOrEmpty("PHNj…") ⇒ new char[0], !string.IsNullOrEmpty("PHNj…") ⇒ Convert.FromBase64String("PHNj…") }), "validkey" != "validkey" ⇒ "Wrong key!" })
  121. Заголовок Статическая верификация уязвимостей (3/6) http://host/path?name=adm&key1=validkey&parm=PHNjcmlwdD5hbGVydCgwKTwv c2NyaXB0Pg== true ⇒ Response.Write({

    true ⇒ Encoding.UTF8.GetString({ false ⇒ new char[0], true ⇒ Convert.FromBase64String("PHNj…") }), false ⇒ "Wrong key!" })
  122. Заголовок Статическая верификация уязвимостей (4/6) http://host/path?name=adm&key1=validkey&parm=PHNjcmlwdD5hbGVydCgwKTwv c2NyaXB0Pg== Response.Write( Encoding.UTF8.GetString( Convert.FromBase64String("PHNj…")

    ) )
  123. Заголовок Статическая верификация уязвимостей (5/6) http://host/path?name=adm&key1=validkey&parm=PHNjcmlwdD5hbGVydCgwKTwv c2NyaXB0Pg== Response.Write("<script>alert(0)</script>")

  124. Заголовок Статическая верификация уязвимостей (6/6) http://host/path?name=adm&key1=validkey&parm=PHNjcmlwdD5hbGVydCgwKTwv c2NyaXB0Pg== Response.Write("<script>alert(0)</script>") HTML <

    script > alert ( 0 ) </ script > 10 токенов
  125. Заголовок • Как быть с: • Циклами и рекурсией? •

    Отсутствующими зависимостями? • Уравнениями, которые не смог решить SMT-солвер? • Некорректным кодом и любыми конструкциями, которые не смог распознать анализатор? • И т.п… «Неудобные» вопросы (1/2)
  126. Заголовок • Как быть с: • Циклами и рекурсией? •

    Отсутствующими зависимостями? • Уравнениями, которые не смог решить SMT-солвер? • Некорректным кодом и любыми конструкциями, которые не смог распознать анализатор? • И т.п… Просто отдадим их на верификацию пользователю! «Неудобные» вопросы (1/2)
  127. Заголовок

  128. Заголовок «Последовательность действий, направленных на исследование исключительно исходного кода приложения

    с целью выявления уязвимостей и позволяющих получать воспроизводимые и верифицируемые результаты» Идеальный процесс статического анализа защищённости (2/5)
  129. Заголовок «Последовательность действий, направленных на исследование исключительно исходного кода приложения

    с целью выявления уязвимостей и позволяющих получать воспроизводимые и верифицируемые результаты» Идеальный процесс статического анализа защищённости (3/5)
  130. Заголовок «Последовательность действий, направленных на исследование исключительно исходного кода приложения

    с целью выявления уязвимостей и позволяющих получать воспроизводимые и верифицируемые результаты» Идеальный процесс статического анализа защищённости (4/5)
  131. Заголовок «Последовательность действий, направленных на исследование исключительно исходного кода приложения

    с целью выявления уязвимостей и позволяющих получать воспроизводимые и верифицируемые результаты» Идеальный процесс статического анализа защищённости (5/5)
  132. Заголовок ptsecurity.com Спасибо! Спасибо!