SlideShare a Scribd company logo
1 of 87
Прикладная теория Application Security
Владимир Кочетков
/Positive Technologies/Application Inspector/Team Lead
Образовательная программа «Практическая безопасность»
Agenda
Что?
Теоретический минимум, необходимый для осознанной разработки или
анализа защищенности кода
Зачем?
Перестать следовать культу карго
3
Главный вопрос Жизни,
Вселенной и всего остального…
4
…что такое "уязвимость"?
5
Что такое "уязвимость"?
«Недостаток (слабость) программного (программно-технического) обеспечения
средства или информационной системы в целом, который (которая) может быть
использована для реализации угроз безопасности информации» - ГОСТ Р 56546-
2015
6
Что такое "уязвимость"?
«Недостаток (слабость) программного (программно-технического) обеспечения
средства или информационной системы в целом, который (которая) может быть
использована для реализации угроз безопасности информации» - ГОСТ Р 56546-
2015
«В чем сила, брат?» (с)
7
Что такое "уязвимость"?
«Недостаток (слабость) программного (программно-технического) обеспечения
средства или информационной системы в целом, который (которая) может быть
использована для реализации угроз безопасности информации» - ГОСТ Р 56546-
2015
«В чем сила, брат?» (с)
«Набор входных данных, приводящий машину Тьюринга в запрещенную
конфигурацию» - Computer Science
8
Что такое "уязвимость"?
«Недостаток (слабость) программного (программно-технического) обеспечения
средства или информационной системы в целом, который (которая) может быть
использована для реализации угроз безопасности информации» - ГОСТ Р 56546-
2015
«В чем сила, брат?» (с)
«Набор входных данных, приводящий машину Тьюринга в запрещенную
конфигурацию» - Computer Science
9
Существующие определения не
дают ни малейшего
представления о технической
сущности уязвимости
10
Правильный вопрос: в чем
разница между защищенным и
уязвимым кодом?
11
Что такое "уязвимость"?
var cmd = new SqlCommand("SELECT Value FROM Discounts WHERE CouponCode LIKE '" +
Request["CouponCode"] + "'");
var connection = new SqlConnection(connectionString);
connection.Open();
cmd.Connection = connection;
var couponValue = cmd.ExecuteScalar();
...
12
Что такое "уязвимость"?
var cmd = new SqlCommand("SELECT Value FROM Discounts WHERE CouponCode LIKE '" +
Request["CouponCode"] + "'");
var connection = new SqlConnection(connectionString);
connection.Open();
cmd.Connection = connection;
var couponValue = cmd.ExecuteScalar();
...
Атакующий имеет возможность нарушить целостность
выходного потока данных (кода SQL-запроса), манипулируя
потоком входных данных (параметром HTTP-запроса),
приходящим в операцию выполнения SQL-кода.
13
Что такое "уязвимость"?
var cmd = new SqlCommand("SELECT Value FROM Discounts WHERE CouponCode LIKE
@CouponCode");
cmd.Parameters.AddWithValue("@CouponCode ", Request["CouponCode"]);
var connection = new SqlConnection(connectionString);
connection.Open();
cmd.Connection = connection;
var couponValue = cmd.ExecuteScalar();
...
14
Что такое "уязвимость"?
var cmd = new SqlCommand("SELECT Value FROM Discounts WHERE CouponCode =
@CouponCode");
cmd.Parameters.AddWithValue("@CouponCode ", Request["CouponCode"]);
var connection = new SqlConnection(connectionString);
connection.Open();
cmd.Connection = connection;
var couponValue = cmd.ExecuteScalar();
...
Атакующий имеет возможность нарушить целостность
выходного потока данных (параметра SQL-запроса),
манипулируя потоком входных данных (параметром HTTP-
запроса), приходящим в операцию выполнения SQL-кода,
что может привести к нарушению правил предметной
области приложения.
15
Что такое "уязвимость"?
1)
[Authorize(Roles = "All")]
public ActionResult SomeAction()
{
...
return View();
}
2)
[Authorize(Roles = "Baz, Qux")]
public ActionResult SomeAction()
{
...
return View();
}
16
Что такое "уязвимость"?
1)
[Authorize(Roles = "All")]
public ActionResult SomeAction()
{
...
return View();
}
2)
[Authorize(Roles = "Baz, Qux")]
public ActionResult SomeAction()
{
...
return View();
}
Невозможно оценить
защищенность кода, не
владея всеми предметными
областями приложения (в
данном случае, политики
контроля доступа).
17
Критерии уязвимости
определяются множеством
предметных областей
приложения
18
Примеры предметных областей
Вторичные:
― защищенность;
― отказоустойчивость;
― опыт взаимодействия,
― производительность.
Основные:
― интернет-торговля;
― онлайн-банкинг;
― бухучет;
― … (тысячи их).
Каждое приложение реализует модели как основной предметной области, так и
множество моделей вторичных предметных областей
Application Security – вторичная
предметная область
20
Предметная область Application
Security
21
Сущность
– абстракция реального объекта в некотором контексте, обладающая
следующими характеристиками:
• свойство – значимый атрибут абстрагируемого сущностью объекта или
одноместное отношение;
• состояние– множество текущих значений всех свойств сущности;
• инвариант– множество допустимых состояний сущности.
Отношение – утверждение, определяющее взаимосвязь изменения состояний
сущностей.
22
Предметная область –
множество сущностей, их
инварианты и отношения
23
Пример: логистика
Сущность: точки на карте города
• свойство: координаты – пара значений «широта-долгота»;
• инвариант: координаты принадлежат перекресткам города или строениям.
Сущность: маршрут
• свойство: путь - упорядоченное множество точек на карте города;
• инвариант: путь непрерывен и проходит по улицам города в соответствии с ПДД;
• отношение: оптимальность – длина пути минимальна для одних и тех же
начальной и конечной точек.
Сущности: точка загрузки, точка доставки
• свойство: точка на карте города
24
Задача коммивояжёра
В терминах предметной области логистики:
построить оптимальный маршрут из точки
загрузки, проходящий через все точки доставки по
одному разу и возвращающийся в точку загрузки.
25
Задача коммивояжёра
В терминах предметной области логистики:
построить оптимальный маршрут из точки
загрузки, проходящий через все точки доставки по
одному разу и возвращающийся в точку загрузки.
В терминах предметной области теории графов:
Найти гамильтонов цикл минимального веса в
полном (дополненном ребрами бесконечной длины)
взвешенном графе.
26
Предметная область Application
Security
27
«Трясина Тьюринга» - не только
об эзотерических языках
28
"Modeling Computer Insecurity" (Sophie Engle, Sean Whalen and Matt Bishop):
Провести полный анализ защищенности программы можно, только выполнив ее
на всех возможных наборах входных данных.
Разработка защищенного кода менее трудоемкий процесс, чем анализ
защищенности уже существующего кода.
Вычислимость проблемы защищенности
Статическая оценка защищенности
программы является неразрешимой
проблемой.
Определение защищенности
текущего состояния программы,
очевидно, разрешимо
Применимость теоремы Райса к
реальным системам – такая же
теоретизация, как и идея
описывать приложение в виде
конечного автомата
30
Приложение стоит
рассматривать, как поток
управления, обрабатывающий
множество потоков данных
31
Потоки управления
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
Потоки управления
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
Потоки управления
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
Потоки управления
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);
}
35
Потоки управления
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
Потоки управления
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
Потоки управления
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
Потоки управления
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
Потоки управления
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
Потоки управления
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
Потоки управления
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
Потоки управления
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
Потоки управления
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
Потоки управления
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);
}
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);
}
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);
}
48
Потоки данных
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);
}
49
Потоки данных
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);
}
50
Потоки данных
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);
}
51
Потоки данных
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);
}
52
Потоки данных
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);
}
53
Потоки данных
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);
}
54
Потоки данных
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);
}
55
Потоки данных
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);
}
56
Потоки данных
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);
}
57
Потоки данных
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);
}
58
str1 ∈ {
Encoding.UTF8.GetString(Convert.FromBse64String(Request.Params["parm"])),
"Wrong Key!"
}
Множества значений всех
потоков данных в конкретной
точке потока выполнения
определяют состояние
приложения
59
Граф переходов между
состояниями приложения
определяет все возможные
потоки вычисления
60
Граф потоков вычисления
является семантически-
эквивалентной моделью
приложения
61
Предметная область Application
Security
62
Театр начинается с вешалки, а
уязвимость – с недостатка
63
Недостаток
- неэффективная реализация моделей предметных областей приложения и
контролей инвариантов их сущностей
Примеры контролей Application Security:
• предварительная обработка потоков данных;
• подтверждение аутентичности потоков вычисления;
• проверка прав доступа к потокам данных;
• обеспечение соответствия потока вычисления модели функциональной
предметной области;
• …
64
Угроза
- обусловленная недостатком возможность нарушить состояние защищенности
потока вычисления, лишив его одного из свойств:
• конфиденциальности;
• целостности;
• доступности;
• авторизованности;
• аутентичности;
• аппелируемости;
• подотчетности;
• достоверности;
• <нужное вписать>
65
Конфиденциальность
Состояние потока вычисления, при котором доступ к нему осуществлен только
сущностями, имеющими на это право.
A
E
B
66
Целостность
Состояние потока вычисления, при котором изменения в нем осуществлены
только сущностями, имеющими на это право.
A
E
B
C
67
Доступность
Состояние потока вычисления, при котором доступ к нему могут осуществить все
сущности, имеющие на это право.
A B
68
Авторизованность
Состояние потока вычисления, при котором его источниками являются только
сущности, имеющие на это право.
E
B
A
69
Аутентичность
Состояние потока вычисления, при котором подтверждена подлинность его
источника.
‘A’
B
A
70
Аппелируемость
Состояние потока вычисления, при котором его источник не может отказаться от
того, что он является таковым.
A B
71
Уязвимость – состояние
приложения, в котором возможна
реализация угрозы
72
Невозможность реализации
угрозы в каждой точке потока
вычисления* является
инвариантом защищенности
приложения
73
* …пересекающего границу доверия
Уязвимость бизнес-логики–
состояние реализации угрозы
через нарушение правил
основной предметной области
приложения
74
То, что может сделать с потоками вычисления атакующий, нарушив инварианты
сущностей предметных областей, называется угрозой (threat)
То, где и благодаря чему он может это сделать, называется уязвимостью
(vulnerability), обусловленной недостатком (weakness)
То, как он может это сделать, называется атакой (attack)
То, с какой вероятностью у него это удастся и какие последствия может повлечь,
называется риском (risk)
Иными словами…
75
То, что не позволяет атакующему
провести атаку, обеспечивает
защищенность (security)
76
То, что минимизирует риск,
обеспечивает безопасность
(safety)
77
Акцентировать внимание
разработчикам и пентестерам
необходимо на причинах*, а не
на следствиях**!
* недостатки
** уязвимости, атаки или риски
78
Причинно-следственные связи
Недостаток Угроза
Уязвимость Атака
Риск
Незащищенность
Небезопасность
79
Выводы
Разработка защищенного кода сводится к реализации контроля инвариантов
всех сущностей основной предметной области и области защищенности
приложения
Анализ защищенности кода сводится к оценке эффективности реализованных
контролей
Ни то, ни другое – невозможно без досконального изучения основной
предметной области и области защищенности приложения
80
Классификация
Классификация уязвимостей возможна по:
― предметной области; // защищенность приложения
― недостатку; // неэффективная предварительная обработка
потоков данных
― потоку вычисления; // формирующие первообразные потоков выполнения
― угрозе; // нарушение целостности
// уязвимость к атакам инъекций (в зависимости от интерпретатора потока
данных: XSS, SQLi, XMLi,XPATHi, Path Traversal, LINQi,XXE и т.п.)
Классификация
Классификация уязвимостей возможна по:
― предметной области; // защищенность приложения
― недостатку; // неэффективное подтверждение аутентичности
источника потока вычисления
― потоку вычисления; // HTTP-запрос, приводящий к изменению состояния
приложения
― угрозе; // нарушение аутентичности
// уязвимость к атакам CSRF
Классификация
Классификация уязвимостей возможна по:
― предметной области; // онлайн-торговля
― недостатку; // неэффективный контроль использования погашенных
купонов на скидку
― потоку вычисления; // транзакция оплаты заказа
― угрозе; // нарушение авторизованности
// уязвимость к атакам на бизнес-логику (повторное использование погашенных
купонов)
Что будет, если поиграть в
алхимию с критериями
классификации?
84
85
Вопросы?
Владимир Кочетков
vkochetkov@ptsecurity.com
@kochetkov_v
/Positive Technologies/Application Security
/Application Inspector/Compiling and Low-Level Applications Analysis/Team Lead
Прикладная теория Application Security

