AppSec -- хакерский путь.pptx
- Количество слайдов: 120
Заголовок App. Sec – хакерский путь Владимир Кочетков Руководитель отдела исследований по анализу защищённости приложений ptsecurity. com Positive Technologies
Заголовок https: //approof. ptsecurity. ru/ PT Application Inspector https: //ai. ptsecurity. ru/ ptsecurity. com
Заголовок ПАМЯТИ КРИСА КАСПЕРСКИ (1976 -2017)
Заголовок HACKERS? WHO THE F**K ARE HACKERS? ! «Для хакера каждый предмет связан с определенными свойствами и включен в определенные причинно-следственные отношения» «Хакер стремится разобраться во всём до конца, понять всё до мельчайших подробностей, выйти за область определения объекта, проанализировать и испытать его поведение во всех нештатных ситуациях»
Заголовок ХАКИНГ – ОБРАЗ МЫШЛЕНИЯ, А НЕ РОД ДЕЯТЕЛЬНОСТИ
Заголовок ХАКИНГ – ОБРАЗ МЫШЛЕНИЯ, А НЕ РОД ДЕЯТЕЛЬНОСТИ
Заголовок APPSEC (APPLICATION SECURITY) Предметная область, рассматривающая в качестве объекта защиты гипотетическую информационную систему (ИС): • включающую в себя конкретное приложение • объединяющую объекты окружения в единую сущность • замкнутую относительно информационных потоков приложения
Заголовок ДОПУЩЕНИЯ APPSEC • вне области влияния приложения его окружение защищено • логика предметной области приложения корректна
Заголовок PT TOP 10 2011 -2015 (по данным аналитики https: //goo. gl/XTIGFW) 90% 80% 70% 60% 50% 40% 30% 20% 10% 0% 2011 2012 2013 2014 2015 № 1, Cross-Site Scripting № 2, Fingerprinting № 3, Brute Force № 4, Information Leakage № 5, SQL Injection № 6, Cross-Site Request Forgery № 7, Server Misconfiguration № 8, Credential/Session Prediction № 9, URL Redirector Abuse № 10, Path Traversal
Заголовок ТЕКУЩАЯ СИТУАЦИЯ? ВСЁ РОВНО ЖЕ… 90% 80% 70% 60% 50% 40% 30% 20% 10% 0% 2011 2012 2013 2014 2015 № 1, Cross-Site Scripting № 2, Fingerprinting № 3, Brute Force № 4, Information Leakage № 5, SQL Injection № 6, Cross-Site Request Forgery № 7, Server Misconfiguration № 8, Credential/Session Prediction № 9, URL Redirector Abuse № 10, Path Traversal
Заголовок «УЛЫБАЕМСЯ И МАШЕМ, ПАРНИ»
Заголовок ТЕКУЩАЯ СИТУАЦИЯ? S. N. A. F. U App. Sec за последние 5 лет развивался семимильными шагами: • появилось множество достойных продуктов (x. AST, WAF, RASP); • опубликованы сотни научных работ и тысячи инженерных статей; • разработке защищённых приложений не обучают только ленивые; • исследователи выходят из тени и готовы делиться опытом. А с уязвимостями в приложениях «всё ровно»
Заголовок 7 ПРИЧИН ТЕКУЩЕЙ СИТУАЦИИ (1/2) • Разработчики фактически следуют культу карго, слепо копируя "лучшие практики разработки защищённого кода", не имея при это представления о сути защищённости • Инструменты автоматизации задач App. Sec используются не по назначению или неэффективно • Сильно переоценена роль экспертов по анализу защищённости • Идёт повсеместная борьба с последствиями, вместо устранения причин
Заголовок 7 ПРИЧИН ТЕКУЩЕЙ СИТУАЦИИ (2/2) • Повсеместно насаждаются подходы типа "hack yourself first", вынуждающие разработчиков заниматься не своим делом и формирующие ложное представление об уровне защищённости проекта • Неоправданно-завышенная оценка уровня защищённости проектов с открытым исходным кодом • Защищённость, основанная на хит-парадах рисков, до сих пор считается нормой Нужен иной подход к вопросам защищённости приложений!
Заголовок ХАКЕРСКИЙ ПУТЬ APPSEC • Изучение свойств приложения, протекающих в нём процессов и связанного с ним окружения • Понимание сути состояния защищённости приложения • Установление причинно-следственных отношений между критериями защищённости и свойствами приложения • Принятие осознанных решений в любых вопросах обеспечения защищённости приложений
Заголовок Application Security
Заголовок DISCLAIMER Приводимые далее термины и определения локальны и не претендуют на признание в качестве общеупотребительных. Тем не менее, они устраняют существующие разночтения и противоречия в традиционной терминологии, позволяя перейти от интуитивных формулировок к формальным.
Заголовок С ЧЕГО НАЧНЁМ? Театр начинается с вешалки, а незащищённость ИС – с её недостатков
Заголовок НЕДОСТАТОК Неэффективная реализация процессов вычисления, логики предметной области или конфигурации окружения ИС 19
Заголовок УГРОЗА Обусловленная недостатком возможность нарушения свойств состояния защищенности информационного потока: • • • конфиденциальности; целостности; доступности; авторизованности; аутентичности. 20
Заголовок УЯЗВИМОСТЬ Состояние возможности реализации угрозы
Заголовок АТАКА Конкретный способ реализации угрозы (эксплуатации {состояния} уязвимости)
Заголовок ЗАЩИЩЁННОСТЬ Состояние невозможности реализации любой угрозы
Заголовок БЕЗОПАСНОСТЬ Состояние приемлемого риска реализации любой угрозы
Заголовок ИНЫМИ СЛОВАМИ То, что может сделать атакующий с потоками информации, называется угрозой (threat) То, когда и благодаря чему он может это сделать, называется уязвимостью (vulnerability), обусловленной недостатком (weakness)
Заголовок ИНЫМИ СЛОВАМИ То, как он может это сделать, называется атакой (attack) То, с какой вероятностью у него это удастся и какие последствия может повлечь, называется риском (risk)
Заголовок ИНЫМИ СЛОВАМИ То, что не позволяет атакующему провести атаку, обеспечивает защищенность (security) То, что минимизирует риск, обеспечивает безопасность (safety)
Заголовок Причины и следствия Недостаток (weakness) Незащищенность (insecurity) Небезопасность (unsafety) Угроза (threat) Уязвимость (vulnerability) Атака (attack) Риск (risk)
Заголовок Разница между ИБ и App. Sec Информационная безопасность Защищённость приложений
Заголовок Application Security
Заголовок ВЫБОР МОДЕЛИ ПРИЛОЖЕНИЯ Поскольку защищённость – темпоральное свойство, модель приложения должна отражать процесс его выполнения
Заголовок ПОТОКИ УПРАВЛЕНИЯ Приложение можно представить в виде базовых блоков, между которыми передаётся управление в процессе выполнения приложения
Заголовок ПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 1/15) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 2/15) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 3/15) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 4/15) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 5/15) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 6/15) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 7/15) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 8/15) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 9/15) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 10/15) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 11/15) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 12/15) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 13/15) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 14/15) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 15/15) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ ДАННЫХ Потоки выполнения приложения являются производными от потоков данных окружения
Заголовок ПОТОКИ ДАННЫХ (ПРИМЕР 1/9) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ ДАННЫХ (ПРИМЕР 2/9) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ ДАННЫХ (ПРИМЕР 3/9) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ ДАННЫХ (ПРИМЕР 4/9) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ ДАННЫХ (ПРИМЕР 5/9) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ ДАННЫХ (ПРИМЕР 6/9) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ ДАННЫХ (ПРИМЕР 7/9) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ ДАННЫХ (ПРИМЕР 8/9) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок ПОТОКИ ДАННЫХ (ПРИМЕР 9/9) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); }
Заголовок СОСТОЯНИЕ ПОТОКА ДАННЫХ Множество всех возможных значений потока данных в конкретной точке потока выполнения определяет его состояние
Заголовок СОСТОЯНИЕ ПОТОКА ДАННЫХ (ПРИМЕР) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); } str 1 ∈ { Encoding. UTF 8. Get. String(data), "Wrong Key!" }
Заголовок СОСТОЯНИЕ ПРИЛОЖЕНИЯ Множество состояний всех потоков данных в конкретной точке потока выполнения определяют состояние приложения
Заголовок СОСТОЯНИЕ ПРИЛОЖЕНИЯ (ПРИМЕР) var name = Request. Params["name"]; var key 1 = Request. Params["key 1"]; var parm = Request. Params["parm"]; var data = string. Is. Null. Or. Empty(parm) ? new char[0]: Convert. From. Base 64 String(parm); string str 1; if (name + "in" == "admin") { if (key 1 == "validkey") { str 1 = Encoding. UTF 8. Get. String(data); } else { str 1 = "Wrong key!"; } Response. Write(str 1); } str 1 ∈ { Encoding. UTF 8. Get. String(data), "Wrong Key!" } name ∈ { Request. Params["name"] } key 1 ∈ { Request. Params["key 1"] } parm ∈ { Request. Params["parm"] } data ∈ { new char[0], Convert. From. Bse 64 String(parm) }
Заголовок ГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ Граф переходов между состояниями приложения определяет все возможные потоки вычисления и является искомой моделью процесса его выполнения
Заголовок ГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 1/7)
Заголовок ГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 2/7)
Заголовок ГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 3/7)
Заголовок ГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 4/7)
Заголовок ГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 5/7)
Заголовок ГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 6/7)
Заголовок ГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 7/7)
Заголовок Соединяя точки
Заголовок APPLICATION + SECURITY • Потоки вычисления являются информационными потоками • Следовательно, уязвимость приложения – состояние возможности нарушения конфиденциальности, целостности, доступности, аутентичности или авторизованности любого из потоков вычисления приложения • Состояние защищённости приложения возникает при невозможности эксплуатации в нём любой уязвимости
Заголовок СУПЕРКЛАССЫ УЯЗВИМОСТЕЙ ПРИЛОЖЕНИЯ • Вычислительный – уязвимости, описываемые в терминах модели процесса выполнения приложения • Логический – уязвимости, описываемые в терминах модели предметной области приложения • Экзогенный – уязвимости, описываемые в терминах модели окружения
Заголовок ЧТО МЫ СКАЖЕМ ЛОГИЧЕСКОМУ И ЭКЗОГЕННОМУ КЛАССАМ? «Не сегодня!»
Заголовок МОДЕЛИРОВАНИЕ ВЫЧИСЛИТЕЛЬНЫХ УЯЗВИМОСТЕЙ (1/2) «Пусть C - граф потоков вычисления приложения. Пусть pvf(t) - достижимая вершина потока управления на C, являющаяся вызовом функции прямой или косвенной интерпретации текста t, соответствующего известной формальной грамматике G. Пусть e - поток аргумента входных данных на С. Пусть De - множество потоков данных на C, порождаемых от e и достижимых в точке вызова pvf(t), где t принадлежит De»
Заголовок МОДЕЛИРОВАНИЕ ВЫЧИСЛИТЕЛЬНЫХ УЯЗВИМОСТЕЙ (2/2) «Тогда приложение уязвимо к угрозе нарушения целостности потоков данных De в точке выполнения pvf(t), если среди них найдётся хотя бы одна пара таких значений, при которых, в результате их синтаксического разбора в соответствии с грамматикой G, получаются не изоморфные друг-другу деревья разбора»
Заголовок МОДЕЛИРОВАНИЕ УЯЗВИМОСТЕЙ (ПРИМЕР)
Заголовок ИНЪЕКЦИИ Атаки на нарушение целостности потоков данных в результате их преобразования принято называть инъекциями Тип инъекции определяется грамматикой атакуемого потока данных (HTML, XML, SQL, XPath, XQuery, LDAP, LINQ, Path, …)
Заголовок СВОЙСТВА АТАК • Направлены на реализацию угрозы (нарушение одного из свойств защищённости какого-либо потока вычисления) • Могут являться как производными от предыдущих атак, так и первообразными для последующих. Например: • HTTP Response Splitting → Header Spoofing → Session Fixation Unvalidated Redirection Body spoofing → Content Spoofing Session Fixation Unvalidated Redirection Cross-Site Scripting …
Заголовок ДОМАШНЕЕ ЗАДАНИЕ (1/2) 1. Постройте граф потоков вычисления C для вашего кода и найдите в нём все точки входа/выхода данных из/в окружения 2. Выделите в C все потоки вычисления от найденных точек входа к точкам выхода 3. Рассматривая каждый поток вычисления, как информационный, определите актуальные для него угрозы 4. Для каждой пары «поток вычисления ⇔ угроза» ответьте на вопрос: «что в приложении защищает данный поток от этой угрозы? » 5. Сформулируйте и реализуйте меры защиты для незащищённых потоков
Заголовок ДОМАШНЕЕ ЗАДАНИЕ (2/2) Для оценки угроз нарушения целостности в многопоточной среде имеет смысл рассматривать C в качестве сети Петри, где позициями сети будут входные/выходные вершины графа, а переходами – все промежуточные. Возможность появления более одной метки в любой позиции такой сети укажет на возможность реализации угрозы.
Заголовок ТАК ЧТО НЕ ТАК-ТО?
Заголовок Заблуждение № 1 «Достаточно знать N правил разработки защищённого кода»
Заголовок 5 ШАГОВ К ПРИНЯТИЮ ТОГО, ЧТО N→∞ отрицание принятие злость торг депрессия
Заголовок КАКИЕ ВАШИ ДОКАЗАТЕЛЬСТВА? • Возможных недостатков и уязвимостей бесконечно много, даже в рамках вычислительного суперкласса • Количество типов атак сравнимо с количеством возможных потоков вычислений * количество угроз, т. е. конечно и зависит от специфики каждого конкретного приложения • Следовательно, любое конечное множество правил, либо не является полным, либо направлено на противодействие атакам и поэтому неэффективно, либо сводит код к «не вполне полной по Тьюрингу» модели (например, правила NASA/JPL)
Заголовок ПРАВИЛО: «ОТ SQL-ИНЪЕКЦИЙ ПРИНИМАЙТЕ ORM!» (1/2) public class Session. Create. Query. Controller implements Controller{ @Override public Model. And. View handle. Request(Http. Servlet. Request request, Http. Servlet. Response response) throws Exception { Model. And. View mv = new Model. And. View("user"); String name = request. get. Parameter("name"); try { Session session = Hibernate. Util. get. Session. Factory(). open. Session(); session. begin. Transaction(); List result = session. create. Query("from Users. Entity where uname = '" + name + "'"). list(); mv. add. Object("users", result); session. get. Transaction(). commit(); } catch (Exception e) { e. print. Stack. Trace(); } return mv; } }
Заголовок ПРАВИЛО: «ОТ SQL-ИНЪЕКЦИЙ ПРИНИМАЙТЕ ORM!» (2/2) public class Session. Create. Query. Controller implements Controller{ @Override public Model. And. View handle. Request(Http. Servlet. Request request, Http. Servlet. Response response) throws Exception { Model. And. View mv = new Model. And. View("user"); String name = request. get. Parameter("name"); try { Session session = Hibernate. Util. get. Session. Factory(). open. Session(); session. begin. Transaction(); List result = session. create. Query("from Users. Entity where uname = '" + name + "'"). list(); mv. add. Object("users", result); session. get. Transaction(). commit(); } catch (Exception e) { e. print. Stack. Trace(); } return mv; } name = 1' and '1 ''=1 union select version(), 2, 3, 4 -- '='1 }
Заголовок Заблуждение № 2 «Всё ОК, анализатор ничего не нашёл»
Заголовок АНАЛИЗАТОР КОДА (ПРИМЕР 1/6) def analyze(code, data): if not vulnerable(code, data): # given configuration is secure else: # given configuration is vulnerable
Заголовок АНАЛИЗАТОР КОДА (ПРИМЕР 2/6) def analyze(code, data): if not vulnerable(code, data): # given configuration is secure vulnerable_function_call() else: # given configuration is vulnerable
Заголовок АНАЛИЗАТОР КОДА (ПРИМЕР 3/6) analyzer_code = """ def analyze(code, data): if not vulnerable(code, data): # given configuration is secure vulnerable_function_call() else: # given configuration is vulnerable """
Заголовок АНАЛИЗАТОР КОДА (ПРИМЕР 4/6) analyzer_code = """ def analyze(code, data): if not vulnerable(code, data): # given configuration is secure vulnerable_function_call() else: # given configuration is vulnerable """ eval(analyzer_code)
Заголовок АНАЛИЗАТОР КОДА (ПРИМЕР 5/6) analyzer_code = """ def analyze(code, data): 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)
Заголовок АНАЛИЗАТОР КОДА (ПРИМЕР 6/6) analyzer_code = """ def analyze(code, data): 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) ¯_(ツ)_/¯
Заголовок ЧАСТНЫЙ СЛУЧАЙ? n = … # n∈ℕ def analyze(code, data): while n: sleep(n) n -= 1 if not vulnerable(code, data): # given configuration is secure vulnerable_function_call() else: # given configuration is vulnerable И сколько таких «частных» случаев теперь возможно? ; )
Заголовок ТЕОРЕМА РАЙСА (ПРИМЕНИТЕЛЬНО К APPSEC) Не существует универсального анализатора защищённости
Заголовок СТАТАНАЛИЗАТОРЫ – ИНДУСТРИЯ ОБМАНА? Проблема анализа защищённости решаема для программ: • эквивалентных конечным автоматам (за PTIME) • сводимых к конечным автоматам за счёт накладывания ограничений на размеры доступной памяти, размерность переменных, количество итераций циклов и т. п. (за EXPTIME) Все существующие анализаторы используют подходы, основанные на аппроксимации модели исследуемого кода. Любой статанализатор легко «обламывается» не более, чем 3 строчками кода
Заголовок Заблуждение № 3 «Только ручной анализ, только хардкор!»
Заголовок УЯЗВИМ ЛИ ДАННЫЙ JAVASCRIPT-КОД? (1/2) ([][[]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+([![]]+[][[]]) [+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+([][[]]+[])[+[]]+((+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+ []]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![ ]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[ ]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![] +[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(! []+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[ ]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[][(![]+[])[+[]]+([![]]+[] [[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+ []]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+( !![]+[])[+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[]) [+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+! +[]]]()[+!+[]+[+!+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][(![]+[]) [+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[ ][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]]+[+[]])+[])[+!+[]]+(+(+!+[]+[+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]] )[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([ ![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]+([][ []]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([! []]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+! +[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![ ]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+ (!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![] +[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+[+[]]]](!+[]+[+!+[]])[+!+[ ]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(+(+!+[]+[+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!! []+[])[+!+[]]])[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[][(! []+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[ ])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![ ]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([! []]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+( !![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+ [])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+[+[]]]](!+[]+!+[] +[+!+[]])[+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(![]+[])[!+[]+!+[]]+([][[]]+[])[+[]]+(+(+!+[]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][ []])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[] )[+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]] ])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[]) [!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]] )[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[] )[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+! +[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!! []+[])[+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+ []]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+[+[]]]](!+[]+[+[]])+(![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![] +[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+ !+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+( [][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+! +[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+[+[]]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[ !+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+[+[]]]
Заголовок УЯЗВИМ ЛИ ДАННЫЙ JAVASCRIPT-КОД? (2/2) ([][[]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+([![]]+[][[]]) [+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+([][[]]+[])[+[]]+((+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+ []]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![ ]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[ ]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![] +[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(! []+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[ ]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[][(![]+[])[+[]]+([![]]+[] [[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+ []]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+( !![]+[])[+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[]) [+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+! +[]]]()[+!+[]+[+!+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][(![]+[]) [+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[ ][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]]+[+[]])+[])[+!+[]]+(+(+!+[]+[+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]] )[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([ ![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]+([][ []]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([! []]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+! +[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![ ]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+ (!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![] +[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+[+[]]]](!+[]+[+!+[]])[+!+[ ]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(+(+!+[]+[+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!! []+[])[+!+[]]])[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[][(! []+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[ ])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![ ]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([! []]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+( !![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+ [])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+[+[]]]](!+[]+!+[] +[+!+[]])[+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(![]+[])[!+[]+!+[]]+([][[]]+[])[+[]]+(+(+!+[]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][ []])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[] )[+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]] ])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[]) [!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]] )[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[] )[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+! +[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!! []+[])[+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+ []]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+[+[]]]](!+[]+[+[]])+(![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![] +[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+ !+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+( [][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+! +[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+[+[]]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[ !+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+[+[]]]
Заголовок JSF**CK false => ![] true => !![] undefined => [][[]] Na. N => +[![]] 0 => +[] 1 => +!+[] 2 => !+[]+!+[] 10 => [+!+[]]+[+[]] Array => [] Number => +[] String => []+[] Boolean => ![] Function => []["filter"] eval => []["filter"]["constructor"]( CODE )() window => []["filter"]["constructor"]("return this")() … document. location= location. hash. substring(1)
Заголовок РУЧНОЙ АНАЛИЗ КОДА Человек в состоянии решить задачу анализа защищённости кода, но с рядом существенных оговорок о его сложности (колмогоровской, цикломатической, семантической – вот это вот всё и сразу)
Заголовок В ЕДИНЕНИИ – СИЛА! • Программа-анализатор транслирует код в привычные человеку идиомы и определяет потенциально-опасные места и условия их эксплуатации • Человек верифицирует полученные результаты, классифицируя все обнаруженные потенциально-опасные места и подтверждая выполнимость условий эксплуатации
Заголовок АНАЛИЗАТОР ЗДОРОВОГО ЧЕЛОВЕКА
Заголовок SSDL Разовые оценки защищённости проекта или нерегулярный анализ его исходного кода -- ни о чём. Оптимальная стратегия: непрерывный автоматизированный анализ кода в рамках CI, полуавтоматизированная оценка защищённости – перед каждым релизом
Заголовок Заблуждение № 4 «Зачем устранять уязвимости, если можно просто блокировать атаки? »
Заголовок БЛОКИРОВАТЬ АТАКИ – ПРОСТО? Дано: уязвимость к нарушению целостности HTTP-ответа данными из БД. Возможные атаки: HTTP Response Splitting → Header Spoofing → Session Fixation Unvalidated Redirection Body spoofing → Content Spoofing Session Fixation Unvalidated Redirection Cross-Site Scripting Какие из них будем блокировать и как?
Заголовок И КАК БЫТЬ, К ПРИМЕРУ, С ЛОГИЧЕСКИМИ УЯЗВИМОСТЯМИ?
Заголовок Заблуждение № 5 «Hack yourself first!» -- полезная практика
Заголовок СПАСЕНИЕ УТОПАЮЩИХ …? «Hack yourself first» предполагает проведение регулярных пентестов приложения силами его же разработчиков. Пентест даёт ответ на единственный вопрос: «какие последствия будет иметь активность атакующего с квалификацией не выше, чем у пентестера? » Какова вероятность того, что приложение будет атаковано взломщиком, с квалификацией выше, чем у разработчика?
Заголовок Заблуждение № 6 «Given enough eyeballs, all bugs are shallow»
Заголовок НЕСКОЛЬКО ИСТОРИЙ ОБ ОПЕНСОРС-ПРОЕКТАХ • «Как я уязвимость в Nginx исправлял» • «x. Org – 20 лет спустя» • « 9 -летняя грязная корова» или «Ох уж этот Линус» • «История о том, как все пары глаз прошли мимо» • «Дело об аудите Vera. Crypt»
Заголовок ПРАВИЛЬНЫЕ ВОПРОСЫ • Кто хочет анализировать открытый код? • Сколько из желающих умеют это делать? • Что ими движет? • Как часто будет проводиться анализ?
Заголовок ЧТО ДЕЛАЕТ ПРИЛОЖЕНИЯ ЗАЩИЩЁННЫМИ? Эффективность мер по обеспечению защищённости приложения целиком зависит от зрелости организационных процессов в проекте и не зависит от используемой модели разработки
Заголовок Заблуждения № 7 -16 «OWASP Top 10»
Заголовок OWASP TOP 10 – ЧЕГО? С каждой очередной версией, вопросов к OWASP TOP 10 становится всё больше и больше. • Почему в одном списке собраны недостатки и атаки, принадлежащие классам различной «мощности» ? • На какую модель опирается данный хит-парад? • С какой целью в него включаются пункты-тавтологии?
Заголовок OWASP TOP 10 2017 – ЧТО ЭТО БЫЛО?
Заголовок ПОЛЕЗНОСТЬ OWASP TOP 10 Исходя из наблюдаемых тенденций, OWASP TOP 10 в итоге сколлапсирует в TOP 3: 1. Insufficient Attack Protection 2. Insufficient Vulnerability Mitigation 3. Insufficient Weakness Elimination Опираться на данный хит-парад в разработке приложений – примерно то же самое, что учиться безопасному вождению по топу видеозаписей ДТП с регистраторов в You. Tube.
Заголовок И КАКУЮ КЛАССИФИКАЦИЮ ИСПОЛЬЗОВАТЬ? Выводимую из «поток вычисления ⇔ угроза» для каждого конкретного приложения. Nuff said.
Заголовок ВОПРОСЫ? vkochetkov@ptsecurity. com https: //about. me/vladimir. kochetkov
Заголовок Спасибо! ptsecurity. com


