SlideShare ist ein Scribd-Unternehmen logo
1 von 43
Заголовок
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
Спасибо!
Спасибо!

Weitere ähnliche Inhalte

Was ist angesagt?

разработка серверов и серверных приложений лекция №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
 
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
7bits
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
victor-yastrebov
 

Was ist angesagt? (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
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
 
основы Java переменные, циклы
основы Java   переменные, циклыосновы Java   переменные, циклы
основы Java переменные, циклы
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
Релиз PHP7 - что нас ждет в октябре 2015
Релиз PHP7 - что нас ждет в октябре 2015Релиз PHP7 - что нас ждет в октябре 2015
Релиз PHP7 - что нас ждет в октябре 2015
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
 
XML Magic
XML MagicXML Magic
XML Magic
 
Haskell
HaskellHaskell
Haskell
 
C++ idioms
C++ idiomsC++ idioms
C++ idioms
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...
SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...
SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...
 
Tricky Java Generics
Tricky Java GenericsTricky Java Generics
Tricky Java Generics
 
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
 

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

Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
Zestranec
 
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
 
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
Ontico
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Глеб Тарасов
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
Dmitry Stropalov
 

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

Трущобы Application Security
Трущобы Application SecurityТрущобы Application Security
Трущобы Application Security
 
Algo 00
Algo 00Algo 00
Algo 00
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
 
Bytecode
BytecodeBytecode
Bytecode
 
QA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverageQA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverage
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreData
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and Clojure
 
Intro to Swift techitout
Intro to Swift techitoutIntro to Swift techitout
Intro to Swift techitout
 
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
 
Scala lecture #4
Scala lecture #4Scala lecture #4
Scala lecture #4
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и Zephir
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
 

Mehr von Positive Hack Days

Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»
Positive Hack Days
 
Эвристические методы защиты приложений
Эвристические методы защиты приложенийЭвристические методы защиты приложений
Эвристические методы защиты приложений
Positive Hack Days
 
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на граблиУязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Positive Hack Days
 
Механизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET CoreМеханизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET Core
Positive Hack Days
 

Mehr von Positive Hack Days (20)

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

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

  • 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: особенности