More Related Content

What's hot

Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Yauheni Akhotnikau
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеPython Meetup
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложенийPositive Hack Days
 
Как разработать защищенное веб-приложение и не сойти при этом с ума (вебинар)
Как разработать защищенное веб-приложение и не сойти при этом с ума (вебинар)Как разработать защищенное веб-приложение и не сойти при этом с ума (вебинар)
Как разработать защищенное веб-приложение и не сойти при этом с ума (вебинар)Vladimir Kochetkov
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
Haskell
HaskellHaskell
HaskellDevDay
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Mikhail Matrosov
 
Теоретические основы Application Security
Теоретические основы Application SecurityТеоретические основы Application Security
Теоретические основы Application SecurityPositive Hack Days
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерSergey Platonov
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C codeDenis Efremov
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
 
Пояснения к статье про Copy-Paste
Пояснения к статье про Copy-PasteПояснения к статье про Copy-Paste
Пояснения к статье про Copy-PasteTatyanazaxarova
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кодаAndrey Karpov
 
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Ontico
 

What's hot (20)

Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложений
 
Как разработать защищенное веб-приложение и не сойти при этом с ума (вебинар)
Как разработать защищенное веб-приложение и не сойти при этом с ума (вебинар)Как разработать защищенное веб-приложение и не сойти при этом с ума (вебинар)
Как разработать защищенное веб-приложение и не сойти при этом с ума (вебинар)
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Haskell
HaskellHaskell
Haskell
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
 
