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
Спасибо!
Спасибо!

More Related Content

PDF
Теоретические основы Application Security
PDF
Formal verification of C code
PPTX
Прикладная теория Application Security
PDF
[JAM 1.1] Clean Code (Paul Malikov)
PPTX
Исключительно простая теория AppSec .NET
PPTX
course js day 2
PDF
Конкурентные ассоциативные контейнеры
PPTX
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Теоретические основы Application Security
Formal verification of C code
Прикладная теория Application Security
[JAM 1.1] Clean Code (Paul Malikov)
Исключительно простая теория AppSec .NET
course js day 2
Конкурентные ассоциативные контейнеры
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...

What's hot (17)

PDF
Making of external DSL for Django ORM - Павел Петлинский, Rambler&Co
PPTX
Тестирование программных фильтров безопасности
PPTX
основы Java переменные, циклы
PPTX
разработка серверов и серверных приложений лекция №3
PDF
Релиз PHP7 - что нас ждет в октябре 2015
PDF
Parallel STL
PPTX
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
ODP
XML Magic
PDF
Haskell
PPTX
C++ idioms
PPTX
Григорий Демченко, Универсальный адаптер
PDF
SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...
PDF
Tricky Java Generics
PPTX
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
PDF
Использование юнит-тестов для повышения качества разработки
PDF
Объектно-ориентированное программирование. Лекция 5 и 6
PDF
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Making of external DSL for Django ORM - Павел Петлинский, Rambler&Co
Тестирование программных фильтров безопасности
основы Java переменные, циклы
разработка серверов и серверных приложений лекция №3
Релиз PHP7 - что нас ждет в октябре 2015
Parallel STL
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
XML Magic
Haskell
C++ idioms
Григорий Демченко, Универсальный адаптер
SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...
Tricky Java Generics
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Использование юнит-тестов для повышения качества разработки
Объектно-ориентированное программирование. Лекция 5 и 6
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Ad

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

PDF
Трущобы Application Security
PPTX
Автоматическая генерация патчей для уязвимого исходного кода
PPTX
Автоматическая генерация патчей для уязвимого исходного кода
PPTX
Лекция по тестированию ПО
PPTX
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
PDF
static - defcon russia 20
PPT
Характерные черты функциональных языков программирования
PPTX
Современные подходы к SAST
PPTX
Problems of Automated Generation of Exploits on the Basis of Source Code
PPTX
AppSec -- хакерский путь
PPTX
Как разработать защищенное веб-приложение и не сойти при этом с ума (вебинар)
PPTX
Декларативно функциональный стиль в PHP
PDF
Формальная верификация кода на языке Си
PDF
Формальная верификация кода на языке Си
PPTX
Взломать Web-сайт на ASP.NET? Сложно, но можно!
PDF
Поиск ошибок в программах на языке C#
PDF
На что способны современные статические анализаторы для C#
PDF
Step cpp022
PPTX
Николай Паламарчук "Functional Programming basics for PHP developers"
Трущобы Application Security
Автоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кода
Лекция по тестированию ПО
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
static - defcon russia 20
Характерные черты функциональных языков программирования
Современные подходы к SAST
Problems of Automated Generation of Exploits on the Basis of Source Code
AppSec -- хакерский путь
Как разработать защищенное веб-приложение и не сойти при этом с ума (вебинар)
Декларативно функциональный стиль в PHP
Формальная верификация кода на языке Си
Формальная верификация кода на языке Си
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Поиск ошибок в программах на языке C#
На что способны современные статические анализаторы для C#
Step cpp022
Николай Паламарчук "Functional Programming basics for PHP developers"
Ad

More from Positive Hack Days (20)

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

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

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