Заголовок ptsecurity.com Теоретические основы Application Security
Заголовок Предметная область, рассматривающая в качестве объекта защиты гипотетическую информационную систему (ИС): • включающую в себя конкретное приложение • объединяющую объекты окружения в единую сущность • замкнутую относительно информационных потоков приложения APPSEC (APPLICATION SECURITY) 1/2
ЗаголовокAPPSEC (APPLICATION SECURITY) 2/2 Входные данные Конфигурация окружения Исполняющая среда Выходные данные Приложение Окружение Граница доверия
Заголовок • вне области влияния приложения его окружение защищено • логика предметной области приложения корректна ДОПУЩЕНИЯ APPSEC
Заголовок Предметная область Application Security
Заголовок Множество сущностей, их инвариантов и отношений в рамках описываемых процессов ПРЕДМЕТНАЯ ОБЛАСТЬ
Заголовок Абстракция объекта в некотором контексте, обладающая следующими характеристиками: • свойство – значимый атрибут абстрагируемого сущностью объекта; • состояние– множество текущих значений всех свойств сущности; • инвариант– множество допустимых состояний сущности. Отношение – утверждение, определяющее взаимосвязь изменения состояний сущностей. СУЩНОСТЬ
Заголовок Каскадное изменение состояний сущностей в соответствии с их отношениями вследствие однократного воздействия на одну из них ОПЕРАЦИЯ
Заголовок Допустимая последовательность (поток) операций ПРОЦЕСС
Заголовок Неделимая последовательность операций в потоке ТРАНЗАКЦИЯ
Заголовок Сущность: точки на карте города • свойство: координаты – пара значений «широта-долгота»; • инвариант: координаты принадлежат перекресткам города или строениям. Сущность: маршрут • свойство: путь - упорядоченное множество точек на карте города; • инвариант: путь непрерывен, проходит по улицам города в соответствии с ПДД; • отношение: оптимальность – длина пути минимальна для заданных начальной и конечной точек. Сущности: точка загрузки, точка доставки • свойство: точка на карте города; • инвариант: координаты принадлежат строениям. ПРИМЕР: ЛОГИСТИКА
Заголовок В терминах предметной области логистики: построить оптимальный маршрут из точки загрузки, проходящий через все точки доставки по одному разу и возвращающийся в точку загрузки. ПРИМЕР: ЛОГИСТИКА
Заголовок В терминах предметной области теории графов: Найти гамильтонов цикл минимального веса в полном (дополненном ребрами бесконечной длины) взвешенном графе. ПРИМЕР: ЛОГИСТИКА
Заголовок Позволяют строить абстрактные модели предметных областей. ОБОБЩЁННЫЕ ПРЕДМЕТНЫЕ ОБЛАСТИ
ЗаголовокПРЕДМЕТНЫЕ ОБЛАСТИ ПРИЛОЖЕНИЙ Вторичные: • защищенность; • отказоустойчивость; • опыт взаимодействия, • производительность. Первичные (основные): ― интернет-торговля; ― онлайн-банкинг; ― бухучет; ― … (тысячи их). Каждое приложение реализует модели как основной предметной области, так и множество моделей вторичных предметных областей
Заголовок Предметная область Application Security
Заголовок Поскольку защищённость – темпоральное свойство, модель приложения должна отражать процесс его выполнения ВЫБОР МОДЕЛИ ПРИЛОЖЕНИЯ
Заголовок Приложение можно представить в виде базовых блоков, между которыми передаётся управление в процессе выполнения приложения ПОТОКИ УПРАВЛЕНИЯ
ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 1/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 2/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 3/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 4/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 5/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 6/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 7/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 8/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 9/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 10/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 11/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 12/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 13/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 14/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР 15/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
Заголовок Потоки выполнения приложения являются производными от потоков данных окружения ПОТОКИ ДАННЫХ
ЗаголовокПОТОКИ ДАННЫХ (ПРИМЕР 1/9) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ ДАННЫХ (ПРИМЕР 2/9) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ ДАННЫХ (ПРИМЕР 3/9) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ ДАННЫХ (ПРИМЕР 4/9) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ ДАННЫХ (ПРИМЕР 5/9) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ ДАННЫХ (ПРИМЕР 6/9) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ ДАННЫХ (ПРИМЕР 7/9) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ ДАННЫХ (ПРИМЕР 8/9) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
ЗаголовокПОТОКИ ДАННЫХ (ПРИМЕР 9/9) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); } str1 ∈ { Encoding.UTF8.GetString(data), "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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); } str1 ∈ { Encoding.UTF8.GetString(data), "Wrong Key!" } name ∈ { Request.Params["name"] } key1 ∈ { Request.Params["key1"] } parm ∈ { Request.Params["parm"] } data ∈ { new char[0], Convert.FromBse64String(parm) }
Заголовок Граф переходов между состояниями приложения определяет все возможные потоки вычисления и является искомой моделью процесса его выполнения ГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ
ЗаголовокГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 1/7)
ЗаголовокГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 2/7)
ЗаголовокГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 3/7)
ЗаголовокГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 4/7)
ЗаголовокГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 5/7)
ЗаголовокГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 6/7)
ЗаголовокГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 7/7)
Заголовок Предметная область Application Security
Заголовок Приводимые далее термины и определения локальны и не претендуют на признание в качестве общеупотребительных. Тем не менее, они устраняют существующие разночтения и противоречия в традиционной терминологии, позволяя перейти от интуитивных формулировок к формальным. DISCLAIMER
Заголовок Театр начинается с вешалки, а незащищённость ИС – с её недостатков С ЧЕГО НАЧНЁМ?
Заголовок Неэффективная реализация процессов вычисления, логики предметной области или конфигурации окружения ИС НЕДОСТАТОК
Заголовок Обусловленная недостатком возможность нарушения свойств состояния защищенности информационного потока: • конфиденциальности; • целостности; • доступности; • авторизованности; • аутентичности. УГРОЗА
Заголовок Состояние возможности реализации угрозы УЯЗВИМОСТЬ
Заголовок Конкретный способ реализации угрозы (эксплуатации {состояния} уязвимости) АТАКА
Заголовок Состояние невозможности реализации любой угрозы ЗАЩИЩЁННОСТЬ
Заголовок Состояние приемлемого риска реализации любой угрозы БЕЗОПАСНОСТЬ
Заголовок То, что может сделать атакующий с потоками информации, называется угрозой (threat) То, когда и благодаря чему он может это сделать, называется уязвимостью (vulnerability), обусловленной недостатком (weakness) ИНЫМИ СЛОВАМИ
Заголовок То, как он может это сделать, называется атакой (attack) То, с какой вероятностью у него это удастся и какие последствия может повлечь, называется риском (risk) ИНЫМИ СЛОВАМИ
Заголовок То, что не позволяет атакующему провести атаку, обеспечивает защищенность (security) То, что минимизирует риск, обеспечивает безопасность (safety) ИНЫМИ СЛОВАМИ
ЗаголовокПричины и следствия Недостаток (weakness) Угроза (threat) Уязвимость (vulnerability) Атака (attack) Риск (risk) Незащищенность (insecurity) Небезопасность (unsafety)
Заголовок Информационная безопасность Защищённость приложений Разница между ИБ и AppSec
Заголовок Предметная область Application Security
Заголовок • Потоки операций являются и информационными потоками, и сущностями модели основной предметной области приложения • Потоки вычисления являются и информационными потоками, и сущностями предметной области защищённости приложения • Потоки данных окружения являются и информационными потоками, и сущностями модели окружения А ТЕПЕРЬ – ВСЁ ВМЕСТЕ
Заголовок • Недостаток – неэффективная реализация моделей предметных областей приложения или окружения (контролей инвариантов их сущностей) Примеры контролей: • предварительная обработка потоков данных; • подтверждение аутентичности потоков операций; • проверка прав доступа к потокам данных; • обеспечение целостности потока операций; • … А ТЕПЕРЬ – ВСЁ ВМЕСТЕ
Заголовок • Уязвимость приложения – состояние возможности нарушения конфиденциальности, целостности, доступности, аутентичности или авторизованности любого из потоков операций или вычисления приложения, а также потоков данных окружения • Состояние защищённости приложения возникает при невозможности эксплуатации в нём любой уязвимости А ТЕПЕРЬ – ВСЁ ВМЕСТЕ
Заголовок • Вычислительный – уязвимости, описываемые в терминах модели процесса выполнения приложения • Логический – уязвимости, описываемые в терминах модели предметной области приложения • Экзогенный – уязвимости, описываемые в терминах модели окружения СУПЕРКЛАССЫ УЯЗВИМОСТЕЙ ПРИЛОЖЕНИЯ
Заголовок «Не сегодня!» ЧТО МЫ СКАЖЕМ ЛОГИЧЕСКОМУ И ЭКЗОГЕННОМУ КЛАССАМ?
Заголовок Атаки на нарушение целостности потоков данных в результате их преобразования принято называть инъекциями Тип инъекции определяется грамматикой атакуемого потока данных (HTML, XML, SQL, XPath, XQuery, LDAP, LINQ, Path, …) ВЫЧИСЛИТЕЛЬНЫЙ КЛАСС: ИНЪЕКЦИИ
Заголовок «Пусть C - граф потоков вычисления приложения. Пусть pvf(t) - достижимая вершина потока управления на C, являющаяся вызовом функции прямой или косвенной интерпретации текста t, соответствующего известной формальной грамматике G. Пусть e - поток аргумента входных данных на С. Пусть De - множество потоков данных на C, порождаемых от e и достижимых в точке вызова pvf(t), где t принадлежит De» МОДЕЛИРОВАНИЕ ИНЪЕКЦИЙ (1/3)
Заголовок «Тогда приложение уязвимо к угрозе нарушения целостности потоков данных De в точке выполнения pvf(t), если среди них найдётся хотя бы одна пара таких значений, при которых, в результате их синтаксического разбора в соответствии с грамматикой G, получаются не изоморфные друг-другу деревья разбора» МОДЕЛИРОВАНИЕ ИНЪЕКЦИЙ (2/3)
ЗаголовокМОДЕЛИРОВАНИЕ ИНЪЕКЦИЙ (3/3) The Essence of Command Injection Attacks in Web Applications (http://web.cs.ucdavis.edu/~su/publications/popl06.pdf)
Заголовок Несогласованная работа с разделяемом ресурсом в многопоточном окружении приводит к гонкам за ресурс Окружение любого веб-приложения является многопоточным ВЫЧИСЛИТЕЛЬНЫЙ КЛАСС: ГОНКА ЗА РЕСУРС
Заголовок Пусть P – сеть Петри, построенная по C, где переходами сети являются все промежуточные вершины C, позициями – его вершины, соответствующие операциям чтения или записи каждого ресурса окружения, а условиями перехода – условия достижимости соответствующих вершин C. Тогда, возможность появления более одной метки в любом состоянии графа маркировок P укажет на возможность реализации угрозы нарушения целостности или аутентичности потока вычисления. ВЫЧИСЛИТЕЛЬНЫЙ КЛАСС: ГОНКА ЗА РЕСУРС
Заголовок • Направлены на реализацию угрозы (нарушение одного из свойств защищённости какого-либо потока вычисления, операций или данных окружения) • Могут являться как производными от предыдущих атак, так и первообразными для последующих. Например: • HTTP Response Splitting → Header Spoofing → Session Fixation Unvalidated Redirection Body spoofing → Content Spoofing Session Fixation Unvalidated Redirection Cross-Site Scripting … СВОЙСТВА АТАК
ЗаголовокКЛАССИФИКАЦИЯ Классификация, объединяющая уязвимости всех классов, опирается на признаки: • предметная область; • недостаток; • атакуемый поток; • угроза.
ЗаголовокКЛАССИФИКАЦИЯ: ИНЪЕКЦИИ Признак Значение Предметная область Защищённость приложения Недостаток Неэффективная обработка потоков данных Информационный поток Поток данных, интерпретируемый окружением Угроза Нарушение целостности
ЗаголовокКЛАССИФИКАЦИЯ: СПУФИНГ ПОТОКА ОПЕРАЦИЙ Признак Значение Предметная область Защищённость приложения Недостаток Неэффективное подтверждение аутентичности идентификатора потока операций Информационный поток Поток операций Угроза Нарушение аутентичности
ЗаголовокКЛАССИФИКАЦИЯ: ПЕРЕПОЛНЕНИЕ БУФЕРА Признак Значение Предметная область Защищённость приложения Недостаток Неэффективный контроль записи производных потоков окружения в память Информационный поток Метаданные на стеке или в куче Угроза Нарушение целостности
ЗаголовокКЛАССИФИКАЦИЯ: ОБХОД БИЗНЕС-ЛОГИКИ (ЧАСТНЫЙ СЛУЧАЙ) Признак Значение Предметная область Онлайн-торговля Недостаток Неэффективный контроль использования купонов на скидку Информационный поток Поток операций транзакции оплаты заказа Угроза Нарушение авторизованности
Заголовок ptsecurity.com Спасибо! Спасибо!

Теоретические основы Application Security

  • 1.
  • 2.
    Заголовок Предметная область, рассматривающаяв качестве объекта защиты гипотетическую информационную систему (ИС): • включающую в себя конкретное приложение • объединяющую объекты окружения в единую сущность • замкнутую относительно информационных потоков приложения APPSEC (APPLICATION SECURITY) 1/2
  • 3.
    ЗаголовокAPPSEC (APPLICATION SECURITY)2/2 Входные данные Конфигурация окружения Исполняющая среда Выходные данные Приложение Окружение Граница доверия
  • 4.
    Заголовок • вне областивлияния приложения его окружение защищено • логика предметной области приложения корректна ДОПУЩЕНИЯ APPSEC
  • 5.
  • 6.
    Заголовок Множество сущностей, ихинвариантов и отношений в рамках описываемых процессов ПРЕДМЕТНАЯ ОБЛАСТЬ
  • 7.
    Заголовок Абстракция объекта внекотором контексте, обладающая следующими характеристиками: • свойство – значимый атрибут абстрагируемого сущностью объекта; • состояние– множество текущих значений всех свойств сущности; • инвариант– множество допустимых состояний сущности. Отношение – утверждение, определяющее взаимосвязь изменения состояний сущностей. СУЩНОСТЬ
  • 8.
    Заголовок Каскадное изменение состоянийсущностей в соответствии с их отношениями вследствие однократного воздействия на одну из них ОПЕРАЦИЯ
  • 9.
  • 10.
  • 11.
    Заголовок Сущность: точки накарте города • свойство: координаты – пара значений «широта-долгота»; • инвариант: координаты принадлежат перекресткам города или строениям. Сущность: маршрут • свойство: путь - упорядоченное множество точек на карте города; • инвариант: путь непрерывен, проходит по улицам города в соответствии с ПДД; • отношение: оптимальность – длина пути минимальна для заданных начальной и конечной точек. Сущности: точка загрузки, точка доставки • свойство: точка на карте города; • инвариант: координаты принадлежат строениям. ПРИМЕР: ЛОГИСТИКА
  • 12.
    Заголовок В терминах предметнойобласти логистики: построить оптимальный маршрут из точки загрузки, проходящий через все точки доставки по одному разу и возвращающийся в точку загрузки. ПРИМЕР: ЛОГИСТИКА
  • 13.
    Заголовок В терминах предметнойобласти теории графов: Найти гамильтонов цикл минимального веса в полном (дополненном ребрами бесконечной длины) взвешенном графе. ПРИМЕР: ЛОГИСТИКА
  • 14.
    Заголовок Позволяют строить абстрактныемодели предметных областей. ОБОБЩЁННЫЕ ПРЕДМЕТНЫЕ ОБЛАСТИ
  • 15.
    ЗаголовокПРЕДМЕТНЫЕ ОБЛАСТИ ПРИЛОЖЕНИЙ Вторичные: •защищенность; • отказоустойчивость; • опыт взаимодействия, • производительность. Первичные (основные): ― интернет-торговля; ― онлайн-банкинг; ― бухучет; ― … (тысячи их). Каждое приложение реализует модели как основной предметной области, так и множество моделей вторичных предметных областей
  • 16.
  • 17.
    Заголовок Поскольку защищённость –темпоральное свойство, модель приложения должна отражать процесс его выполнения ВЫБОР МОДЕЛИ ПРИЛОЖЕНИЯ
  • 18.
    Заголовок Приложение можно представитьв виде базовых блоков, между которыми передаётся управление в процессе выполнения приложения ПОТОКИ УПРАВЛЕНИЯ
  • 19.
    ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР1/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 20.
    ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР2/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 21.
    ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР3/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 22.
    ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР4/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 23.
    ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР5/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 24.
    ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР6/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 25.
    ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР7/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 26.
    ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР8/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 27.
    ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР9/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 28.
    ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР10/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 29.
    ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР11/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 30.
    ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР12/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 31.
    ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР13/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 32.
    ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР14/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 33.
    ЗаголовокПОТОКИ УПРАВЛЕНИЯ (ПРИМЕР15/15) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 34.
    Заголовок Потоки выполнения приложенияявляются производными от потоков данных окружения ПОТОКИ ДАННЫХ
  • 35.
    ЗаголовокПОТОКИ ДАННЫХ (ПРИМЕР1/9) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 36.
    ЗаголовокПОТОКИ ДАННЫХ (ПРИМЕР2/9) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 37.
    ЗаголовокПОТОКИ ДАННЫХ (ПРИМЕР3/9) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 38.
    ЗаголовокПОТОКИ ДАННЫХ (ПРИМЕР4/9) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 39.
    ЗаголовокПОТОКИ ДАННЫХ (ПРИМЕР5/9) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 40.
    ЗаголовокПОТОКИ ДАННЫХ (ПРИМЕР6/9) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 41.
    ЗаголовокПОТОКИ ДАННЫХ (ПРИМЕР7/9) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 42.
    ЗаголовокПОТОКИ ДАННЫХ (ПРИМЕР8/9) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 43.
    ЗаголовокПОТОКИ ДАННЫХ (ПРИМЕР9/9) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); }
  • 44.
    Заголовок Множество всех возможныхзначений потока данных в конкретной точке потока выполнения определяет его состояние СОСТОЯНИЕ ПОТОКА ДАННЫХ
  • 45.
    ЗаголовокСОСТОЯНИЕ ПОТОКА ДАННЫХ(ПРИМЕР) 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); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); } str1 ∈ { Encoding.UTF8.GetString(data), "Wrong Key!" }
  • 46.
    Заголовок Множество состояний всехпотоков данных в конкретной точке потока выполнения определяют состояние приложения СОСТОЯНИЕ ПРИЛОЖЕНИЯ
  • 47.
    ЗаголовокСОСТОЯНИЕ ПРИЛОЖЕНИЯ (ПРИМЕР) varname = Request.Params["name"]; var key1 = Request.Params["key1"]; var parm = Request.Params["parm"]; var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm); string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; } Response.Write(str1); } str1 ∈ { Encoding.UTF8.GetString(data), "Wrong Key!" } name ∈ { Request.Params["name"] } key1 ∈ { Request.Params["key1"] } parm ∈ { Request.Params["parm"] } data ∈ { new char[0], Convert.FromBse64String(parm) }
  • 48.
    Заголовок Граф переходов междусостояниями приложения определяет все возможные потоки вычисления и является искомой моделью процесса его выполнения ГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
    Заголовок Приводимые далее терминыи определения локальны и не претендуют на признание в качестве общеупотребительных. Тем не менее, они устраняют существующие разночтения и противоречия в традиционной терминологии, позволяя перейти от интуитивных формулировок к формальным. DISCLAIMER
  • 58.
    Заголовок Театр начинается свешалки, а незащищённость ИС – с её недостатков С ЧЕГО НАЧНЁМ?
  • 59.
    Заголовок Неэффективная реализация процессоввычисления, логики предметной области или конфигурации окружения ИС НЕДОСТАТОК
  • 60.
    Заголовок Обусловленная недостатком возможностьнарушения свойств состояния защищенности информационного потока: • конфиденциальности; • целостности; • доступности; • авторизованности; • аутентичности. УГРОЗА
  • 61.
  • 62.
    Заголовок Конкретный способ реализацииугрозы (эксплуатации {состояния} уязвимости) АТАКА
  • 63.
  • 64.
    Заголовок Состояние приемлемого рискареализации любой угрозы БЕЗОПАСНОСТЬ
  • 65.
    Заголовок То, что можетсделать атакующий с потоками информации, называется угрозой (threat) То, когда и благодаря чему он может это сделать, называется уязвимостью (vulnerability), обусловленной недостатком (weakness) ИНЫМИ СЛОВАМИ
  • 66.
    Заголовок То, как онможет это сделать, называется атакой (attack) То, с какой вероятностью у него это удастся и какие последствия может повлечь, называется риском (risk) ИНЫМИ СЛОВАМИ
  • 67.
    Заголовок То, что непозволяет атакующему провести атаку, обеспечивает защищенность (security) То, что минимизирует риск, обеспечивает безопасность (safety) ИНЫМИ СЛОВАМИ
  • 68.
  • 69.
  • 70.
  • 71.
    Заголовок • Потоки операцийявляются и информационными потоками, и сущностями модели основной предметной области приложения • Потоки вычисления являются и информационными потоками, и сущностями предметной области защищённости приложения • Потоки данных окружения являются и информационными потоками, и сущностями модели окружения А ТЕПЕРЬ – ВСЁ ВМЕСТЕ
  • 72.
    Заголовок • Недостаток –неэффективная реализация моделей предметных областей приложения или окружения (контролей инвариантов их сущностей) Примеры контролей: • предварительная обработка потоков данных; • подтверждение аутентичности потоков операций; • проверка прав доступа к потокам данных; • обеспечение целостности потока операций; • … А ТЕПЕРЬ – ВСЁ ВМЕСТЕ
  • 73.
    Заголовок • Уязвимость приложения– состояние возможности нарушения конфиденциальности, целостности, доступности, аутентичности или авторизованности любого из потоков операций или вычисления приложения, а также потоков данных окружения • Состояние защищённости приложения возникает при невозможности эксплуатации в нём любой уязвимости А ТЕПЕРЬ – ВСЁ ВМЕСТЕ
  • 74.
    Заголовок • Вычислительный –уязвимости, описываемые в терминах модели процесса выполнения приложения • Логический – уязвимости, описываемые в терминах модели предметной области приложения • Экзогенный – уязвимости, описываемые в терминах модели окружения СУПЕРКЛАССЫ УЯЗВИМОСТЕЙ ПРИЛОЖЕНИЯ
  • 75.
    Заголовок «Не сегодня!» ЧТО МЫСКАЖЕМ ЛОГИЧЕСКОМУ И ЭКЗОГЕННОМУ КЛАССАМ?
  • 76.
    Заголовок Атаки на нарушениецелостности потоков данных в результате их преобразования принято называть инъекциями Тип инъекции определяется грамматикой атакуемого потока данных (HTML, XML, SQL, XPath, XQuery, LDAP, LINQ, Path, …) ВЫЧИСЛИТЕЛЬНЫЙ КЛАСС: ИНЪЕКЦИИ
  • 77.
    Заголовок «Пусть C -граф потоков вычисления приложения. Пусть pvf(t) - достижимая вершина потока управления на C, являющаяся вызовом функции прямой или косвенной интерпретации текста t, соответствующего известной формальной грамматике G. Пусть e - поток аргумента входных данных на С. Пусть De - множество потоков данных на C, порождаемых от e и достижимых в точке вызова pvf(t), где t принадлежит De» МОДЕЛИРОВАНИЕ ИНЪЕКЦИЙ (1/3)
  • 78.
    Заголовок «Тогда приложение уязвимок угрозе нарушения целостности потоков данных De в точке выполнения pvf(t), если среди них найдётся хотя бы одна пара таких значений, при которых, в результате их синтаксического разбора в соответствии с грамматикой G, получаются не изоморфные друг-другу деревья разбора» МОДЕЛИРОВАНИЕ ИНЪЕКЦИЙ (2/3)
  • 79.
    ЗаголовокМОДЕЛИРОВАНИЕ ИНЪЕКЦИЙ (3/3) TheEssence of Command Injection Attacks in Web Applications (http://web.cs.ucdavis.edu/~su/publications/popl06.pdf)
  • 80.
    Заголовок Несогласованная работа сразделяемом ресурсом в многопоточном окружении приводит к гонкам за ресурс Окружение любого веб-приложения является многопоточным ВЫЧИСЛИТЕЛЬНЫЙ КЛАСС: ГОНКА ЗА РЕСУРС
  • 81.
    Заголовок Пусть P –сеть Петри, построенная по C, где переходами сети являются все промежуточные вершины C, позициями – его вершины, соответствующие операциям чтения или записи каждого ресурса окружения, а условиями перехода – условия достижимости соответствующих вершин C. Тогда, возможность появления более одной метки в любом состоянии графа маркировок P укажет на возможность реализации угрозы нарушения целостности или аутентичности потока вычисления. ВЫЧИСЛИТЕЛЬНЫЙ КЛАСС: ГОНКА ЗА РЕСУРС
  • 82.
    Заголовок • Направлены нареализацию угрозы (нарушение одного из свойств защищённости какого-либо потока вычисления, операций или данных окружения) • Могут являться как производными от предыдущих атак, так и первообразными для последующих. Например: • HTTP Response Splitting → Header Spoofing → Session Fixation Unvalidated Redirection Body spoofing → Content Spoofing Session Fixation Unvalidated Redirection Cross-Site Scripting … СВОЙСТВА АТАК
  • 83.
    ЗаголовокКЛАССИФИКАЦИЯ Классификация, объединяющая уязвимостивсех классов, опирается на признаки: • предметная область; • недостаток; • атакуемый поток; • угроза.
  • 84.
    ЗаголовокКЛАССИФИКАЦИЯ: ИНЪЕКЦИИ Признак Значение Предметнаяобласть Защищённость приложения Недостаток Неэффективная обработка потоков данных Информационный поток Поток данных, интерпретируемый окружением Угроза Нарушение целостности
  • 85.
    ЗаголовокКЛАССИФИКАЦИЯ: СПУФИНГ ПОТОКАОПЕРАЦИЙ Признак Значение Предметная область Защищённость приложения Недостаток Неэффективное подтверждение аутентичности идентификатора потока операций Информационный поток Поток операций Угроза Нарушение аутентичности
  • 86.
    ЗаголовокКЛАССИФИКАЦИЯ: ПЕРЕПОЛНЕНИЕ БУФЕРА ПризнакЗначение Предметная область Защищённость приложения Недостаток Неэффективный контроль записи производных потоков окружения в память Информационный поток Метаданные на стеке или в куче Угроза Нарушение целостности
  • 87.
    ЗаголовокКЛАССИФИКАЦИЯ: ОБХОД БИЗНЕС-ЛОГИКИ(ЧАСТНЫЙ СЛУЧАЙ) Признак Значение Предметная область Онлайн-торговля Недостаток Неэффективный контроль использования купонов на скидку Информационный поток Поток операций транзакции оплаты заказа Угроза Нарушение авторизованности
  • 88.