Теоретические основы Application Security
Теоретические основы Application SecurityТеоретические основы Application Security
Теоретические основы Application Security
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C code
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
 
Пояснения к статье про Copy-Paste
Пояснения к статье про Copy-PasteПояснения к статье про Copy-Paste
Пояснения к статье про Copy-Paste
 
Fiche Révision POO
Fiche Révision POOFiche Révision POO
Fiche Révision POO
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
 

Similar to Прикладная теория 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
 
Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!RAMBLER&Co
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Ivan Tsyganov
 
Автоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кодаАвтоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кодаPositive Hack Days
 
Как выглядит современный фронтенд
Как выглядит современный фронтендКак выглядит современный фронтенд
Как выглядит современный фронтендTimophy Chaptykov
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Hack Days
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Development User Group
 
Мифы и легенды Java Stream API
Мифы и легенды Java Stream APIМифы и легенды Java Stream API
Мифы и легенды Java Stream APICEE-SEC(R)
 
Kotlin - следующий язык после Java
Kotlin - следующий язык после JavaKotlin - следующий язык после Java
Kotlin - следующий язык после JavaKirill Rozov
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means o...
TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means o...TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means o...
TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means o...Iosif Itkin
 
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидахCodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидахCodeFest
 
Экстремальная оптимизация производительности на примере MongoDB Java Driver
Экстремальная оптимизация производительности на примере MongoDB Java DriverЭкстремальная оптимизация производительности на примере MongoDB Java Driver
Экстремальная оптимизация производительности на примере MongoDB Java DriverVitebsk DSC
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиSQALab
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
 

