Similar presentations:
AppSec - хакерский путь. Анализ защищённости приложений
1.
ЗаголовокAppSec –
хакерский путь
Владимир Кочетков
Руководитель отдела исследований по анализу
защищённости приложений
ptsecurity.com
Positive Technologies
2.
Заголовокhttps://approof.ptsecurity.ru/
PT Application Inspector
https://ai.ptsecurity.ru/
ptsecurity.com
3.
ЗаголовокПАМЯТИ КРИСА КАСПЕРСКИ (1976-2017)
4.
ЗаголовокHACKERS?
WHO THE F**K ARE HACKERS?!
«Для хакера каждый предмет связан с
определенными свойствами и включен в
определенные причинно-следственные
отношения»
«Хакер стремится разобраться во всём до
конца, понять всё до мельчайших
подробностей, выйти за область
определения объекта, проанализировать
и испытать его поведение во всех
нештатных ситуациях»
5.
Заголовок – ОБРАЗ МЫШЛЕНИЯ, А НЕ РОД ДЕЯТЕЛЬНОСТИХАКИНГ
6.
Заголовок – ОБРАЗ МЫШЛЕНИЯ, А НЕ РОД ДЕЯТЕЛЬНОСТИХАКИНГ
7.
Заголовок (APPLICATION SECURITY)APPSEC
Предметная область, рассматривающая в качестве
объекта защиты гипотетическую информационную
систему (ИС):
• включающую в себя конкретное приложение
• объединяющую объекты окружения в единую
сущность
• замкнутую относительно информационных
потоков приложения
8.
ЗаголовокДОПУЩЕНИЯ
APPSEC
• вне области влияния приложения его окружение
защищено
• логика предметной области приложения
корректна
9.
ЗаголовокPT
TOP 10 2011-2015 (по данным аналитики https://goo.gl/XTIGFW)
90%
80%
70%
60%
50%
40%
30%
20%
10%
0%
2011
2012
2013
2014
2015
№1, Cross-Site Scripting
№2, Fingerprinting
№3, Brute Force
№4, Information Leakage
№5, SQL Injection
№6, Cross-Site Request Forgery
№7, Server Misconfiguration
№8, Credential/Session Prediction
№9, URL Redirector Abuse
№10, Path Traversal
10.
Заголовок СИТУАЦИЯ? ВСЁ РОВНО ЖЕ…ТЕКУЩАЯ
90%
80%
70%
60%
50%
40%
30%
20%
10%
0%
2011
2012
2013
2014
2015
№1, Cross-Site Scripting
№2, Fingerprinting
№3, Brute Force
№4, Information Leakage
№5, SQL Injection
№6, Cross-Site Request Forgery
№7, Server Misconfiguration
№8, Credential/Session Prediction
№9, URL Redirector Abuse
№10, Path Traversal
11.
Заголовок«УЛЫБАЕМСЯ
И МАШЕМ, ПАРНИ»
12.
Заголовок СИТУАЦИЯ? S.N.A.F.UТЕКУЩАЯ
AppSec за последние 5 лет развивался семимильными шагами:
• появилось множество достойных продуктов (xAST, WAF, RASP);
• опубликованы сотни научных работ и тысячи инженерных
статей;
• разработке защищённых приложений не обучают только
ленивые;
• исследователи выходят из тени и готовы делиться опытом.
А с уязвимостями в приложениях «всё ровно»
13.
Заголовок7
ПРИЧИН ТЕКУЩЕЙ СИТУАЦИИ (1/2)
• Разработчики фактически следуют культу карго, слепо копируя
"лучшие практики разработки защищённого кода", не имея при
это представления о сути защищённости
• Инструменты автоматизации задач AppSec используются не по
назначению или неэффективно
• Сильно переоценена роль экспертов по анализу защищённости
• Идёт повсеместная борьба с последствиями, вместо устранения
причин
14.
Заголовок7
ПРИЧИН ТЕКУЩЕЙ СИТУАЦИИ (2/2)
• Повсеместно насаждаются подходы типа "hack yourself first",
вынуждающие разработчиков заниматься не своим делом и
формирующие ложное представление об уровне защищённости
проекта
• Неоправданно-завышенная оценка уровня защищённости
проектов с открытым исходным кодом
• Защищённость, основанная на хит-парадах рисков, до сих пор
считается нормой
Нужен иной подход к вопросам защищённости приложений!
15.
ЗаголовокХАКЕРСКИЙ
ПУТЬ APPSEC
• Изучение свойств приложения, протекающих в нём процессов
и связанного с ним окружения
• Понимание сути состояния защищённости приложения
• Установление причинно-следственных отношений между
критериями защищённости и свойствами приложения
• Принятие осознанных решений в любых вопросах обеспечения
защищённости приложений
16.
ЗаголовокApplication
Security
17.
ЗаголовокDISCLAIMER
Приводимые далее термины и определения локальны и не
претендуют на признание в качестве общеупотребительных. Тем
не менее, они устраняют существующие разночтения и
противоречия в традиционной терминологии, позволяя перейти от
интуитивных формулировок к формальным.
18.
ЗаголовокС
ЧЕГО НАЧНЁМ?
Театр начинается с вешалки, а
незащищённость ИС – с её недостатков
19.
ЗаголовокНЕДОСТАТОК
Неэффективная реализация процессов вычисления, логики
предметной области или конфигурации окружения ИС
19
20.
ЗаголовокУГРОЗА
Обусловленная недостатком возможность нарушения свойств
состояния защищенности информационного потока:
конфиденциальности;
целостности;
доступности;
авторизованности;
аутентичности.
20
21.
ЗаголовокУЯЗВИМОСТЬ
Состояние возможности реализации угрозы
22.
ЗаголовокАТАКА
Конкретный способ реализации угрозы (эксплуатации
{состояния} уязвимости)
23.
ЗаголовокЗАЩИЩЁННОСТЬ
Состояние невозможности реализации любой угрозы
24.
ЗаголовокБЕЗОПАСНОСТЬ
Состояние приемлемого риска реализации любой угрозы
25.
Заголовок СЛОВАМИИНЫМИ
То, что может сделать атакующий с потоками информации,
называется угрозой (threat)
То, когда и благодаря чему он может это сделать, называется
уязвимостью (vulnerability), обусловленной недостатком
(weakness)
26.
Заголовок СЛОВАМИИНЫМИ
То, как он может это сделать, называется атакой (attack)
То, с какой вероятностью у него это удастся и какие
последствия может повлечь, называется риском (risk)
27.
Заголовок СЛОВАМИИНЫМИ
То, что не позволяет атакующему провести атаку, обеспечивает
защищенность (security)
То, что минимизирует риск, обеспечивает безопасность (safety)
28.
Заголовок и следствияПричины
Недостаток
(weakness)
Незащищенность
(insecurity)
Небезопасность
(unsafety)
Угроза
(threat)
Уязвимость
(vulnerability)
Атака
(attack)
Риск
(risk)
29.
Заголовок между ИБ и AppSecРазница
Информационная безопасность
Защищённость приложений
30.
ЗаголовокApplication
Security
31.
ЗаголовокМОДЕЛИ ПРИЛОЖЕНИЯВЫБОР
Поскольку защищённость – темпоральное свойство, модель
приложения должна отражать процесс его выполнения
32.
Заголовок УПРАВЛЕНИЯПОТОКИ
Приложение можно представить в виде базовых блоков, между
которыми передаётся управление в процессе выполнения
приложения
33.
Заголовок УПРАВЛЕНИЯ (ПРИМЕР 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);
}
34.
Заголовок УПРАВЛЕНИЯ (ПРИМЕР 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);
}
35.
Заголовок УПРАВЛЕНИЯ (ПРИМЕР 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);
}
36.
Заголовок УПРАВЛЕНИЯ (ПРИМЕР 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);
}
37.
Заголовок УПРАВЛЕНИЯ (ПРИМЕР 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);
}
38.
Заголовок УПРАВЛЕНИЯ (ПРИМЕР 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);
}
39.
Заголовок УПРАВЛЕНИЯ (ПРИМЕР 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);
}
40.
Заголовок УПРАВЛЕНИЯ (ПРИМЕР 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);
}
41.
Заголовок УПРАВЛЕНИЯ (ПРИМЕР 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);
}
42.
Заголовок УПРАВЛЕНИЯ (ПРИМЕР 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);
}
43.
Заголовок УПРАВЛЕНИЯ (ПРИМЕР 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);
}
44.
Заголовок УПРАВЛЕНИЯ (ПРИМЕР 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);
}
45.
Заголовок УПРАВЛЕНИЯ (ПРИМЕР 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);
}
46.
Заголовок УПРАВЛЕНИЯ (ПРИМЕР 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);
}
47.
Заголовок УПРАВЛЕНИЯ (ПРИМЕР 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);
}
48.
Заголовок ДАННЫХПОТОКИ
Потоки выполнения приложения являются производными от
потоков данных окружения
49.
Заголовок ДАННЫХ (ПРИМЕР 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);
}
50.
Заголовок ДАННЫХ (ПРИМЕР 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);
}
51.
Заголовок ДАННЫХ (ПРИМЕР 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);
}
52.
Заголовок ДАННЫХ (ПРИМЕР 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);
}
53.
Заголовок ДАННЫХ (ПРИМЕР 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);
}
54.
Заголовок ДАННЫХ (ПРИМЕР 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);
}
55.
Заголовок ДАННЫХ (ПРИМЕР 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);
}
56.
Заголовок ДАННЫХ (ПРИМЕР 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);
}
57.
Заголовок ДАННЫХ (ПРИМЕР 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);
}
58.
ЗаголовокСОСТОЯНИЕ
ПОТОКА ДАННЫХ
Множество всех возможных значений потока данных в конкретной
точке потока выполнения определяет его состояние
59.
ЗаголовокСОСТОЯНИЕ
ПОТОКА ДАННЫХ (ПРИМЕР)
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!"
}
60.
ЗаголовокСОСТОЯНИЕ
ПРИЛОЖЕНИЯ
Множество состояний всех потоков данных в конкретной точке
потока выполнения определяют состояние приложения
61.
ЗаголовокСОСТОЯНИЕ
ПРИЛОЖЕНИЯ (ПРИМЕР)
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)
}
62.
ЗаголовокГРАФ
ПОТОКОВ ВЫЧИСЛЕНИЯ
Граф переходов между состояниями приложения определяет все
возможные потоки вычисления и является искомой моделью
процесса его выполнения
63.
ЗаголовокГРАФ
ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 1/7)
ε
{}
64.
ЗаголовокГРАФ
ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 2/7)
ε
}
{
parm'
{
ε
Request.Params["parm1"]
}
65.
ЗаголовокГРАФ
ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 3/7)
Request.Params["cond1"] == "true"
parm'
{
ε
Request.Params["parm1"]
}
}
{
66.
ЗаголовокГРАФ
ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 4/7)
Request.Params["cond1"] != "true"
{
parm'
{
Request.Params["cond1"] != "true"
Request.Params["parm1"]
}
}
67.
ЗаголовокГРАФ
ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 5/7)
Request.Params["cond1"] != "true"
&&
Request.Params["cond2"] == "true"
{
parm'
{
Request.Params["cond1"] != "true"
Request.Params["parm1"]
}
}
68.
ЗаголовокГРАФ
ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 6/7)
Request.Params["cond1"] != "true"
&&
Request.Params["cond2"] != "true"
{
parm'
{
Request.Params["cond1"] != "true"
Request.Params["parm1"]
}
}
69.
ЗаголовокГРАФ
ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 7/7)
Request.Params["cond1"] != "true"
{
parm'
{
Request.Params["cond2"] == "true"
Request.Params["parm2"]
||
Request.Params["cond2"] != "true"
"<div>Harmless value</div>"
}
}
70.
ЗаголовокСоединяя точки
71.
ЗаголовокAPPLICATION
+ SECURITY
• Потоки вычисления являются информационными потоками
• Следовательно, уязвимость приложения – состояние
возможности нарушения конфиденциальности, целостности,
доступности, аутентичности или авторизованности любого из
потоков вычисления приложения
• Состояние защищённости приложения возникает при
невозможности эксплуатации в нём любой уязвимости
72.
ЗаголовокСУПЕРКЛАССЫ
УЯЗВИМОСТЕЙ ПРИЛОЖЕНИЯ
• Вычислительный – уязвимости, описываемые в терминах
модели процесса выполнения приложения
• Логический – уязвимости, описываемые в терминах модели
предметной области приложения
• Экзогенный – уязвимости, описываемые в терминах модели
окружения
73.
ЗаголовокЧТО
МЫ СКАЖЕМ ЛОГИЧЕСКОМУ И ЭКЗОГЕННОМУ КЛАССАМ?
«Не сегодня!»
74.
ЗаголовокМОДЕЛИРОВАНИЕ
ВЫЧИСЛИТЕЛЬНЫХ УЯЗВИМОСТЕЙ (1/2)
«Пусть C - граф потоков вычисления приложения.
Пусть pvf(t) - достижимая вершина потока управления на C,
являющаяся вызовом функции прямой или косвенной
интерпретации текста t, соответствующего известной
формальной грамматике G.
Пусть e - поток аргумента входных данных на С.
Пусть De - множество потоков данных на C, порождаемых от e и
достижимых в точке вызова pvf(t), где t принадлежит De»
75.
ЗаголовокМОДЕЛИРОВАНИЕ
ВЫЧИСЛИТЕЛЬНЫХ УЯЗВИМОСТЕЙ (2/2)
«Тогда приложение уязвимо к угрозе нарушения целостности
потоков данных De в точке выполнения pvf(t), если среди них
найдётся хотя бы одна пара таких значений, при которых, в
результате их синтаксического разбора в соответствии с
грамматикой G, получаются не изоморфные друг-другу деревья
разбора»
76.
ЗаголовокМОДЕЛИРОВАНИЕ
УЯЗВИМОСТЕЙ (ПРИМЕР)
77.
ЗаголовокИНЪЕКЦИИ
Атаки на нарушение целостности потоков данных в результате их
преобразования принято называть инъекциями
Тип инъекции определяется грамматикой атакуемого потока
данных (HTML, XML, SQL, XPath, XQuery, LDAP, LINQ, Path, …)
78.
ЗаголовокСВОЙСТВА
АТАК
• Направлены на реализацию угрозы (нарушение одного из
свойств защищённости какого-либо потока вычисления)
• Могут являться как производными от предыдущих атак, так и
первообразными для последующих. Например:
• HTTP Response Splitting →
Header Spoofing →
Session Fixation
Unvalidated Redirection
Body spoofing →
Content Spoofing
Session Fixation
Unvalidated Redirection
Cross-Site Scripting
…
79.
ЗаголовокДОМАШНЕЕ
ЗАДАНИЕ (1/2)
1. Постройте граф потоков вычисления C для вашего кода и
найдите в нём все точки входа/выхода данных из/в окружения
2. Выделите в C все потоки вычисления от найденных точек
входа к точкам выхода
3. Рассматривая каждый поток вычисления, как
информационный, определите актуальные для него угрозы
4. Для каждой пары «поток вычисления ⇔ угроза» ответьте на
вопрос: «что в приложении защищает данный поток от этой
угрозы?»
5. Сформулируйте и реализуйте меры защиты для
незащищённых потоков
80.
ЗаголовокДОМАШНЕЕ
ЗАДАНИЕ (2/2)
Для оценки угроз нарушения целостности в многопоточной среде
имеет смысл рассматривать C в качестве сети Петри, где
позициями сети будут входные/выходные вершины графа, а
переходами – все промежуточные.
Возможность появления более одной метки в любой позиции
такой сети укажет на возможность реализации угрозы.
81.
ЗаголовокТАК
ЧТО НЕ ТАК-ТО?
82.
ЗаголовокЗаблуждение №1
«Достаточно знать N правил разработки
защищённого кода»
83.
Заголовок5
ШАГОВ К ПРИНЯТИЮ ТОГО, ЧТО N→∞
отрицание
принятие
злость
торг
депрессия
84.
ЗаголовокКАКИЕ
ВАШИ ДОКАЗАТЕЛЬСТВА?
• Возможных недостатков и уязвимостей бесконечно много,
даже в рамках вычислительного суперкласса
• Количество типов атак сравнимо с количеством возможных
потоков вычислений * количество угроз, т.е. конечно и зависит
от специфики каждого конкретного приложения
• Следовательно, любое конечное множество правил, либо не
является полным, либо направлено на противодействие
атакам и поэтому неэффективно, либо сводит код к «не вполне
полной по Тьюрингу» модели (например, правила NASA/JPL)
85.
ЗаголовокПРАВИЛО:
«ОТ SQL-ИНЪЕКЦИЙ ПРИНИМАЙТЕ ORM!» (1/2)
public class SessionCreateQueryController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception
{
ModelAndView mv = new ModelAndView("user");
String name = request.getParameter("name");
try
{
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
List result = session.createQuery("from UsersEntity where uname = '" + name + "'").list();
mv.addObject("users", result);
session.getTransaction().commit();
} catch (Exception e)
{
e.printStackTrace();
}
return mv;
}
}
86.
ЗаголовокПРАВИЛО:
«ОТ SQL-ИНЪЕКЦИЙ ПРИНИМАЙТЕ ORM!» (2/2)
public class SessionCreateQueryController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception
{
ModelAndView mv = new ModelAndView("user");
String name = request.getParameter("name");
try
{
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
List result = session.createQuery("from UsersEntity where uname = '" + name + "'").list();
mv.addObject("users", result);
session.getTransaction().commit();
} catch (Exception e)
{
e.printStackTrace();
}
return mv;
}
}
name = 1' and '1 \''=1 union select version(), 2, 3, 4 -- '='1
87.
ЗаголовокЗаблуждение №2
«Всё ОК, анализатор ничего не нашёл»
88.
ЗаголовокАНАЛИЗАТОР
КОДА (ПРИМЕР 1/6)
def analyze(code, data):
if not vulnerable(code, data):
# given configuration is secure
else:
# given configuration is vulnerable
89.
ЗаголовокАНАЛИЗАТОР
КОДА (ПРИМЕР 2/6)
def analyze(code, data):
if not vulnerable(code, data):
# given configuration is secure
vulnerable_function_call()
else:
# given configuration is vulnerable
90.
ЗаголовокАНАЛИЗАТОР
КОДА (ПРИМЕР 3/6)
analyzer_code =
"""
def analyze(code, data):
if not vulnerable(code, data):
# given configuration is secure
vulnerable_function_call()
else:
# given configuration is vulnerable
"""
91.
ЗаголовокАНАЛИЗАТОР
КОДА (ПРИМЕР 4/6)
analyzer_code =
"""
def analyze(code, data):
if not vulnerable(code, data):
# given configuration is secure
vulnerable_function_call()
else:
# given configuration is vulnerable
"""
eval(analyzer_code)
92.
ЗаголовокАНАЛИЗАТОР
КОДА (ПРИМЕР 5/6)
analyzer_code =
"""
def analyze(code, data):
if not vulnerable(code, data):
# given configuration is secure
vulnerable_function_call()
else:
# given configuration is vulnerable
"""
eval(analyzer_code)
analyze(analyzer_code, analyzer_code)
93.
ЗаголовокАНАЛИЗАТОР
КОДА (ПРИМЕР 6/6)
analyzer_code =
"""
def analyze(code, data):
if not vulnerable(code, data):
# given configuration is secure
vulnerable_function_call()
else:
# given configuration is vulnerable
"""
eval(analyzer_code)
analyze(analyzer_code, analyzer_code)
¯\_(ツ)_/¯
94.
Заголовок СЛУЧАЙ?ЧАСТНЫЙ
n = … # n∈ℕ
def analyze(code, data):
while n:
sleep(n)
n -= 1
if not vulnerable(code, data):
# given configuration is secure
vulnerable_function_call()
else:
# given configuration is vulnerable
И сколько таких «частных» случаев теперь возможно? ;)
95.
Заголовок РАЙСА (ПРИМЕНИТЕЛЬНО К APPSEC)ТЕОРЕМА
Не существует универсального анализатора защищённости
96.
ЗаголовокСТАТАНАЛИЗАТОРЫ
– ИНДУСТРИЯ ОБМАНА?
Проблема анализа защищённости решаема для программ:
• эквивалентных конечным автоматам (за PTIME)
• сводимых к конечным автоматам за счёт накладывания
ограничений на размеры доступной памяти, размерность
переменных, количество итераций циклов и т.п. (за EXPTIME)
Все существующие анализаторы используют подходы,
основанные на аппроксимации модели исследуемого кода.
Любой статанализатор легко «обламывается» не более, чем 3
строчками кода
97.
ЗаголовокЗаблуждение №3
«Только ручной анализ, только хардкор!»
98.
Заголовок ЛИ ДАННЫЙ JAVASCRIPT-КОД? (1/2)УЯЗВИМ
([][[]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+([![]]+[][[]])
[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+[]]+((+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+
[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![
]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[
]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]
+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(!
[]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[
]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[][(![]+[])[+[]]+([![]]+[]
[[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+
[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(
!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])
[+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!
+[]]]()[+!+[]+[+!+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][(![]+[])
[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[
][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+
[!+[]+!+[]]+[+[]])+[])[+!+[]]+(+(+!+[]+[+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]
)[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([
![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][
[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([!
[]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!
+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![
]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+
(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]
+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]](!+[]+!+[]+[+!+[]])[+!+[
]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(+(+!+[]+[+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!!
[]+[])[+!+[]]])[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(!
[]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[
])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![
]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([!
[]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!
+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(
!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+
[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]](!+[]+!+[]
+[+!+[]])[+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+[]]+(+(+!+[]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][
[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[]
)[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]
])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])
[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]
)[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[]
)[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!
+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!!
[]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+
[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]](!+[]+!+[]+[+[]])+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]
+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+
!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+(
[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!
+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[
!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+
[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]
99.
Заголовок ЛИ ДАННЫЙ JAVASCRIPT-КОД? (2/2)УЯЗВИМ
([][[]]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+([![]]+[][[]])
[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+[]]+((+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+
[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![
]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[
]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]
+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(!
[]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[
]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[][(![]+[])[+[]]+([![]]+[]
[[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+
[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(
!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])
[+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!
+[]]]()[+!+[]+[+!+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][(![]+[])
[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[
][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+
[!+[]+!+[]]+[+[]])+[])[+!+[]]+(+(+!+[]+[+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]
)[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([
![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][
[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([!
[]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!
+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![
]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+
(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]
+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]](!+[]+!+[]+[+!+[]])[+!+[
]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(+(+!+[]+[+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!!
[]+[])[+!+[]]])[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(!
[]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[
])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![
]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([!
[]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!
+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(
!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+
[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]](!+[]+!+[]
+[+!+[]])[+!+[]]+(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+[]]+(+(+!+[]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][
[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[]
)[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]
])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])
[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]
)[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[]
)[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!
+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!!
[]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+
[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]](!+[]+!+[]+[+[]])+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]
+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+
!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+(
[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!
+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[
!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+
[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]
100.
ЗаголовокJSF**CK
false
=>
![]
true
=>
!![]
undefined
=>
[][[]]
NaN
=>
+[![]]
0
=>
+[]
1
=>
+!+[]
2
=>
!+[]+!+[]
10
=>
[+!+[]]+[+[]]
Array
=>
[]
Number
=>
+[]
String
=>
[]+[]
Boolean
=>
![]
Function
=>
[]["filter"]
eval
=>
[]["filter"]["constructor"]( CODE )()
window
=>
[]["filter"]["constructor"]("return this")()
…
document.location=
location.hash.substring(1)
101.
Заголовок АНАЛИЗ КОДАРУЧНОЙ
Человек в состоянии решить задачу анализа защищённости кода,
но с рядом существенных оговорок о его сложности
(колмогоровской, цикломатической, семантической – вот это вот
всё и сразу)
102.
ЗаголовокВ
ЕДИНЕНИИ – СИЛА!
• Программа-анализатор транслирует код в привычные человеку
идиомы и определяет потенциально-опасные места и условия
их эксплуатации
• Человек верифицирует полученные результаты, классифицируя
все обнаруженные потенциально-опасные места и подтверждая
выполнимость условий эксплуатации
103.
ЗаголовокАНАЛИЗАТОР
ЗДОРОВОГО ЧЕЛОВЕКА
104.
ЗаголовокSSDL
Разовые оценки защищённости проекта или нерегулярный
анализ его исходного кода -- ни о чём.
Оптимальная стратегия: непрерывный автоматизированный
анализ кода в рамках CI, полуавтоматизированная оценка
защищённости – перед каждым релизом
105.
ЗаголовокЗаблуждение №4
«Зачем устранять уязвимости, если можно
просто блокировать атаки?»
106.
ЗаголовокБЛОКИРОВАТЬ
АТАКИ – ПРОСТО?
Дано: уязвимость к нарушению целостности HTTP-ответа
данными из БД.
Возможные атаки:
HTTP Response Splitting →
Header Spoofing →
Session Fixation
Unvalidated Redirection
Body spoofing →
Content Spoofing
Session Fixation
Unvalidated Redirection
Cross-Site Scripting
Какие из них будем блокировать и как?
107.
ЗаголовокИ
КАК БЫТЬ, К ПРИМЕРУ, С ЛОГИЧЕСКИМИ УЯЗВИМОСТЯМИ?
108.
ЗаголовокЗаблуждение №5
«Hack yourself first!» -- полезная практика
109.
ЗаголовокСПАСЕНИЕ
УТОПАЮЩИХ …?
«Hack yourself first» предполагает проведение регулярных
пентестов приложения силами его же разработчиков.
Пентест даёт ответ на единственный вопрос: «какие последствия
будет иметь активность атакующего с квалификацией не выше,
чем у пентестера?»
Какова вероятность того, что приложение будет атаковано
взломщиком, с квалификацией выше, чем у разработчика?
110.
ЗаголовокЗаблуждение №6
«Given enough eyeballs, all bugs are shallow»
111.
ЗаголовокНЕСКОЛЬКО
ИСТОРИЙ ОБ ОПЕНСОРС-ПРОЕКТАХ
• «Как я уязвимость в Nginx исправлял»
• «x.Org – 20 лет спустя»
• «9-летняя грязная корова» или «Ох уж этот Линус»
• «История о том, как все пары глаз прошли мимо»
• «Дело об аудите VeraCrypt»
112.
ЗаголовокПРАВИЛЬНЫЕ
ВОПРОСЫ
• Кто хочет анализировать открытый код?
• Сколько из желающих умеют это делать?
• Что ими движет?
• Как часто будет проводиться анализ?
113.
ЗаголовокЧТО
ДЕЛАЕТ ПРИЛОЖЕНИЯ ЗАЩИЩЁННЫМИ?
Эффективность мер по обеспечению защищённости приложения
целиком зависит от зрелости организационных процессов в
проекте и не зависит от используемой модели разработки
114.
ЗаголовокЗаблуждения №7-16
«OWASP Top 10»
115.
ЗаголовокTOP 10 – ЧЕГО?OWASP
С каждой очередной версией, вопросов к OWASP TOP 10
становится всё больше и больше.
• Почему в одном списке собраны недостатки и атаки,
принадлежащие классам различной «мощности»?
• На какую модель опирается данный хит-парад?
• С какой целью в него включаются пункты-тавтологии?
116.
ЗаголовокTOP 10 2017 – ЧТО ЭТО БЫЛО?OWASP
117.
ЗаголовокПОЛЕЗНОСТЬ
OWASP TOP 10
Исходя из наблюдаемых тенденций, OWASP TOP 10 в итоге
сколлапсирует в TOP 3:
1. Insufficient Attack Protection
2. Insufficient Vulnerability Mitigation
3. Insufficient Weakness Elimination
Опираться на данный хит-парад в разработке приложений –
примерно то же самое, что учиться безопасному вождению по
топу видеозаписей ДТП с регистраторов в YouTube.
118.
ЗаголовокИ
КАКУЮ КЛАССИФИКАЦИЮ ИСПОЛЬЗОВАТЬ?
Выводимую из «поток вычисления ⇔ угроза» для каждого
конкретного приложения.
Nuff said.
119.
ЗаголовокВОПРОСЫ?
[email protected]
https://about.me/vladimir.kochetkov
120.
ЗаголовокСпасибо!
Спасибо!
ptsecurity.com