SlideShare uma empresa Scribd logo
1 de 88
Заголовок
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
Спасибо!
Спасибо!

Mais conteúdo relacionado

Mais procurados

Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиSQALab
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C codeDenis Efremov
 
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 27bits
 
Making of external DSL for Django ORM - Павел Петлинский, Rambler&Co
Making of external DSL for Django ORM - Павел Петлинский, Rambler&CoMaking of external DSL for Django ORM - Павел Петлинский, Rambler&Co
Making of external DSL for Django ORM - Павел Петлинский, Rambler&Coit-people
 
Haskell
HaskellHaskell
HaskellDevDay
 
Философия Application Security
Философия Application SecurityФилософия Application Security
Философия Application SecurityVladimir Kochetkov
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3Eugeniy Tyumentcev
 
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеAlexander Byndyu
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерSergey Platonov
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"Technopark
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормозаAlexander Shigin
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Sergey Schetinin
 
Подводные камни System.Security.Cryptography
Подводные камни System.Security.CryptographyПодводные камни System.Security.Cryptography
Подводные камни System.Security.CryptographyVladimir Kochetkov
 

Mais procurados (18)

Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C code
 
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
 
Making of external DSL for Django ORM - Павел Петлинский, Rambler&Co
Making of external DSL for Django ORM - Павел Петлинский, Rambler&CoMaking of external DSL for Django ORM - Павел Петлинский, Rambler&Co
Making of external DSL for Django ORM - Павел Петлинский, Rambler&Co
 
XML Magic
XML MagicXML Magic
XML Magic
 
Tricky Java Generics
Tricky Java GenericsTricky Java Generics
Tricky Java Generics
 
Haskell
HaskellHaskell
Haskell
 
Философия Application Security
Философия Application SecurityФилософия Application Security
Философия Application Security
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 
ООП_лекция_11
ООП_лекция_11ООП_лекция_11
ООП_лекция_11
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Fiche Révision POO
Fiche Révision POOFiche Révision POO
Fiche Révision POO
 
Подводные камни System.Security.Cryptography
Подводные камни System.Security.CryptographyПодводные камни System.Security.Cryptography
Подводные камни System.Security.Cryptography
 

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

An Exceptionally Simple Theory of AppSec .NET
An Exceptionally Simple Theory of AppSec .NETAn Exceptionally Simple Theory of AppSec .NET
An Exceptionally Simple Theory of AppSec .NETMikhail Shcherbakov
 
AppSec -- хакерский путь
AppSec -- хакерский путьAppSec -- хакерский путь
AppSec -- хакерский путьVladimir Kochetkov
 
Паттерны проектирования источников данных
Паттерны проектирования источников данныхПаттерны проектирования источников данных
Паттерны проектирования источников данныхAlex Polorotov
 
паттерны проектирования источников данных
паттерны проектирования источников данныхпаттерны проектирования источников данных
паттерны проектирования источников данныхVitaliy Trenkenshu
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиZestranec
 
Advanced Sql Injection
Advanced Sql InjectionAdvanced Sql Injection
Advanced Sql InjectionDmitry Evteev
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиГлеб Тарасов
 
Метапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScriptМетапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScriptTimur Shemsedinov
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreDataDmitriy Kuragin
 
Formal verification of operating system kernels
Formal verification of operating system kernelsFormal verification of operating system kernels
Formal verification of operating system kernelsDenis Efremov
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
 
Rambler.iOS #3: Test-Driven Development в iOS
Rambler.iOS #3: Test-Driven Development в iOSRambler.iOS #3: Test-Driven Development в iOS
Rambler.iOS #3: Test-Driven Development в iOSRAMBLER&Co
 

Semelhante a Теоретические основы Application Security (15)

Трущобы Application Security
Трущобы Application SecurityТрущобы Application Security
Трущобы Application Security
 
An Exceptionally Simple Theory of AppSec .NET
An Exceptionally Simple Theory of AppSec .NETAn Exceptionally Simple Theory of AppSec .NET
An Exceptionally Simple Theory of AppSec .NET
 
AppSec -- хакерский путь
AppSec -- хакерский путьAppSec -- хакерский путь
AppSec -- хакерский путь
 