Similar to Прикладная теория Application Security (20)

Трущобы 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
 
Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
 
Автоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кодаАвтоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кода
 
Как выглядит современный фронтенд
Как выглядит современный фронтендКак выглядит современный фронтенд
Как выглядит современный фронтенд
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Мифы и легенды Java Stream API
Мифы и легенды Java Stream APIМифы и легенды Java Stream API
Мифы и легенды Java Stream API
 
Intro to Swift techitout
Intro to Swift techitoutIntro to Swift techitout
Intro to Swift techitout
 
Kotlin - следующий язык после Java
Kotlin - следующий язык после JavaKotlin - следующий язык после Java
Kotlin - следующий язык после Java
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
course js day 2
course js day 2course js day 2
course js day 2
 
TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means o...
TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means o...TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means o...
TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means o...
 
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидахCodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
 
Экстремальная оптимизация производительности на примере MongoDB Java Driver
Экстремальная оптимизация производительности на примере MongoDB Java DriverЭкстремальная оптимизация производительности на примере MongoDB Java Driver
Экстремальная оптимизация производительности на примере MongoDB Java Driver
 
Bytecode
BytecodeBytecode
Bytecode
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 

More from Vladimir Kochetkov

Do WAFs dream of static analyzers
Do WAFs dream of static analyzersDo WAFs dream of static analyzers
Do WAFs dream of static analyzersVladimir Kochetkov
 
