AppSec - хакерский путь. Анализ защищённости приложений презентация

Содержание

https://approof.ptsecurity.ru/ PT Application Inspector https://ai.ptsecurity.ru/

Слайд 1AppSec – хакерский путь
Владимир Кочетков
Руководитель отдела исследований по анализу защищённости приложений
Positive

Technologies

Слайд 2 https://approof.ptsecurity.ru/ PT Application Inspector https://ai.ptsecurity.ru/


Слайд 3
ПАМЯТИ КРИСА КАСПЕРСКИ (1976-2017)


Слайд 4«Для хакера каждый предмет связан с определенными свойствами и включен в

определенные причинно-следственные отношения» «Хакер стремится разобраться во всём до конца, понять всё до мельчайших подробностей, выйти за область определения объекта, проанализировать и испытать его поведение во всех нештатных ситуациях»

HACKERS? WHO THE F**K ARE HACKERS?!


Слайд 5ХАКИНГ – ОБРАЗ МЫШЛЕНИЯ, А НЕ РОД ДЕЯТЕЛЬНОСТИ


Слайд 6ХАКИНГ – ОБРАЗ МЫШЛЕНИЯ, А НЕ РОД ДЕЯТЕЛЬНОСТИ


Слайд 7Предметная область, рассматривающая в качестве объекта защиты гипотетическую информационную систему (ИС):

включающую

в себя конкретное приложение

объединяющую объекты окружения в единую сущность
замкнутую относительно информационных потоков приложения

APPSEC (APPLICATION SECURITY)


Слайд 8вне области влияния приложения его окружение защищено

логика предметной области приложения корректна

ДОПУЩЕНИЯ

APPSEC

Слайд 9PT TOP 10 2011-2015 (по данным аналитики https://goo.gl/XTIGFW)


Слайд 10ТЕКУЩАЯ СИТУАЦИЯ? ВСЁ РОВНО ЖЕ…


Слайд 11«УЛЫБАЕМСЯ И МАШЕМ, ПАРНИ»


Слайд 12AppSec за последние 5 лет развивался семимильными шагами:

появилось множество достойных продуктов

(xAST, WAF, RASP);
опубликованы сотни научных работ и тысячи инженерных статей;
разработке защищённых приложений не обучают только ленивые;
исследователи выходят из тени и готовы делиться опытом.

А с уязвимостями в приложениях «всё ровно»

ТЕКУЩАЯ СИТУАЦИЯ? S.N.A.F.U


Слайд 13Разработчики фактически следуют культу карго, слепо копируя "лучшие практики разработки защищённого

кода", не имея при это представления о сути защищённости

Инструменты автоматизации задач AppSec используются не по назначению или неэффективно

Сильно переоценена роль экспертов по анализу защищённости

Идёт повсеместная борьба с последствиями, вместо устранения причин

7 ПРИЧИН ТЕКУЩЕЙ СИТУАЦИИ (1/2)


Слайд 14Повсеместно насаждаются подходы типа "hack yourself first", вынуждающие разработчиков заниматься не

своим делом и формирующие ложное представление об уровне защищённости проекта

Неоправданно-завышенная оценка уровня защищённости проектов с открытым исходным кодом

Защищённость, основанная на хит-парадах рисков, до сих пор считается нормой

Нужен иной подход к вопросам защищённости приложений!

7 ПРИЧИН ТЕКУЩЕЙ СИТУАЦИИ (2/2)


Слайд 15Изучение свойств приложения, протекающих в нём процессов и связанного с ним

окружения

Понимание сути состояния защищённости приложения

Установление причинно-следственных отношений между критериями защищённости и свойствами приложения

Принятие осознанных решений в любых вопросах обеспечения защищённости приложений

ХАКЕРСКИЙ ПУТЬ APPSEC


Слайд 16Application
Security


Слайд 17Приводимые далее термины и определения локальны и не претендуют на признание

в качестве общеупотребительных. Тем не менее, они устраняют существующие разночтения и противоречия в традиционной терминологии, позволяя перейти от интуитивных формулировок к формальным.

DISCLAIMER


Слайд 18Театр начинается с вешалки, а незащищённость ИС – с её недостатков
С

ЧЕГО НАЧНЁМ?

Слайд 19Неэффективная реализация процессов вычисления, логики предметной области или конфигурации окружения ИС
НЕДОСТАТОК


Слайд 20Обусловленная недостатком возможность нарушения свойств состояния защищенности информационного потока:

конфиденциальности;
целостности;
доступности;
авторизованности;
аутентичности.
УГРОЗА


Слайд 21Состояние возможности реализации угрозы
УЯЗВИМОСТЬ


Слайд 22Конкретный способ реализации угрозы (эксплуатации {состояния} уязвимости)
АТАКА


Слайд 23Состояние невозможности реализации любой угрозы
ЗАЩИЩЁННОСТЬ


Слайд 24Состояние приемлемого риска реализации любой угрозы
БЕЗОПАСНОСТЬ


Слайд 25То, что может сделать атакующий с потоками информации, называется угрозой (threat)
То,

когда и благодаря чему он может это сделать, называется уязвимостью (vulnerability), обусловленной недостатком (weakness)

ИНЫМИ СЛОВАМИ


Слайд 26То, как он может это сделать, называется атакой (attack)
То, с какой

вероятностью у него это удастся и какие последствия может повлечь, называется риском (risk)


ИНЫМИ СЛОВАМИ


Слайд 27То, что не позволяет атакующему провести атаку, обеспечивает защищенность (security) То, что

минимизирует риск, обеспечивает безопасность (safety)

ИНЫМИ СЛОВАМИ


Слайд 28Причины и следствия
Недостаток (weakness)
Угроза (threat)



Уязвимость (vulnerability)
Атака (attack)



Риск (risk)
Незащищенность (insecurity)


Небезопасность (unsafety)


Слайд 29Информационная безопасность

Защищённость приложений
Разница между ИБ и AppSec


Слайд 30Application
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)