Паттерны проектирования источников данных
Паттерны проектирования источников данныхПаттерны проектирования источников данных
Паттерны проектирования источников данных
 
паттерны проектирования источников данных
паттерны проектирования источников данныхпаттерны проектирования источников данных
паттерны проектирования источников данных
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
 
PT MIFI Labsql
PT MIFI LabsqlPT MIFI Labsql
PT MIFI Labsql
 
Advanced Sql Injection
Advanced Sql InjectionAdvanced Sql Injection
Advanced Sql Injection
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с данными
 
PT Hackday#2
PT Hackday#2PT Hackday#2
PT Hackday#2
 
Метапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScriptМетапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScript
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreData
 
Formal verification of operating system kernels
Formal verification of operating system kernelsFormal verification of operating system kernels
Formal verification of operating system kernels
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 
Rambler.iOS #3: Test-Driven Development в iOS
Rambler.iOS #3: Test-Driven Development в iOSRambler.iOS #3: Test-Driven Development в iOS
Rambler.iOS #3: Test-Driven Development в iOS
 

Mais de Positive Hack Days

Инструмент ChangelogBuilder для автоматической подготовки Release Notes
Инструмент ChangelogBuilder для автоматической подготовки Release NotesИнструмент ChangelogBuilder для автоматической подготовки Release Notes
Инструмент ChangelogBuilder для автоматической подготовки Release NotesPositive Hack Days
 
Как мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows DockerКак мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows DockerPositive Hack Days
 
Типовая сборка и деплой продуктов в Positive Technologies
Типовая сборка и деплой продуктов в Positive TechnologiesТиповая сборка и деплой продуктов в Positive Technologies
Типовая сборка и деплой продуктов в Positive TechnologiesPositive Hack Days
 
Аналитика в проектах: TFS + Qlik
Аналитика в проектах: TFS + QlikАналитика в проектах: TFS + Qlik
Аналитика в проектах: TFS + QlikPositive Hack Days
 
Использование анализатора кода SonarQube
Использование анализатора кода SonarQubeИспользование анализатора кода SonarQube
Использование анализатора кода SonarQubePositive Hack Days
 
Развитие сообщества Open DevOps Community
Развитие сообщества Open DevOps CommunityРазвитие сообщества Open DevOps Community
Развитие сообщества Open DevOps CommunityPositive Hack Days
 
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...Positive Hack Days
 
Автоматизация построения правил для Approof
Автоматизация построения правил для ApproofАвтоматизация построения правил для Approof
Автоматизация построения правил для ApproofPositive Hack Days
 
Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»Positive Hack Days
 
Эвристические методы защиты приложений
Эвристические методы защиты приложенийЭвристические методы защиты приложений
Эвристические методы защиты приложенийPositive Hack Days
 
От экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 летОт экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 летPositive Hack Days
 
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на граблиУязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на граблиPositive Hack Days
 
Требования по безопасности в архитектуре ПО
Требования по безопасности в архитектуре ПОТребования по безопасности в архитектуре ПО
Требования по безопасности в архитектуре ПОPositive Hack Days
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Hack Days
 
Механизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET CoreМеханизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET CorePositive Hack Days
 
SOC для КИИ: израильский опыт
SOC для КИИ: израильский опытSOC для КИИ: израильский опыт
SOC для КИИ: израильский опытPositive Hack Days
 
Honeywell Industrial Cyber Security Lab & Services Center
Honeywell Industrial Cyber Security Lab & Services CenterHoneywell Industrial Cyber Security Lab & Services Center
Honeywell Industrial Cyber Security Lab & Services CenterPositive Hack Days
 
Credential stuffing и брутфорс-атаки
Credential stuffing и брутфорс-атакиCredential stuffing и брутфорс-атаки
Credential stuffing и брутфорс-атакиPositive Hack Days
 
Практический опыт защиты финансовых транзакций клиентов Банка
Практический опыт защиты финансовых транзакций клиентов БанкаПрактический опыт защиты финансовых транзакций клиентов Банка
Практический опыт защиты финансовых транзакций клиентов БанкаPositive Hack Days
 