Подводные камни прикладной криптографии, I
Подводные камни прикладной криптографии, IПодводные камни прикладной криптографии, I
Подводные камни прикладной криптографии, IVladimir Kochetkov
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Vladimir Kochetkov
 
Hack an ASP .NET website? Hard, but possible!
Hack an ASP .NET website? Hard, but possible! Hack an ASP .NET website? Hard, but possible!
Hack an ASP .NET website? Hard, but possible! Vladimir Kochetkov
 
Automated Patching for Vulnerable Source Code
Automated Patching for Vulnerable Source CodeAutomated Patching for Vulnerable Source Code
Automated Patching for Vulnerable Source CodeVladimir Kochetkov
 
How to Develop a Secure Web Application and Stay in Mind? (PHDays 3)
How to Develop a Secure Web Application and Stay in Mind? (PHDays 3)How to Develop a Secure Web Application and Stay in Mind? (PHDays 3)
How to Develop a Secure Web Application and Stay in Mind? (PHDays 3)Vladimir Kochetkov
 

More from Vladimir Kochetkov (6)

Do WAFs dream of static analyzers
Do WAFs dream of static analyzersDo WAFs dream of static analyzers
Do WAFs dream of static analyzers
 
Подводные камни прикладной криптографии, I
Подводные камни прикладной криптографии, IПодводные камни прикладной криптографии, I
Подводные камни прикладной криптографии, I
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
 
Hack an ASP .NET website? Hard, but possible!
Hack an ASP .NET website? Hard, but possible! Hack an ASP .NET website? Hard, but possible!
Hack an ASP .NET website? Hard, but possible!
 
Automated Patching for Vulnerable Source Code
Automated Patching for Vulnerable Source CodeAutomated Patching for Vulnerable Source Code
Automated Patching for Vulnerable Source Code
 
How to Develop a Secure Web Application and Stay in Mind? (PHDays 3)
How to Develop a Secure Web Application and Stay in Mind? (PHDays 3)How to Develop a Secure Web Application and Stay in Mind? (PHDays 3)
How to Develop a Secure Web Application and Stay in Mind? (PHDays 3)
 

