SlideShare a Scribd company logo
Заголовок
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
Спасибо!
Спасибо!

More Related Content

PDF
Формальные методы защиты приложений
PDF
[JAM 1.1] Clean Code (Paul Malikov)
PPTX
Исключительно простая теория AppSec .NET
PPTX
Прикладная теория Application Security
PPTX
Современные подходы к SAST
PPTX
course js day 2
PDF
Конкурентные ассоциативные контейнеры
PPTX
основы Java переменные, циклы
Формальные методы защиты приложений
[JAM 1.1] Clean Code (Paul Malikov)
Исключительно простая теория AppSec .NET
Прикладная теория Application Security
Современные подходы к SAST
course js day 2
Конкурентные ассоциативные контейнеры
основы Java переменные, циклы

What's hot (18)

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

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

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

More from Positive Hack Days (20)

PPTX
Инструмент ChangelogBuilder для автоматической подготовки Release Notes
PPTX
Как мы собираем проекты в выделенном окружении в Windows Docker
PPTX
Типовая сборка и деплой продуктов в Positive Technologies
PPTX
Аналитика в проектах: TFS + Qlik
PPTX
Использование анализатора кода SonarQube
PPTX
Развитие сообщества Open DevOps Community
PPTX
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
PPTX
Автоматизация построения правил для Approof
PDF
Мастер-класс «Трущобы Application Security»
PDF
Эвристические методы защиты приложений
PPTX
От экспериментального программирования к промышленному: путь длиной в 10 лет
PDF
Уязвимое Android-приложение: N проверенных способов наступить на грабли
PPTX
Требования по безопасности в архитектуре ПО
PDF
Формальная верификация кода на языке Си
PPTX
Механизмы предотвращения атак в ASP.NET Core
PDF
SOC для КИИ: израильский опыт
PDF
Honeywell Industrial Cyber Security Lab & Services Center
PDF
Credential stuffing и брутфорс-атаки
PDF
Доклад SiteSecure
PDF
Практический опыт защиты финансовых транзакций клиентов Банка
Инструмент ChangelogBuilder для автоматической подготовки Release Notes
Как мы собираем проекты в выделенном окружении в Windows Docker
Типовая сборка и деплой продуктов в Positive Technologies
Аналитика в проектах: TFS + Qlik
Использование анализатора кода SonarQube
Развитие сообщества Open DevOps Community
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
Автоматизация построения правил для Approof
Мастер-класс «Трущобы Application Security»
Эвристические методы защиты приложений
От экспериментального программирования к промышленному: путь длиной в 10 лет
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Требования по безопасности в архитектуре ПО
Формальная верификация кода на языке Си
Механизмы предотвращения атак в ASP.NET Core
SOC для КИИ: израильский опыт
Honeywell Industrial Cyber Security Lab & Services Center
Credential stuffing и брутфорс-атаки
Доклад 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. ЗаголовокКЛАССИФИКАЦИЯ: ОБХОД БИЗНЕС-ЛОГИКИ (ЧАСТНЫЙ СЛУЧАЙ) Признак Значение Предметная область Онлайн-торговля Недостаток Неэффективный контроль использования купонов на скидку Информационный поток Поток операций транзакции оплаты заказа Угроза Нарушение авторизованности