Mais de Positive Hack Days (20)

Инструмент ChangelogBuilder для автоматической подготовки Release Notes
Инструмент ChangelogBuilder для автоматической подготовки Release NotesИнструмент ChangelogBuilder для автоматической подготовки Release Notes
Инструмент ChangelogBuilder для автоматической подготовки Release Notes
 
Как мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows DockerКак мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows Docker
 
Типовая сборка и деплой продуктов в Positive Technologies
Типовая сборка и деплой продуктов в Positive TechnologiesТиповая сборка и деплой продуктов в Positive Technologies
Типовая сборка и деплой продуктов в Positive Technologies
 
Аналитика в проектах: TFS + Qlik
Аналитика в проектах: TFS + QlikАналитика в проектах: TFS + Qlik
Аналитика в проектах: TFS + Qlik
 
Использование анализатора кода SonarQube
Использование анализатора кода SonarQubeИспользование анализатора кода SonarQube
Использование анализатора кода SonarQube
 
Развитие сообщества Open DevOps Community
Развитие сообщества Open DevOps CommunityРазвитие сообщества Open DevOps Community
Развитие сообщества Open DevOps Community
 
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
 
Автоматизация построения правил для Approof
Автоматизация построения правил для ApproofАвтоматизация построения правил для Approof
Автоматизация построения правил для Approof
 
Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»
 
Эвристические методы защиты приложений
Эвристические методы защиты приложенийЭвристические методы защиты приложений
Эвристические методы защиты приложений
 
От экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 летОт экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 лет
 
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на граблиУязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на грабли
 
Требования по безопасности в архитектуре ПО
Требования по безопасности в архитектуре ПОТребования по безопасности в архитектуре ПО
Требования по безопасности в архитектуре ПО
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Механизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET CoreМеханизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET Core
 
SOC для КИИ: израильский опыт
SOC для КИИ: израильский опытSOC для КИИ: израильский опыт
SOC для КИИ: израильский опыт
 
Honeywell Industrial Cyber Security Lab & Services Center
Honeywell Industrial Cyber Security Lab & Services CenterHoneywell Industrial Cyber Security Lab & Services Center
Honeywell Industrial Cyber Security Lab & Services Center
 
Credential stuffing и брутфорс-атаки
Credential stuffing и брутфорс-атакиCredential stuffing и брутфорс-атаки
Credential stuffing и брутфорс-атаки
 
Доклад SiteSecure
Доклад SiteSecureДоклад SiteSecure
Доклад SiteSecure
 