Прикладная теория Application Security

  • 1.
  • 2. Прикладная теория Application Security Владимир Кочетков /Positive Technologies/Application Inspector/Team Lead Образовательная программа «Практическая безопасность»
  • 3. Agenda Что? Теоретический минимум, необходимый для осознанной разработки или анализа защищенности кода Зачем? Перестать следовать культу карго 3
  • 4. Главный вопрос Жизни, Вселенной и всего остального… 4
  • 6. Что такое "уязвимость"? «Недостаток (слабость) программного (программно-технического) обеспечения средства или информационной системы в целом, который (которая) может быть использована для реализации угроз безопасности информации» - ГОСТ Р 56546- 2015 6
  • 7. Что такое "уязвимость"? «Недостаток (слабость) программного (программно-технического) обеспечения средства или информационной системы в целом, который (которая) может быть использована для реализации угроз безопасности информации» - ГОСТ Р 56546- 2015 «В чем сила, брат?» (с) 7
  • 8. Что такое "уязвимость"? «Недостаток (слабость) программного (программно-технического) обеспечения средства или информационной системы в целом, который (которая) может быть использована для реализации угроз безопасности информации» - ГОСТ Р 56546- 2015 «В чем сила, брат?» (с) «Набор входных данных, приводящий машину Тьюринга в запрещенную конфигурацию» - Computer Science 8
  • 9. Что такое "уязвимость"? «Недостаток (слабость) программного (программно-технического) обеспечения средства или информационной системы в целом, который (которая) может быть использована для реализации угроз безопасности информации» - ГОСТ Р 56546- 2015 «В чем сила, брат?» (с) «Набор входных данных, приводящий машину Тьюринга в запрещенную конфигурацию» - Computer Science 9
  • 10. Существующие определения не дают ни малейшего представления о технической сущности уязвимости 10
  • 11. Правильный вопрос: в чем разница между защищенным и уязвимым кодом? 11
  • 12. Что такое "уязвимость"? var cmd = new SqlCommand("SELECT Value FROM Discounts WHERE CouponCode LIKE '" + Request["CouponCode"] + "'"); var connection = new SqlConnection(connectionString); connection.Open(); cmd.Connection = connection; var couponValue = cmd.ExecuteScalar(); ... 12
  • 13. Что такое "уязвимость"? var cmd = new SqlCommand("SELECT Value FROM Discounts WHERE CouponCode LIKE '" + Request["CouponCode"] + "'"); var connection = new SqlConnection(connectionString); connection.Open(); cmd.Connection = connection; var couponValue = cmd.ExecuteScalar(); ... Атакующий имеет возможность нарушить целостность выходного потока данных (кода SQL-запроса), манипулируя потоком входных данных (параметром HTTP-запроса), приходящим в операцию выполнения SQL-кода. 13
  • 14. Что такое "уязвимость"? var cmd = new SqlCommand("SELECT Value FROM Discounts WHERE CouponCode LIKE @CouponCode"); cmd.Parameters.AddWithValue("@CouponCode ", Request["CouponCode"]); var connection = new SqlConnection(connectionString); connection.Open(); cmd.Connection = connection; var couponValue = cmd.ExecuteScalar(); ... 14
  • 15. Что такое "уязвимость"? var cmd = new SqlCommand("SELECT Value FROM Discounts WHERE CouponCode = @CouponCode"); cmd.Parameters.AddWithValue("@CouponCode ", Request["CouponCode"]); var connection = new SqlConnection(connectionString); connection.Open(); cmd.Connection = connection; var couponValue = cmd.ExecuteScalar(); ... Атакующий имеет возможность нарушить целостность выходного потока данных (параметра SQL-запроса), манипулируя потоком входных данных (параметром HTTP- запроса), приходящим в операцию выполнения SQL-кода, что может привести к нарушению правил предметной области приложения. 15
  • 16. Что такое "уязвимость"? 1) [Authorize(Roles = "All")] public ActionResult SomeAction() { ... return View(); } 2) [Authorize(Roles = "Baz, Qux")] public ActionResult SomeAction() { ... return View(); } 16
  • 17. Что такое "уязвимость"? 1) [Authorize(Roles = "All")] public ActionResult SomeAction() { ... return View(); } 2) [Authorize(Roles = "Baz, Qux")] public ActionResult SomeAction() { ... return View(); } Невозможно оценить защищенность кода, не владея всеми предметными областями приложения (в данном случае, политики контроля доступа). 17
  • 19. Примеры предметных областей Вторичные: ― защищенность; ― отказоустойчивость; ― опыт взаимодействия, ― производительность. Основные: ― интернет-торговля; ― онлайн-банкинг; ― бухучет; ― … (тысячи их). Каждое приложение реализует модели как основной предметной области, так и множество моделей вторичных предметных областей
  • 20. Application Security – вторичная предметная область 20
  • 22. Сущность – абстракция реального объекта в некотором контексте, обладающая следующими характеристиками: • свойство – значимый атрибут абстрагируемого сущностью объекта или одноместное отношение; • состояние– множество текущих значений всех свойств сущности; • инвариант– множество допустимых состояний сущности. Отношение – утверждение, определяющее взаимосвязь изменения состояний сущностей. 22
  • 23. Предметная область – множество сущностей, их инварианты и отношения 23
  • 24. Пример: логистика Сущность: точки на карте города • свойство: координаты – пара значений «широта-долгота»; • инвариант: координаты принадлежат перекресткам города или строениям. Сущность: маршрут • свойство: путь - упорядоченное множество точек на карте города; • инвариант: путь непрерывен и проходит по улицам города в соответствии с ПДД; • отношение: оптимальность – длина пути минимальна для одних и тех же начальной и конечной точек. Сущности: точка загрузки, точка доставки • свойство: точка на карте города 24
  • 25. Задача коммивояжёра В терминах предметной области логистики: построить оптимальный маршрут из точки загрузки, проходящий через все точки доставки по одному разу и возвращающийся в точку загрузки. 25
  • 26. Задача коммивояжёра В терминах предметной области логистики: построить оптимальный маршрут из точки загрузки, проходящий через все точки доставки по одному разу и возвращающийся в точку загрузки. В терминах предметной области теории графов: Найти гамильтонов цикл минимального веса в полном (дополненном ребрами бесконечной длины) взвешенном графе. 26
  • 28. «Трясина Тьюринга» - не только об эзотерических языках 28
  • 29. "Modeling Computer Insecurity" (Sophie Engle, Sean Whalen and Matt Bishop): Провести полный анализ защищенности программы можно, только выполнив ее на всех возможных наборах входных данных. Разработка защищенного кода менее трудоемкий процесс, чем анализ защищенности уже существующего кода. Вычислимость проблемы защищенности Статическая оценка защищенности программы является неразрешимой проблемой. Определение защищенности текущего состояния программы, очевидно, разрешимо
  • 30. Применимость теоремы Райса к реальным системам – такая же теоретизация, как и идея описывать приложение в виде конечного автомата 30
  • 31. Приложение стоит рассматривать, как поток управления, обрабатывающий множество потоков данных 31
  • 32. Потоки управления 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
  • 33. Потоки управления 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
  • 34. Потоки управления 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. Потоки управления 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); } 35
  • 36. Потоки управления 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
  • 37. Потоки управления 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
  • 38. Потоки управления 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
  • 39. Потоки управления 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
  • 40. Потоки управления 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
  • 41. Потоки управления 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
  • 42. Потоки управления 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
  • 43. Потоки управления 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
  • 44. Потоки управления 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); } 45
  • 46. Потоки управления 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); } 46
  • 47. Потоки управления всегда являются производными от потоков данных 47
  • 48. Потоки данных 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); } 48
  • 49. Потоки данных 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); } 49
  • 50. Потоки данных 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); } 50
  • 51. Потоки данных 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); } 51
  • 52. Потоки данных 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); } 52
  • 53. Потоки данных 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); } 53
  • 54. Потоки данных 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); } 54
  • 55. Потоки данных 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); } 55
  • 56. Потоки данных 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); } 56
  • 57. Потоки данных 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); } 57
  • 58. Потоки данных 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); } 58 str1 ∈ { Encoding.UTF8.GetString(Convert.FromBse64String(Request.Params["parm"])), "Wrong Key!" }
  • 59. Множества значений всех потоков данных в конкретной точке потока выполнения определяют состояние приложения 59
  • 60. Граф переходов между состояниями приложения определяет все возможные потоки вычисления 60
  • 61. Граф потоков вычисления является семантически- эквивалентной моделью приложения 61
  • 63. Театр начинается с вешалки, а уязвимость – с недостатка 63
  • 64. Недостаток - неэффективная реализация моделей предметных областей приложения и контролей инвариантов их сущностей Примеры контролей Application Security: • предварительная обработка потоков данных; • подтверждение аутентичности потоков вычисления; • проверка прав доступа к потокам данных; • обеспечение соответствия потока вычисления модели функциональной предметной области; • … 64
  • 65. Угроза - обусловленная недостатком возможность нарушить состояние защищенности потока вычисления, лишив его одного из свойств: • конфиденциальности; • целостности; • доступности; • авторизованности; • аутентичности; • аппелируемости; • подотчетности; • достоверности; • <нужное вписать> 65
  • 66. Конфиденциальность Состояние потока вычисления, при котором доступ к нему осуществлен только сущностями, имеющими на это право. A E B 66
  • 67. Целостность Состояние потока вычисления, при котором изменения в нем осуществлены только сущностями, имеющими на это право. A E B C 67
  • 68. Доступность Состояние потока вычисления, при котором доступ к нему могут осуществить все сущности, имеющие на это право. A B 68
  • 69. Авторизованность Состояние потока вычисления, при котором его источниками являются только сущности, имеющие на это право. E B A 69
  • 70. Аутентичность Состояние потока вычисления, при котором подтверждена подлинность его источника. ‘A’ B A 70
  • 71. Аппелируемость Состояние потока вычисления, при котором его источник не может отказаться от того, что он является таковым. A B 71
  • 72. Уязвимость – состояние приложения, в котором возможна реализация угрозы 72
  • 73. Невозможность реализации угрозы в каждой точке потока вычисления* является инвариантом защищенности приложения 73 * …пересекающего границу доверия
  • 74. Уязвимость бизнес-логики– состояние реализации угрозы через нарушение правил основной предметной области приложения 74
  • 75. То, что может сделать с потоками вычисления атакующий, нарушив инварианты сущностей предметных областей, называется угрозой (threat) То, где и благодаря чему он может это сделать, называется уязвимостью (vulnerability), обусловленной недостатком (weakness) То, как он может это сделать, называется атакой (attack) То, с какой вероятностью у него это удастся и какие последствия может повлечь, называется риском (risk) Иными словами… 75
  • 76. То, что не позволяет атакующему провести атаку, обеспечивает защищенность (security) 76
  • 77. То, что минимизирует риск, обеспечивает безопасность (safety) 77
  • 78. Акцентировать внимание разработчикам и пентестерам необходимо на причинах*, а не на следствиях**! * недостатки ** уязвимости, атаки или риски 78
  • 79. Причинно-следственные связи Недостаток Угроза Уязвимость Атака Риск Незащищенность Небезопасность 79
  • 80. Выводы Разработка защищенного кода сводится к реализации контроля инвариантов всех сущностей основной предметной области и области защищенности приложения Анализ защищенности кода сводится к оценке эффективности реализованных контролей Ни то, ни другое – невозможно без досконального изучения основной предметной области и области защищенности приложения 80
  • 81. Классификация Классификация уязвимостей возможна по: ― предметной области; // защищенность приложения ― недостатку; // неэффективная предварительная обработка потоков данных ― потоку вычисления; // формирующие первообразные потоков выполнения ― угрозе; // нарушение целостности // уязвимость к атакам инъекций (в зависимости от интерпретатора потока данных: XSS, SQLi, XMLi,XPATHi, Path Traversal, LINQi,XXE и т.п.)
  • 82. Классификация Классификация уязвимостей возможна по: ― предметной области; // защищенность приложения ― недостатку; // неэффективное подтверждение аутентичности источника потока вычисления ― потоку вычисления; // HTTP-запрос, приводящий к изменению состояния приложения ― угрозе; // нарушение аутентичности // уязвимость к атакам CSRF
  • 83. Классификация Классификация уязвимостей возможна по: ― предметной области; // онлайн-торговля ― недостатку; // неэффективный контроль использования погашенных купонов на скидку ― потоку вычисления; // транзакция оплаты заказа ― угрозе; // нарушение авторизованности // уязвимость к атакам на бизнес-логику (повторное использование погашенных купонов)
  • 84. Что будет, если поиграть в алхимию с критериями классификации? 84
  • 85. 85
  • 86. Вопросы? Владимир Кочетков vkochetkov@ptsecurity.com @kochetkov_v /Positive Technologies/Application Security /Application Inspector/Compiling and Low-Level Applications Analysis/Team Lead