Слайд 65ГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 3/7)


Слайд 66ГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 4/7)


Слайд 67ГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 5/7)


Слайд 68ГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 6/7)


Слайд 69ГРАФ ПОТОКОВ ВЫЧИСЛЕНИЯ (ПРИМЕР 7/7)


Слайд 70Соединяя точки


Слайд 71Потоки вычисления являются информационными потоками

Следовательно, уязвимость приложения – состояние возможности нарушения

конфиденциальности, целостности, доступности, аутентичности или авторизованности любого из потоков вычисления приложения

Состояние защищённости приложения возникает при невозможности эксплуатации в нём любой уязвимости

APPLICATION + SECURITY


Слайд 72Вычислительный – уязвимости, описываемые в терминах модели процесса выполнения приложения

Логический –

уязвимости, описываемые в терминах модели предметной области приложения

Экзогенный – уязвимости, описываемые в терминах модели окружения

СУПЕРКЛАССЫ УЯЗВИМОСТЕЙ ПРИЛОЖЕНИЯ


Слайд 73«Не сегодня!»
ЧТО МЫ СКАЖЕМ ЛОГИЧЕСКОМУ И ЭКЗОГЕННОМУ КЛАССАМ?


Слайд 74«Пусть C - граф потоков вычисления приложения.

Пусть pvf(t) - достижимая вершина

потока управления на C, являющаяся вызовом функции прямой или косвенной интерпретации текста t, соответствующего известной формальной грамматике G.

Пусть e - поток аргумента входных данных на С.

Пусть De - множество потоков данных на C, порождаемых от e и достижимых в точке вызова pvf(t), где t принадлежит De»

МОДЕЛИРОВАНИЕ ВЫЧИСЛИТЕЛЬНЫХ УЯЗВИМОСТЕЙ (1/2)


Слайд 75«Тогда приложение уязвимо к угрозе нарушения целостности потоков данных De в

точке выполнения pvf(t), если среди них найдётся хотя бы одна пара таких значений, при которых, в результате их синтаксического разбора в соответствии с грамматикой G, получаются не изоморфные друг-другу деревья разбора»

МОДЕЛИРОВАНИЕ ВЫЧИСЛИТЕЛЬНЫХ УЯЗВИМОСТЕЙ (2/2)


Слайд 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Постройте граф потоков вычисления C для вашего кода и найдите в

нём все точки входа/выхода данных из/в окружения
Выделите в C все потоки вычисления от найденных точек входа к точкам выхода
Рассматривая каждый поток вычисления, как информационный, определите актуальные для него угрозы
Для каждой пары «поток вычисления ⇔ угроза» ответьте на вопрос: «что в приложении защищает данный поток от этой угрозы?»
Сформулируйте и реализуйте меры защиты для незащищённых потоков

ДОМАШНЕЕ ЗАДАНИЕ (1/2)


Слайд 80
Для оценки угроз нарушения целостности в многопоточной среде имеет смысл рассматривать

C в качестве сети Петри, где позициями сети будут входные/выходные вершины графа, а переходами – все промежуточные.

Возможность появления более одной метки в любой позиции такой сети укажет на возможность реализации угрозы.

ДОМАШНЕЕ ЗАДАНИЕ (2/2)


Слайд 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


Обратная связь

Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое ThePresentation.ru?

Это сайт презентаций, докладов, проектов, шаблонов в формате PowerPoint. Мы помогаем школьникам, студентам, учителям, преподавателям хранить и обмениваться учебными материалами с другими пользователями.


Для правообладателей

Яндекс.Метрика