SlideShare a Scribd company logo
Заголовок
ptsecurity.com
Формальные
методы защиты
приложений
ЗаголовокКраткое содержание
Заголовок
def analyze(code, data):
if not vulnerable(code, data):
# given configuration is secure
else:
# given configuration is vulnerable
АНАЛИЗАТОР КОДА (ПРИМЕР 1/6)
Заголовок
def analyze(code, data):
if not vulnerable(code, data):
# given configuration is secure
vulnerable_function_call()
else:
# given configuration is vulnerable
АНАЛИЗАТОР КОДА (ПРИМЕР 2/6)
Заголовок
analyzer_code =
"""
def analyze(code, data):
if not vulnerable(code, data):
# given configuration is secure
vulnerable_function_call()
else:
# given configuration is vulnerable
"""
АНАЛИЗАТОР КОДА (ПРИМЕР 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
"""
eval(analyzer_code)
АНАЛИЗАТОР КОДА (ПРИМЕР 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)
analyze(analyzer_code, analyzer_code)
АНАЛИЗАТОР КОДА (ПРИМЕР 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)
¯_(ツ)_/¯
АНАЛИЗАТОР КОДА (ПРИМЕР 6/6)
Заголовок
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
И сколько таких «частных» случаев теперь возможно?
ЧАСТНЫЙ СЛУЧАЙ?
Заголовок
Не существует универсального анализатора защищённости
ТЕОРЕМА РАЙСА (ПРИМЕНИТЕЛЬНО К APPSEC)
Заголовок
Проблема анализа защищённости решаема для программ:
• эквивалентных конечным автоматам (за PTIME)
• сводимых к конечным автоматам за счёт накладывания
ограничений на размеры доступной памяти, размерность
переменных, количество итераций циклов и т.п. (за EXPTIME)
Все существующие анализаторы используют подходы,
основанные на аппроксимации модели исследуемого кода.
Любой статанализатор легко «обламывается» не более, чем 3
строчками кода
СТАТАНАЛИЗАТОРЫ – ИНДУСТРИЯ ОБМАНА?
Заголовок
Интерпретация кода в рамках семантической модели,
отличающейся от модели формального языка. Основной
инструмент аппроксимации кода.
Абстрактная интерпретация
Заголовок
Построим свою собственную арифметику со знаком и
формулами:
(+a) = (+)
(-a) = (-)
(-a) * (+b) = (-)
(-a) / (+b) = (-)
(-a) + (+b) =
a ≤ b ⇒ (+),
a > b ⇒ (-)
И применим её:
-42 / 8 * 100500 + x =
x ≥ -527625 ⇒ (+),
x < -527625 ⇒ (-)
Абстрактная интерпретация на пальцах
Заголовок
Применяется для доказательства факта зависимости потоков
данных различных типов.
Частный случай – доказательство зависимости выходных данных
от входных aka taint-анализ.
Анализ зависимостей кода
ЗаголовокTaint-анализ (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);
}
ЗаголовокTaint-анализ (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);
}
ЗаголовокTaint-анализ (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);
}
ЗаголовокTaint-анализ (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);
}
ЗаголовокTaint-анализ (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);
}
ЗаголовокTaint-анализ (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);
}
ЗаголовокTaint-анализ (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);
}
ЗаголовокTaint-анализ (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);
}
ЗаголовокTaint-анализ (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);
}
Заголовок
• Невозможно автоматизировать верификацию результатов.
• Не учитываются условия достижимости опасной операции.
• Семантика трансформирующих операций определяется
исключительно базой знаний.
• Подход применим только к классам уязвимостей к атакам,
основанным на передаче в опасную операцию конкретных
значений аргументов.
Недостатки taint-анализа
Заголовок
• Символическое выполнение – абстрактная интерпретация кода
в рамках семантической модели потоков вычисления.
Roberto Baldoni, Emilio Coppa, Daniele Cono D'Elia, Camil
Demetrescu, Irene Finocchi, «A Survey of Symbolic Execution
Techniques»
(https://arxiv.org/abs/1610.00502)
• Конкретное выполнение – выполнение отдельных фрагментов
кода в заданном контексте.
Символическое и конкретное выполнение
Заголовок
2x^2 + 4 = 12
2x^2 = 12 - 4
2x^2 = 12 - 4
x^2 = (12 - 4) / 2
x = sqrt((12 - 4) / 2)
x = sqrt((8) / 2)
x = sqrt(4)
x = 2
Символическое и конкретное выполнение (пример)
Заголовок
Множество, генерирующая/распознающая функция которого
определяется истинностью заданных предикатов
Например:
{x ≥ -527625 (+), x < -527625 (-)}
Опциональное множество
Заголовок
Сущность абстрактной интерпретации, включающая:
• область видимости переменных (условные множества их
достижимых значений);
• условие достижимости;
• ссылку на вышележащий контекст;
• стратегию взаимодействия с областями видимости
вышележащих контекстов.
Контексты символического выполнения
Заголовок
int main(int z) {
int a = 10;
if (z > 5)
{
a = z - 5;
}
else
{
a = z + 5;
}
return a;
}
Контексты (1/8)
{}
Заголовок
int main(int z) {
int a = 10;
if (z > 5)
{
a = z - 5;
}
else
{
a = z + 5;
}
return a;
}
Контексты (2/8)
true ⇒ {
true ⇒ z,
}
Заголовок
int main(int z) {
int a = 10;
if (z > 5)
{
a = z - 5;
}
else
{
a = z + 5;
}
return a;
}
Контексты (3/8)
true ⇒ {
true ⇒ z,
true ⇒ a = 10
}
Заголовок
int main(int z) {
int a = 10;
if (z > 5)
{
a = z - 5;
}
else
{
a = z + 5;
}
return a;
}
Контексты (4/8)
z > 5 ⇒ {
true ⇒ z,
z > 5 ⇒ a = z - 5
}
Заголовок
int main(int z) {
int a = 10;
if (z > 5)
{
a = z - 5;
}
else
{
a = z + 5;
}
return a;
}
Контексты (5/8)
z ≤ 5 ⇒ {
true ⇒ z,
z ≤ 5 ⇒ a = z + 5
}
Заголовок
int main(int z) {
int a = 10;
if (z > 5)
{
a = z - 5;
}
else
{
a = z + 5;
}
return a;
}
Контексты (6/8)
true ⇒ {
true ⇒ z,
z > 5 ⇒ a = z - 5
z ≤ 5 ⇒ a = z + 5
}
Заголовок
int main(int z) {
int a = 10;
if (z > 5)
{
a = z - 5;
}
else
{
a = z + 5;
}
return a;
}
Контексты (7/8)
true ⇒ {
true ⇒ z,
z > 5 ⇒ a = z - 5
z ≤ 5 ⇒ a = z + 5
}
Заголовок
int main(int z) {
int a = 10;
if (z > 5)
{
a = z - 5;
}
else
{
a = z + 5;
}
return a;
}
Контексты (8/8)
true ⇒ {
true ⇒ z,
z > 5 ⇒ a = z - 5
z ≤ 5 ⇒ a = z + 5
}
Заголовок
• Глобальные
• Глобальный
• Типовой
• Экземплярный
• Локальные
• Функциональный
• Операторный
• Условный
• Циклический
Типы контекстов
Заголовок
Кондиционал – опциональное множество всех возможных
значений переменной
Кондиционализация – замена неизвестных переменных в
формуле их кондиционалами:
true { return a
true z,
z > 5 a = z - 5
z ≤ 5 a = z + 5
}
return true { true z, z > 5 z – 5, z ≤ 5 z + 5 }
Кондиционализация
Заголовок
Разложение формулы, содержащей кондиционалы, на N формул,
не содержащих кондиционалы с аггрегированием условий для
каждой из них:
return true { true z, z > 5 z – 5, z ≤ 5 z + 5 }
return z > 5 { z – 5 }
return z ≤ 5 { z + 5 }
Опционализация
Заголовок
Marek Trtík, PHD Thesis: «Symbolic Execution and Program
Loops»
(https://is.muni.cz/th/329313/fi_d/trtik_phdThesis.pdf)
Циклы / рекурсия?
Заголовок
Учебный проект с реализацией абстрактного интерпретатора
подможества языка C (http://jamesvanboxtel.com/projects/minic-
compiler/minic.pdf)
https://github.com/PositiveTechnologies/mantaray
Mantaray
Заголовок
• Single-pass режим интерпретации.
• Межпроцедурный анализ с поддержкой глобального состояния.
• Упрощение формул достижимости SMT-солвером.
• Технический долг:
• циклы;
• указатели;
• детектирование NPD и инъекций;
Mantaray: особенности
Заголовок
ptsecurity.com
Спасибо!
Спасибо!
Ad

More Related Content

What's hot (17)

Making of external DSL for Django ORM - Павел Петлинский, Rambler&Co
Making of external DSL for Django ORM - Павел Петлинский, Rambler&CoMaking of external DSL for Django ORM - Павел Петлинский, Rambler&Co
Making of external DSL for Django ORM - Павел Петлинский, Rambler&Co
it-people
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
SQALab
 
основы Java переменные, циклы
основы Java   переменные, циклыосновы Java   переменные, циклы
основы Java переменные, циклы
Sergey Nemchinsky
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
Eugeniy Tyumentcev
 
Релиз PHP7 - что нас ждет в октябре 2015
Релиз PHP7 - что нас ждет в октябре 2015Релиз PHP7 - что нас ждет в октябре 2015
Релиз PHP7 - что нас ждет в октябре 2015
Andrey Tokarchuk
 
Parallel STL
Parallel STLParallel STL
Parallel STL
Evgeny Krutko
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
Technopark
 
XML Magic
XML MagicXML Magic
XML Magic
Igor Khotin
 
Haskell
HaskellHaskell
Haskell
DevDay
 
C++ idioms
C++ idiomsC++ idioms
C++ idioms
COMAQA.BY
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
Sergey Platonov
 
SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...
SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...
SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...
DevDay
 
Tricky Java Generics
Tricky Java GenericsTricky Java Generics
Tricky Java Generics
Alexander Matorin
 
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
7bits
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
victor-yastrebov
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
Dima Dzuba
 
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Platonov Sergey
 
Making of external DSL for Django ORM - Павел Петлинский, Rambler&Co
Making of external DSL for Django ORM - Павел Петлинский, Rambler&CoMaking of external DSL for Django ORM - Павел Петлинский, Rambler&Co
Making of external DSL for Django ORM - Павел Петлинский, Rambler&Co
it-people
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
SQALab
 
основы Java переменные, циклы
основы Java   переменные, циклыосновы Java   переменные, циклы
основы Java переменные, циклы
Sergey Nemchinsky
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
Eugeniy Tyumentcev
 
Релиз PHP7 - что нас ждет в октябре 2015
Релиз PHP7 - что нас ждет в октябре 2015Релиз PHP7 - что нас ждет в октябре 2015
Релиз PHP7 - что нас ждет в октябре 2015
Andrey Tokarchuk
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
Technopark
 
Haskell
HaskellHaskell
Haskell
DevDay
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
Sergey Platonov
 
SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...
SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...
SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...
DevDay
 
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
7bits
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
victor-yastrebov
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
Dima Dzuba
 
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Platonov Sergey
 

Similar to Формальные методы защиты приложений (20)

Трущобы Application Security
Трущобы Application SecurityТрущобы Application Security
Трущобы Application Security
Positive Development User Group
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
Глеб Тарасов
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
Zestranec
 
QA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverageQA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverage
QAFest
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreData
Dmitriy Kuragin
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
Yuri Trukhin
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
solit
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and Clojure
Vasil Remeniuk
 
Intro to Swift techitout
Intro to Swift techitoutIntro to Swift techitout
Intro to Swift techitout
Alexandr Graschenkov
 
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
Ontico
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
Infinity
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
Vasil Remeniuk
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Глеб Тарасов
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и Zephir
CodeFest
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
Dmitry Stropalov
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
Zestranec
 
QA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverageQA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverage
QAFest
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreData
Dmitriy Kuragin
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
Yuri Trukhin
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
solit
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and Clojure
Vasil Remeniuk
 
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
Ontico
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
Infinity
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
Vasil Remeniuk
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Глеб Тарасов
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и Zephir
CodeFest
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
Dmitry Stropalov
 
Ad

More from Positive Hack Days (20)

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

Формальные методы защиты приложений

  • 3. Заголовок def analyze(code, data): if not vulnerable(code, data): # given configuration is secure else: # given configuration is vulnerable АНАЛИЗАТОР КОДА (ПРИМЕР 1/6)
  • 4. Заголовок def analyze(code, data): if not vulnerable(code, data): # given configuration is secure vulnerable_function_call() else: # given configuration is vulnerable АНАЛИЗАТОР КОДА (ПРИМЕР 2/6)
  • 5. Заголовок analyzer_code = """ def analyze(code, data): if not vulnerable(code, data): # given configuration is secure vulnerable_function_call() else: # given configuration is vulnerable """ АНАЛИЗАТОР КОДА (ПРИМЕР 3/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) АНАЛИЗАТОР КОДА (ПРИМЕР 4/6)
  • 7. Заголовок 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) АНАЛИЗАТОР КОДА (ПРИМЕР 5/6)
  • 8. Заголовок 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) ¯_(ツ)_/¯ АНАЛИЗАТОР КОДА (ПРИМЕР 6/6)
  • 9. Заголовок 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 И сколько таких «частных» случаев теперь возможно? ЧАСТНЫЙ СЛУЧАЙ?
  • 10. Заголовок Не существует универсального анализатора защищённости ТЕОРЕМА РАЙСА (ПРИМЕНИТЕЛЬНО К APPSEC)
  • 11. Заголовок Проблема анализа защищённости решаема для программ: • эквивалентных конечным автоматам (за PTIME) • сводимых к конечным автоматам за счёт накладывания ограничений на размеры доступной памяти, размерность переменных, количество итераций циклов и т.п. (за EXPTIME) Все существующие анализаторы используют подходы, основанные на аппроксимации модели исследуемого кода. Любой статанализатор легко «обламывается» не более, чем 3 строчками кода СТАТАНАЛИЗАТОРЫ – ИНДУСТРИЯ ОБМАНА?
  • 12. Заголовок Интерпретация кода в рамках семантической модели, отличающейся от модели формального языка. Основной инструмент аппроксимации кода. Абстрактная интерпретация
  • 13. Заголовок Построим свою собственную арифметику со знаком и формулами: (+a) = (+) (-a) = (-) (-a) * (+b) = (-) (-a) / (+b) = (-) (-a) + (+b) = a ≤ b ⇒ (+), a > b ⇒ (-) И применим её: -42 / 8 * 100500 + x = x ≥ -527625 ⇒ (+), x < -527625 ⇒ (-) Абстрактная интерпретация на пальцах
  • 14. Заголовок Применяется для доказательства факта зависимости потоков данных различных типов. Частный случай – доказательство зависимости выходных данных от входных aka taint-анализ. Анализ зависимостей кода
  • 15. ЗаголовокTaint-анализ (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); }
  • 16. ЗаголовокTaint-анализ (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); }
  • 17. ЗаголовокTaint-анализ (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); }
  • 18. ЗаголовокTaint-анализ (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); }
  • 19. ЗаголовокTaint-анализ (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); }
  • 20. ЗаголовокTaint-анализ (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); }
  • 21. ЗаголовокTaint-анализ (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); }
  • 22. ЗаголовокTaint-анализ (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); }
  • 23. ЗаголовокTaint-анализ (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); }
  • 24. Заголовок • Невозможно автоматизировать верификацию результатов. • Не учитываются условия достижимости опасной операции. • Семантика трансформирующих операций определяется исключительно базой знаний. • Подход применим только к классам уязвимостей к атакам, основанным на передаче в опасную операцию конкретных значений аргументов. Недостатки taint-анализа
  • 25. Заголовок • Символическое выполнение – абстрактная интерпретация кода в рамках семантической модели потоков вычисления. Roberto Baldoni, Emilio Coppa, Daniele Cono D'Elia, Camil Demetrescu, Irene Finocchi, «A Survey of Symbolic Execution Techniques» (https://arxiv.org/abs/1610.00502) • Конкретное выполнение – выполнение отдельных фрагментов кода в заданном контексте. Символическое и конкретное выполнение
  • 26. Заголовок 2x^2 + 4 = 12 2x^2 = 12 - 4 2x^2 = 12 - 4 x^2 = (12 - 4) / 2 x = sqrt((12 - 4) / 2) x = sqrt((8) / 2) x = sqrt(4) x = 2 Символическое и конкретное выполнение (пример)
  • 27. Заголовок Множество, генерирующая/распознающая функция которого определяется истинностью заданных предикатов Например: {x ≥ -527625 (+), x < -527625 (-)} Опциональное множество
  • 28. Заголовок Сущность абстрактной интерпретации, включающая: • область видимости переменных (условные множества их достижимых значений); • условие достижимости; • ссылку на вышележащий контекст; • стратегию взаимодействия с областями видимости вышележащих контекстов. Контексты символического выполнения
  • 29. Заголовок int main(int z) { int a = 10; if (z > 5) { a = z - 5; } else { a = z + 5; } return a; } Контексты (1/8) {}
  • 30. Заголовок int main(int z) { int a = 10; if (z > 5) { a = z - 5; } else { a = z + 5; } return a; } Контексты (2/8) true ⇒ { true ⇒ z, }
  • 31. Заголовок int main(int z) { int a = 10; if (z > 5) { a = z - 5; } else { a = z + 5; } return a; } Контексты (3/8) true ⇒ { true ⇒ z, true ⇒ a = 10 }
  • 32. Заголовок int main(int z) { int a = 10; if (z > 5) { a = z - 5; } else { a = z + 5; } return a; } Контексты (4/8) z > 5 ⇒ { true ⇒ z, z > 5 ⇒ a = z - 5 }
  • 33. Заголовок int main(int z) { int a = 10; if (z > 5) { a = z - 5; } else { a = z + 5; } return a; } Контексты (5/8) z ≤ 5 ⇒ { true ⇒ z, z ≤ 5 ⇒ a = z + 5 }
  • 34. Заголовок int main(int z) { int a = 10; if (z > 5) { a = z - 5; } else { a = z + 5; } return a; } Контексты (6/8) true ⇒ { true ⇒ z, z > 5 ⇒ a = z - 5 z ≤ 5 ⇒ a = z + 5 }
  • 35. Заголовок int main(int z) { int a = 10; if (z > 5) { a = z - 5; } else { a = z + 5; } return a; } Контексты (7/8) true ⇒ { true ⇒ z, z > 5 ⇒ a = z - 5 z ≤ 5 ⇒ a = z + 5 }
  • 36. Заголовок int main(int z) { int a = 10; if (z > 5) { a = z - 5; } else { a = z + 5; } return a; } Контексты (8/8) true ⇒ { true ⇒ z, z > 5 ⇒ a = z - 5 z ≤ 5 ⇒ a = z + 5 }
  • 37. Заголовок • Глобальные • Глобальный • Типовой • Экземплярный • Локальные • Функциональный • Операторный • Условный • Циклический Типы контекстов
  • 38. Заголовок Кондиционал – опциональное множество всех возможных значений переменной Кондиционализация – замена неизвестных переменных в формуле их кондиционалами: true { return a true z, z > 5 a = z - 5 z ≤ 5 a = z + 5 } return true { true z, z > 5 z – 5, z ≤ 5 z + 5 } Кондиционализация
  • 39. Заголовок Разложение формулы, содержащей кондиционалы, на N формул, не содержащих кондиционалы с аггрегированием условий для каждой из них: return true { true z, z > 5 z – 5, z ≤ 5 z + 5 } return z > 5 { z – 5 } return z ≤ 5 { z + 5 } Опционализация
  • 40. Заголовок Marek Trtík, PHD Thesis: «Symbolic Execution and Program Loops» (https://is.muni.cz/th/329313/fi_d/trtik_phdThesis.pdf) Циклы / рекурсия?
  • 41. Заголовок Учебный проект с реализацией абстрактного интерпретатора подможества языка C (http://jamesvanboxtel.com/projects/minic- compiler/minic.pdf) https://github.com/PositiveTechnologies/mantaray Mantaray
  • 42. Заголовок • Single-pass режим интерпретации. • Межпроцедурный анализ с поддержкой глобального состояния. • Упрощение формул достижимости SMT-солвером. • Технический долг: • циклы; • указатели; • детектирование NPD и инъекций; Mantaray: особенности