Практический опыт защиты финансовых транзакций клиентов Банка
Практический опыт защиты финансовых транзакций клиентов БанкаПрактический опыт защиты финансовых транзакций клиентов Банка
Практический опыт защиты финансовых транзакций клиентов Банка
 

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

  • 2. Заголовок Предметная область, рассматривающая в качестве объекта защиты гипотетическую информационную систему (ИС): • включающую в себя конкретное приложение • объединяющую объекты окружения в единую сущность • замкнутую относительно информационных потоков приложения APPSEC (APPLICATION SECURITY) 1/2
  • 3. ЗаголовокAPPSEC (APPLICATION SECURITY) 2/2 Входные данные Конфигурация окружения Исполняющая среда Выходные данные Приложение Окружение Граница доверия
  • 4. Заголовок • вне области влияния приложения его окружение защищено • логика предметной области приложения корректна ДОПУЩЕНИЯ APPSEC
  • 6. Заголовок Множество сущностей, их инвариантов и отношений в рамках описываемых процессов ПРЕДМЕТНАЯ ОБЛАСТЬ
  • 7. Заголовок Абстракция объекта в некотором контексте, обладающая следующими характеристиками: • свойство – значимый атрибут абстрагируемого сущностью объекта; • состояние– множество текущих значений всех свойств сущности; • инвариант– множество допустимых состояний сущности. Отношение – утверждение, определяющее взаимосвязь изменения состояний сущностей. СУЩНОСТЬ
  • 8. Заголовок Каскадное изменение состояний сущностей в соответствии с их отношениями вследствие однократного воздействия на одну из них ОПЕРАЦИЯ
  • 11. Заголовок Сущность: точки на карте города • свойство: координаты – пара значений «широта-долгота»; • инвариант: координаты принадлежат перекресткам города или строениям. Сущность: маршрут • свойство: путь - упорядоченное множество точек на карте города; • инвариант: путь непрерывен, проходит по улицам города в соответствии с ПДД; • отношение: оптимальность – длина пути минимальна для заданных начальной и конечной точек. Сущности: точка загрузки, точка доставки • свойство: точка на карте города; • инвариант: координаты принадлежат строениям. ПРИМЕР: ЛОГИСТИКА
  • 12. Заголовок В терминах предметной области логистики: построить оптимальный маршрут из точки загрузки, проходящий через все точки доставки по одному разу и возвращающийся в точку загрузки. ПРИМЕР: ЛОГИСТИКА
  • 13. Заголовок В терминах предметной области теории графов: Найти гамильтонов цикл минимального веса в полном (дополненном ребрами бесконечной длины) взвешенном графе. ПРИМЕР: ЛОГИСТИКА
  • 14. Заголовок Позволяют строить абстрактные модели предметных областей. ОБОБЩЁННЫЕ ПРЕДМЕТНЫЕ ОБЛАСТИ
  • 15. ЗаголовокПРЕДМЕТНЫЕ ОБЛАСТИ ПРИЛОЖЕНИЙ Вторичные: • защищенность; • отказоустойчивость; • опыт взаимодействия, • производительность. Первичные (основные): ― интернет-торговля; ― онлайн-банкинг; ― бухучет; ― … (тысячи их). Каждое приложение реализует модели как основной предметной области, так и множество моделей вторичных предметных областей
  • 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. ЗаголовокСОСТОЯНИЕ ПРИЛОЖЕНИЯ (ПРИМЕР) 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) }
  • 48. Заголовок Граф переходов между состояниями приложения определяет все возможные потоки вычисления и является искомой моделью процесса его выполнения ГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ
  • 57. Заголовок Приводимые далее термины и определения локальны и не претендуют на признание в качестве общеупотребительных. Тем не менее, они устраняют существующие разночтения и противоречия в традиционной терминологии, позволяя перейти от интуитивных формулировок к формальным. DISCLAIMER
  • 58. Заголовок Театр начинается с вешалки, а незащищённость ИС – с её недостатков С ЧЕГО НАЧНЁМ?
  • 59. Заголовок Неэффективная реализация процессов вычисления, логики предметной области или конфигурации окружения ИС НЕДОСТАТОК
  • 60. Заголовок Обусловленная недостатком возможность нарушения свойств состояния защищенности информационного потока: • конфиденциальности; • целостности; • доступности; • авторизованности; • аутентичности. УГРОЗА
  • 62. Заголовок Конкретный способ реализации угрозы (эксплуатации {состояния} уязвимости) АТАКА
  • 64. Заголовок Состояние приемлемого риска реализации любой угрозы БЕЗОПАСНОСТЬ
  • 65. Заголовок То, что может сделать атакующий с потоками информации, называется угрозой (threat) То, когда и благодаря чему он может это сделать, называется уязвимостью (vulnerability), обусловленной недостатком (weakness) ИНЫМИ СЛОВАМИ
  • 66. Заголовок То, как он может это сделать, называется атакой (attack) То, с какой вероятностью у него это удастся и какие последствия может повлечь, называется риском (risk) ИНЫМИ СЛОВАМИ
  • 67. Заголовок То, что не позволяет атакующему провести атаку, обеспечивает защищенность (security) То, что минимизирует риск, обеспечивает безопасность (safety) ИНЫМИ СЛОВАМИ
  • 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) The Essence 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. ЗаголовокКЛАССИФИКАЦИЯ: ОБХОД БИЗНЕС-ЛОГИКИ (ЧАСТНЫЙ СЛУЧАЙ) Признак Значение Предметная область Онлайн-торговля Недостаток Неэффективный контроль использования купонов на скидку Информационный поток Поток операций транзакции оплаты заказа Угроза Нарушение авторизованности