SlideShare a Scribd company logo
1 of 42
Заголовок
ptsecurity.com
Технологии анализа
бинарного кода
приложений:
методы, проблемы,
инструменты
Константин Панарин
Positive Technologies
Заголовок
• Константин Панарин, Positive Technologies,
kpanarin@ptsecurity.com
• Разработчик группы анализа низкоуровневых приложений
• Интересы: x86-64 reverse-engineering, C++ Template
Metaprogramming
#whoami
Заголовок
• Цели анализа бинарного кода
• Некоторые методики анализа
• Обзор проблем
• Обзор современных средств бинарного анализа
Содержание
Заголовок
• Поиск ошибок
• Поиск уязвимостей
• Поиск недекларированных возможностей (НДВ)
• Восстановление логики работы программы (RE)
• Построение тестов
Задачи анализа бинарного кода
ЗаголовокОсобенности бинарного анализа
• Почти полное отсутствие информации о типах*
• Гораздо сложнее локализовать различную «метаинформацию»
(например, обработчики исключений)
• В исполняемых файлах возможно применение обфускации
и антиотладочных приёмов, затрудняющих анализ
• Высокая семантическая нагрузка отдельных ассемблерных инструкций
(особенно на CISC архитектурах)
*Классы легко распознаются благодаря
наличию виртуальных таблиц, но что делать
с элементарными типами?
Заголовок
Типы анализа:
• Статический анализ
• Исполнения программы не происходит
• Динамический анализ
• Анализ по одной трассе исполнения
• Комбинированный анализ
Технологии, применяемые в анализе:
• Символьное исполнение (symbolic execution)
• Как правило, используется в статическом анализе
• Анализ помеченных данных (taint analysis)
• Как правило, применяется при динамическом анализе
• Fuzzing
• Ожидаемые входные данные подменяются случайными
или специально сформированными
• И многие другие
Методики анализа бинарного кода
Заголовок
Типы анализа:
• Статический анализ
• Исполнения программы не происходит
• Динамический анализ
• Анализ по одной трассе исполнения
• Комбинированный анализ
Технологии, применяемые в анализе:
• Символьное исполнение (symbolic execution)
• Как правило, используется в статическом анализе
• Анализ помеченных данных (taint analysis)
• Как правило, применяется при динамическом анализе
• Fuzzing
• Ожидаемые входные данные подменяются случайными или специально
сформированными
Методики анализа бинарного кода
На практике инструменты анализа комбинируют в себе различные типы и технологии
из-за ограничений, существующих в них. Согласованное применение различных подходов
позволяет преодолевать эти ограничения полностью или частично
ЗаголовокСтатический анализ vs динамический анализ
Динамический анализ
• Наличие run-time информации:
карты памяти процесса, адресов
неявных вызовов и др.
• Явное исполнение программы
может требовать специфического
окружения
• Не всегда возможно
воспроизвести результаты
анализа
Статический анализ
• Как правило, работает быстрее
• Один анализ покрывает
потенциально бесконечное число
путей исполнения
• Работоспособен при отсутствии
части исходников / библиотек
• Пасует перед обфускацией
и шифрованием
• Отсутствие информации
о неявных вызовах
Заголовок
• Основная идея – замена конкретных входных данных
программы (аргументов функции) на символьные
• Символ представляет множество всех возможных
значений переменной
• Вместо конкретных значений программа будет обрабатывать
символьные выражения
• Символьное исполнение способно покрывать все возможные пути
в программе
• Каждый путь – это «состояние» программы, в котором хранятся условия
прохождения по этому пути (path constraints) и набор ограничений
на значения символьных данных (value constraints)
• SMT решатель (solver) – инструмент, определяющий совместность
(разрешимость) условий для прохождения по заданному пути
Символьное исполнение
Заголовок
int twice(int v) {
return 2 * v;
}
void test(int x, int y) {
z = twice(y);
if (x == z) {
if (x > y + 10)
ERROR;
}
}
int main() {
x = read();
y = read();
test(x,y);
}
Символьное исполнение: пример
При помощи символьного
исполнения найдем значения
x и y, при которых исполнение
попадет в ERROR
Пример взят из http://www.srl.inf.ethz.ch/pa2015/Lecture8.pdf
Заголовок
int twice(int v) {
return 2 * v;
}
void test(int x, int y) {
z = twice(y);
if (x == z) {
if (x > y + 10)
ERROR;
}
}
int main() {
x = read();
y = read();
test(x,y);
}
Символьное исполнение: пример
Value constraints:
X->x0
Y->y0
Path constraints:
True
Заголовок
int twice(int v) {
return 2 * v;
}
void test(int x, int y) {
z = twice(y);
if (x == z) {
if (x > y + 10)
ERROR;
}
}
int main() {
x = read();
y = read();
test(x,y);
}
Символьное исполнение: пример
Value constraints:
X->x0
Y->y0
Z->2*y0
Path constraints:
True
Символьно исполняем вызов функции
Заголовок
int twice(int v) {
return 2 * v;
}
void test(int x, int y) {
z = twice(y);
if (x == z) {
if (x > y + 10)
ERROR;
}
}
int main() {
x = read();
y = read();
test(x,y);
}
Символьное исполнение: пример
Value constraints:
X->x0
Y->y0
Z->2*y0
Path constraints:
x0 = 2y0
Value constraints:
X->x0
Y->y0
Z->2*y0
Path constraints:
x0 != 2y0
Два различных состояния после
условного перехода if (x==z)
Заголовок
int twice(int v) {
return 2 * v;
}
void test(int x, int y) {
z = twice(y);
if (x == z) {
if (x > y + 10)
ERROR;
}
}
int main() {
x = read();
y = read();
test(x,y);
}
Символьное исполнение: пример
Value constraints:
X->x0
Y->y0
Z->2*y0
Path constraints:
x0 =2y0 ^ x0 > y0+10
Value constraints:
X->x0
Y->y0
Z->2*y0
Path constraints:
x0 =2y0 ^ x0 <= y0+10
Исследуем условие x==z
Заголовок
int twice(int v) {
return 2 * v;
}
void test(int x, int y) {
z = twice(y);
if (x == z) {
if (x > y + 10)
ERROR;
}
}
int main() {
x = read();
y = read();
test(x,y);
}
Символьное исполнение: пример
Value constraints:
X->x0
Y->y0
Z->2*y0
Path constraints:
x0 = 2y0 ^ x0 > y0+10
Условие достижимости ERROR:
Заголовок
int twice(int v) {
return 2 * v;
}
void test(int x, int y) {
z = twice(y);
if (x == z) {
if (x > y + 10)
ERROR;
}
}
int main() {
x = read();
y = read();
test(x,y);
}
Символьное исполнение: пример
Value constraints:
X->x0
Y->y0
Z->2*y0
Path constraints:
x0 = 2y0 ^ x0 > y0+10
Условие достижимости ERROR:
SMT Solver выдает решение:
x0 = 40, y0 = 20
ЗаголовокСимвольное исполнение: общая схема
Транслятор
в IR
Ассемблерная
инструкция
Набор
инструкций IR
Пул состояний
(по одному для каждого
пути исполнения)
State №1
State №2
State №…
State №500
Каждое состояние хранит следующие
данные:
• Текущий IP (instruction pointer)
• Символьный контекст (регистры,
ячейки памяти, символьные ресурсы)
• Constraints
Executor
(director) –
занимается
обработкой
конкретного
состояния
X86: mov eax, ecx
___________________
IR:
STR R_ECX:32, , V_00:32
STR V_00:32, , R_EAX:32
Интерпретатор –
содержит
обработчики
для каждой
инструкции IR
Трансляция
Инструкция перехода
по условию X (branch)
Если достигнута контрольная
точка программы, проверяем
её достижимость: извлекаем
path constraints, решаем SMT-
задачу
SMT-Solvers: Z3,
STP, Boolector
New state a:
Constraints += X
New state b:
Constraints += ~X
Добавляем
новые
состояния
в пул
Searcher – выбирает
состояние из пула
ЗаголовокSymbolic execution: проблемы
• Path explosion (как генерировать меньшее число состояний?)
• Cycle-unrolling (что делать с циклами, условие остановки
которых зависит от символьной переменной?)
• Symbolic pointers (что делать с операциями load и store, адрес
которых тоже символический?)
• Constraint difficulty (не все SMT-solver’ы справятся
с нахождением решения)
• External resources (что делать с файлами, хэндлерами
и другими внешними объектами?)
ЗаголовокSymbolic execution: возможные пути решения проблем
• Path explosion – мёрджить (объединять) несколько состояний
в одно (но как и когда это делать?)
• Path explosion – распараллелить обработку различных
состояний
• Cycle unrolling, symbolic pointers – применять специальные
логики, созданные для верифицирования программ
(но насколько это эффективно?)
• External resources – создать DSL для описания внешних вызовов
в терминах executor’а или SMT-solver’а (насколько это быстро
и реализуемо?)
ЗаголовокSymbolic execution: ссылки
• KLEE: Unassisted and Automatic Generation of High-Coverage Tests
for Complex Systems Programs (C. Cadar, D. Dunbar, D. Engler)
• Unleashing MAYHEM on Binary Code (S. Cha, T. Avgerinos, A. Rebert
and D. Brumley)
• S2E: A Platform for In-Vivo Multi-Path Analysis of Software Systems
(V. Chipounov, V. Kuznetsov, G. Candea)
Заголовок
• Исключительно динамический метод анализа
• Связывает трассу исполнения программы с данными, которые
обрабатывались в ней в процессе этого исполнения
• Помогает дать ответ на вопрос о том, как именно программа
обрабатывала те или иные входные данные
Анализ помеченных данных (taint analysis)
ЗаголовокTaint analysis: базовая идея
• Основные концепции: shadow memory и taint propagation
Shadow memory
Taint propagation
Заголовок
mov eax, tainted_input
xor eax, eax ; eax is UNTAINTED
-----------------------------------------
push tainted_input
pop eax ; eax is TAINTED, dword[esp + 4] is
TAINTED
-----------------------------------------------------------------
xor eax, eax
cmp eax, tainted_input ; AF, CF, OF, PF, SF, ZF
is TAINTED
Taint propagation: примеры
mov eax, tainted _input
mov ecx, untainted_input
add ecx, eax ; ecx is TAINTED
-----------------------------------------
mov eax, tainted_input
mov ecx, untainted_input
mov ax, cx ; ax is UNTAINTED, eax is TAINTED
-----------------------------------------------------------------
Пример взят из http://defcon.org.ua/data/1/4_Oleksyk_Code_Analysis.pdf
ЗаголовокTaint analysis: общая схема
Program code:
________________
push ebp
mov ebp, esp
lea eax, [esp+8]
…
ret
Анализ исполняемых
инструкций во время
исполнения
add eax, [esp+8]
Instruction handler:
Синтаксический
парсинг инструкции
на операнды,
разрешение адресов
у memory операндов
Taint context
EBX: not tainted
Taint propagation
ECX: tainted
…
EDI: tainted
EAX: not tainted
SHADOW MEMORY
Операнды:
dest - eax,
src: eax, 0x7f2300
Чтение контекста:
eax – not tainted
0x7f2300 - tainted
Запись
контекста:
eax – tainted
ЗаголовокTaint analysis
Чем полезен taint-analysis:
• Tainted EIP говорит о возможности перехвата управления
(например, в результате stackheap overflow)
• Tainted arguments в некоторых функциях (например, форматная строка
в printf или строка команды в system) говорят о возможной уязвимости
• Tainted resources (например, хэндлеры, мьютексы и пр., которые не зависят
напрямую от пользовательского ввода) говорят о возможной ошибке
в программе
Недостатки:
• По своей природе требует детального анализа каждой исполняемой
инструкции, что может быть очень тяжело для набора x86
• Идеальный taint analysis должен отслеживать и инструментировать весь код,
исполняемый операционной системой (как в режиме пользователя,
так и в режиме ядра) Чревато низкой производительностью анализа
ЗаголовокTaint analysis: ссылки
• All You Ever Wanted to Know About Dynamic Taint Analysis and Forward
Symbolic Execution (but might have been afraid to ask) E. Schwartz,
T. Avgerinos, D. Brumley
• Dynamic taint analysis: Automatic detection, analysis, and signature generation
of exploit attacks on commodity software (J. Newsome , D. Song , J. Newsome,
D. Song)
• Program slicing (M. Weiser)
ЗаголовокКомбинированный анализ – concolic execution
Concrete + symbolic = concolic:
• Для некоторых символьных переменных используются их «конкретные» значения
при символьном исполнении
Применение:
• На контрольных точках создаём снимок всего процесса
• Инструментируем конкретную трассу: делаем taint-analysis и одновременно набираем
очередь символьных условий (constraints) для каждой инструкции перехода на пути
• После завершения анализа текущей трассы откатываем процесс к контрольной точке,
выбираем символьное условие из очереди, решаем для него SMT-задачу, полученное
решение (регистры и участки памяти) подставляем в память и контекст процесса
• Инструментируем новую трассу
Concolic execution – метод, применяемый для покрытия
максимального количества кода
Заголовок
int twice(int v) {
return 2 * v;
}
void test(int x, int y) {
z = twice(y);
if (x == z) {
if (x > y + 10)
ERROR;
}
}
int main() {
x = read();
y = read();
test(x,y);
}
Комбинированный анализ: пример
Теперь воспользуемся техникой
concolic execution и найдем
значения x и y, при которых
исполнение попадет в ERROR
Заголовок
int twice(int v) {
return 2 * v;
}
void test(int x, int y) {
z = twice(y);
if (x == z) {
if (x > y + 10)
ERROR;
}
}
int main() {
x = read();
y = read();
test(x,y);
}
Комбинированный анализ: пример
Предположим, что функция read
вернула «конкретные» значения
X=22
Y=7
Заголовок
int twice(int v) {
return 2 * v;
}
void test(int x, int y) {
z = twice(y);
if (x == z) {
if (x > y + 10)
ERROR;
}
}
int main() {
x = read();
y = read();
test(x,y);
}
Комбинированный анализ: пример
«Конкретные» значения:
X=22
Y=7
Делаем снимок процесса в точке
входа в функцию test
Value constraints:
X->x0
Y->y0
Path constraints:
True
Заголовок
int twice(int v) {
return 2 * v;
}
void test(int x, int y) {
z = twice(y);
if (x == z) {
if (x > y + 10)
ERROR;
}
}
int main() {
x = read();
y = read();
test(x,y);
}
Комбинированный анализ: пример
«Конкретные» значения:
X=22
Y=7
Z=14
Value constraints:
X->x0
Y->y0
Z->2*y0
Path constraints:
True
Исполняем вызов функции
Заголовок
int twice(int v) {
return 2 * v;
}
void test(int x, int y) {
z = twice(y);
if (x == z) {
if (x > y + 10)
ERROR;
}
}
int main() {
x = read();
y = read();
test(x,y);
}
Комбинированный анализ: пример
«Конкретные» значения:
X=22
Y=7
Z=14
Value constraints:
X->x0
Y->y0
Z->2*y0
Path constraints:
X0 != 2*y0
Заталкиваем
X0 == 2*y0 в пул собранных условий
«Конкретное» исполнение пойдет по ветке else
Заголовок
int twice(int v) {
return 2 * v;
}
void test(int x, int y) {
z = twice(y);
if (x == z) {
if (x > y + 10)
ERROR;
}
}
int main() {
x = read();
y = read();
test(x,y);
}
Комбинированный анализ: пример
«Конкретные» значения:
X=2
Y=1
Z=2
Value constraints:
X->x0
Y->y0
Z->2*y0
Path constraints:
x0 = 2*y0
Символьное исполнение вычислит новые x и y, чтобы пойти
по ветке true, и «конкретное» исполнение будет перезапущено
с точки входа в test
Заголовок
int twice(int v) {
return 2 * v;
}
void test(int x, int y) {
z = twice(y);
if (x == z) {
if (x > y + 10)
ERROR;
}
}
int main() {
x = read();
y = read();
test(x,y);
}
Комбинированный анализ: пример
«Конкретные» значения:
X=2
Y=1
Z=2
Value constraints:
X->x0
Y->y0
Z->2*y0
Path constraints:
x0 = 2*y0 ^ x0 <= y0 + 10
Однако «конкретное» исполнение опять
не дойдёт до error
Заголовок
int twice(int v) {
return 2 * v;
}
void test(int x, int y) {
z = twice(y);
if (x == z) {
if (x > y + 10)
ERROR;
}
}
int main() {
x = read();
y = read();
test(x,y);
}
Комбинированный анализ: пример
«Конкретные» значения:
X=30
Y=15
Z=30
Value constraints:
X->x0
Y->y0
Z->2*y0
Path constraints:
x0 = 2*y0 ^ x0 > y0 + 10
Символьное исполнение вычислит новые
значения x и y для нужных path constraints,
откатимся к снимку и подменим x и y, исходя
из новых условий.
ЗаголовокСуществующие инструменты (Open Source)
KLEE
• Базируется на llvm IR
• Использует символьное исполнение
• Автоматическая генерация тестов
(максимальное покрытие исходного кода)
• Имеет несколько стратегий выбора состояний
в процессе symbolic execution
KLEE используется в S2E – платформе для анализа исполнения
приложений в «реальной» среде
ЗаголовокСуществующие инструменты (Open Source)
Triton
• Реализует схему concolic execution
• Переводит инструкции непосредственно в выражения solver’а
(Z3), минуя внутреннее представление
Другие: FuzzBall, BitBlaze, Avalanche и прочие
• Как правило, нет инструментов надлежащего продуктового
качества
• Каждый инструмент «заточен» под решение некоторой своей
специфичной задачи
ЗаголовокСуществующие инструменты (Closed Source)
MAYHEM
• Создан для поиска и автоматической генерации exploit’ов
• Есть продвижение в работе с символьными адресами
• Победитель конкурса DARPA в 2016
CodeSurfer, VeraCode
• Платные инструменты бинарного анализа
• Очень мало информации о деталях их работы
ЗаголовокОбщий вывод
• Методики бинарного анализа все еще нуждаются в глубоких
исследованиях
• В данный момент не существует универсального инструмента
бинарного анализа
• Каждый инструмент решает какую-либо конкретную задачу,
обходя известные ограничения за счет качества анализа
• Positive Technologies работает над своим инструментом – STAY
TUNED!
ЗаголовокBackup
ЗаголовокСимвольное исполнение: общая схема
Транслятор
в IR
Ассемблерная
инструкция
Набор
инструкций IR
Пул состояний
(по одному для каждого пути
исполнения)
State №1
State №2
State №…
State №500
Searcher – выбирает
состояние из пула.
Возможные стратегии
выбора:
• DPS
BPS
• Random choice
• Best coverage state
Каждое состояние хранит следующие данные:
• Текущий IP (instruction pointer)
• Символьный контекст (регистры, ячейки
памяти, символьные ресурсы)
• Path constraints
Executor
(director) –
занимается
обработкой
конкретного
состояния
mov eax, ecx
___________________
STR R_ECX:32, , V_00:32
STR V_00:32, , R_EAX:32
Интерпретатор –
содержит
обработчики
для каждой
инструкции IR
Трансляция
Логическая
или арифметическая
микроинструкция:
xor, and, or, bvadd, bvsub и пр. –
изменить символьный контекст
обрабатываемого состояния
Обработка внешнего вызова:
изменить символьный контекст
в соответствии с семантикой,
приписанной (в DSL)
конкретной сторонней функции
База с семантикой
внешних функций
Микроинструкции аллокации памяти /
работы с памятью: создание новой
или изменение существующей
символьной ячейки памяти
для обрабатываемого состояния
Микроинструкции передачи
управления по условию X
Если достигнута контрольная
точка программы, проверяем
её достижимость: извлекаем
path constraints, решаем
SMT-задачу
SMT-Solvers: Z3,
STP, Boolector
New state a:
Constraints += X
New state b:
Constraints += ~X
Добавляем
новые
состояния
в пул
Заголовок
ptsecurity.com
Спасибо!
Спасибо!

More Related Content

What's hot

Автоматизация построения правил для Approof
Автоматизация построения правил для ApproofАвтоматизация построения правил для Approof
Автоматизация построения правил для ApproofPositive Hack Days
 
От экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 летОт экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 летPositive Development User Group
 
Криптология в анализе защищённости
Криптология в анализе защищённостиКриптология в анализе защищённости
Криптология в анализе защищённостиbeched
 
Воркшоп по анализ защищённости веб-приложений
Воркшоп по анализ защищённости веб-приложенийВоркшоп по анализ защищённости веб-приложений
Воркшоп по анализ защищённости веб-приложенийbeched
 
Data mining for nmap acceleration
Data mining for nmap accelerationData mining for nmap acceleration
Data mining for nmap accelerationbeched
 
Anton Tsitou "Cycle ORM and Graphs"
Anton Tsitou "Cycle ORM and Graphs"Anton Tsitou "Cycle ORM and Graphs"
Anton Tsitou "Cycle ORM and Graphs"Fwdays
 
[DagCTF 2015] Hacking motivation
[DagCTF 2015] Hacking motivation[DagCTF 2015] Hacking motivation
[DagCTF 2015] Hacking motivationbeched
 
Node.js for enterprise 2021 - JavaScript Fwdays 3
Node.js for enterprise 2021 - JavaScript Fwdays 3Node.js for enterprise 2021 - JavaScript Fwdays 3
Node.js for enterprise 2021 - JavaScript Fwdays 3Timur Shemsedinov
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
Скриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОСкриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОFedor Malyshkin
 
Метапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScriptМетапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScriptTimur Shemsedinov
 
Автоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кодаАвтоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кодаVladimir Kochetkov
 
Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0zfconfua
 
AppSec -- хакерский путь
AppSec -- хакерский путьAppSec -- хакерский путь
AppSec -- хакерский путьVladimir Kochetkov
 
Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"Fwdays
 
еще один недостаток современных клиент серверных приложений
еще один недостаток современных клиент серверных приложенийеще один недостаток современных клиент серверных приложений
еще один недостаток современных клиент серверных приложенийsnowytoxa
 
Node.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаNode.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаAlexei Smolyanov
 
Как разработать защищенное веб-приложение и не сойти при этом с ума (вебинар)
Как разработать защищенное веб-приложение и не сойти при этом с ума (вебинар)Как разработать защищенное веб-приложение и не сойти при этом с ума (вебинар)
Как разработать защищенное веб-приложение и не сойти при этом с ума (вебинар)Vladimir Kochetkov
 

What's hot (20)

Автоматизация построения правил для Approof
Автоматизация построения правил для ApproofАвтоматизация построения правил для Approof
Автоматизация построения правил для Approof
 
От экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 летОт экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 лет
 
Криптология в анализе защищённости
Криптология в анализе защищённостиКриптология в анализе защищённости
Криптология в анализе защищённости
 
Воркшоп по анализ защищённости веб-приложений
Воркшоп по анализ защищённости веб-приложенийВоркшоп по анализ защищённости веб-приложений
Воркшоп по анализ защищённости веб-приложений
 
Data mining for nmap acceleration
Data mining for nmap accelerationData mining for nmap acceleration
Data mining for nmap acceleration
 
Anton Tsitou "Cycle ORM and Graphs"
Anton Tsitou "Cycle ORM and Graphs"Anton Tsitou "Cycle ORM and Graphs"
Anton Tsitou "Cycle ORM and Graphs"
 
[DagCTF 2015] Hacking motivation
[DagCTF 2015] Hacking motivation[DagCTF 2015] Hacking motivation
[DagCTF 2015] Hacking motivation
 
Node.js for enterprise 2021 - JavaScript Fwdays 3
Node.js for enterprise 2021 - JavaScript Fwdays 3Node.js for enterprise 2021 - JavaScript Fwdays 3
Node.js for enterprise 2021 - JavaScript Fwdays 3
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Скриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОСкриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПО
 
Метапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScriptМетапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScript
 
Rethinking low-code
Rethinking low-codeRethinking low-code
Rethinking low-code
 
Автоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кодаАвтоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кода
 
Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0
 
AppSec -- хакерский путь
AppSec -- хакерский путьAppSec -- хакерский путь
AppSec -- хакерский путь
 
Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"
 
еще один недостаток современных клиент серверных приложений
еще один недостаток современных клиент серверных приложенийеще один недостаток современных клиент серверных приложений
еще один недостаток современных клиент серверных приложений
 
Node.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаNode.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчика
 
Как разработать защищенное веб-приложение и не сойти при этом с ума (вебинар)
Как разработать защищенное веб-приложение и не сойти при этом с ума (вебинар)Как разработать защищенное веб-приложение и не сойти при этом с ума (вебинар)
Как разработать защищенное веб-приложение и не сойти при этом с ума (вебинар)
 
Sql injection
Sql injectionSql injection
Sql injection
 

Viewers also liked

Безопасная разработка для руководителей
Безопасная разработка для руководителейБезопасная разработка для руководителей
Безопасная разработка для руководителейPositive Development User Group
 
Построение процесса безопасной разработки
Построение процесса безопасной разработкиПостроение процесса безопасной разработки
Построение процесса безопасной разработкиPositive Development User Group
 
SDL/SSDL для руководителей
SDL/SSDL для руководителейSDL/SSDL для руководителей
SDL/SSDL для руководителейValery Boronin
 
Цикл безопасной разработки SDL
Цикл безопасной разработки SDLЦикл безопасной разработки SDL
Цикл безопасной разработки SDLAlex Babenko
 
Owasp summit 2017
Owasp summit 2017 Owasp summit 2017
Owasp summit 2017 Dinis Cruz
 
SC conference - Building AppSec Teams
SC conference  - Building AppSec TeamsSC conference  - Building AppSec Teams
SC conference - Building AppSec TeamsDinis Cruz
 
SecDevOps Risk Workflow - v0.6
SecDevOps Risk Workflow - v0.6SecDevOps Risk Workflow - v0.6
SecDevOps Risk Workflow - v0.6Dinis Cruz
 
«Вредоносные браузерные расширения и борьба с ними», Александра Сватикова (Од...
«Вредоносные браузерные расширения и борьба с ними», Александра Сватикова (Од...«Вредоносные браузерные расширения и борьба с ними», Александра Сватикова (Од...
«Вредоносные браузерные расширения и борьба с ними», Александра Сватикова (Од...OWASP Russia
 
«Android Activity Hijacking», Евгений Блашко, Юрий Шабалин (АО «Сбербанк-Тех...
«Android Activity Hijacking»,  Евгений Блашко, Юрий Шабалин (АО «Сбербанк-Тех...«Android Activity Hijacking»,  Евгений Блашко, Юрий Шабалин (АО «Сбербанк-Тех...
«Android Activity Hijacking», Евгений Блашко, Юрий Шабалин (АО «Сбербанк-Тех...OWASP Russia
 

Viewers also liked (9)

Безопасная разработка для руководителей
Безопасная разработка для руководителейБезопасная разработка для руководителей
Безопасная разработка для руководителей
 
Построение процесса безопасной разработки
Построение процесса безопасной разработкиПостроение процесса безопасной разработки
Построение процесса безопасной разработки
 
SDL/SSDL для руководителей
SDL/SSDL для руководителейSDL/SSDL для руководителей
SDL/SSDL для руководителей
 
Цикл безопасной разработки SDL
Цикл безопасной разработки SDLЦикл безопасной разработки SDL
Цикл безопасной разработки SDL
 
Owasp summit 2017
Owasp summit 2017 Owasp summit 2017
Owasp summit 2017
 
SC conference - Building AppSec Teams
SC conference  - Building AppSec TeamsSC conference  - Building AppSec Teams
SC conference - Building AppSec Teams
 
SecDevOps Risk Workflow - v0.6
SecDevOps Risk Workflow - v0.6SecDevOps Risk Workflow - v0.6
SecDevOps Risk Workflow - v0.6
 
«Вредоносные браузерные расширения и борьба с ними», Александра Сватикова (Од...
«Вредоносные браузерные расширения и борьба с ними», Александра Сватикова (Од...«Вредоносные браузерные расширения и борьба с ними», Александра Сватикова (Од...
«Вредоносные браузерные расширения и борьба с ними», Александра Сватикова (Од...
 
«Android Activity Hijacking», Евгений Блашко, Юрий Шабалин (АО «Сбербанк-Тех...
«Android Activity Hijacking»,  Евгений Блашко, Юрий Шабалин (АО «Сбербанк-Тех...«Android Activity Hijacking»,  Евгений Блашко, Юрий Шабалин (АО «Сбербанк-Тех...
«Android Activity Hijacking», Евгений Блашко, Юрий Шабалин (АО «Сбербанк-Тех...
 

Similar to Технологии анализа бинарного кода приложений: требования, проблемы, инструменты

Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
Formal verification of operating system kernels
Formal verification of operating system kernelsFormal verification of operating system kernels
Formal verification of operating system kernelsDenis Efremov
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаAndrey Karpov
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C codeDenis Efremov
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...Mail.ru Group
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsNoveo
 
Бинарные уязвимости и эксплойты: технологии и перспективы
Бинарные уязвимости и эксплойты: технологии и перспективыБинарные уязвимости и эксплойты: технологии и перспективы
Бинарные уязвимости и эксплойты: технологии и перспективыd_olex
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1m2rus
 
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутAndrey Karpov
 
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасностиSAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасностиAndrey Karpov
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Alex Ott
 
Компилируемые в реальном времени DSL для С++
Компилируемые в реальном времени DSL для С++Компилируемые в реальном времени DSL для С++
Компилируемые в реальном времени DSL для С++corehard_by
 
Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Alex Tutubalin
 
Соединяя точки. Моделе-ориентированный процесс системного проектирования
Соединяя точки. Моделе-ориентированный процесс системного проектированияСоединяя точки. Моделе-ориентированный процесс системного проектирования
Соединяя точки. Моделе-ориентированный процесс системного проектированияYulia Madorskaya
 
CSS глазами машин
CSS глазами машинCSS глазами машин
CSS глазами машинRoman Dvornov
 

Similar to Технологии анализа бинарного кода приложений: требования, проблемы, инструменты (20)

Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Formal verification of operating system kernels
Formal verification of operating system kernelsFormal verification of operating system kernels
Formal verification of operating system kernels
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C code
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, generics
 
Бинарные уязвимости и эксплойты: технологии и перспективы
Бинарные уязвимости и эксплойты: технологии и перспективыБинарные уязвимости и эксплойты: технологии и перспективы
Бинарные уязвимости и эксплойты: технологии и перспективы
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
 
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минут
 
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасностиSAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
Dsl for c++
Dsl for c++Dsl for c++
Dsl for c++
 
Компилируемые в реальном времени DSL для С++
Компилируемые в реальном времени DSL для С++Компилируемые в реальном времени DSL для С++
Компилируемые в реальном времени DSL для С++
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12
 
Соединяя точки. Моделе-ориентированный процесс системного проектирования
Соединяя точки. Моделе-ориентированный процесс системного проектированияСоединяя точки. Моделе-ориентированный процесс системного проектирования
Соединяя точки. Моделе-ориентированный процесс системного проектирования
 
CSS глазами машин
CSS глазами машинCSS глазами машин
CSS глазами машин
 

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

  • 1. Заголовок ptsecurity.com Технологии анализа бинарного кода приложений: методы, проблемы, инструменты Константин Панарин Positive Technologies
  • 2. Заголовок • Константин Панарин, Positive Technologies, kpanarin@ptsecurity.com • Разработчик группы анализа низкоуровневых приложений • Интересы: x86-64 reverse-engineering, C++ Template Metaprogramming #whoami
  • 3. Заголовок • Цели анализа бинарного кода • Некоторые методики анализа • Обзор проблем • Обзор современных средств бинарного анализа Содержание
  • 4. Заголовок • Поиск ошибок • Поиск уязвимостей • Поиск недекларированных возможностей (НДВ) • Восстановление логики работы программы (RE) • Построение тестов Задачи анализа бинарного кода
  • 5. ЗаголовокОсобенности бинарного анализа • Почти полное отсутствие информации о типах* • Гораздо сложнее локализовать различную «метаинформацию» (например, обработчики исключений) • В исполняемых файлах возможно применение обфускации и антиотладочных приёмов, затрудняющих анализ • Высокая семантическая нагрузка отдельных ассемблерных инструкций (особенно на CISC архитектурах) *Классы легко распознаются благодаря наличию виртуальных таблиц, но что делать с элементарными типами?
  • 6. Заголовок Типы анализа: • Статический анализ • Исполнения программы не происходит • Динамический анализ • Анализ по одной трассе исполнения • Комбинированный анализ Технологии, применяемые в анализе: • Символьное исполнение (symbolic execution) • Как правило, используется в статическом анализе • Анализ помеченных данных (taint analysis) • Как правило, применяется при динамическом анализе • Fuzzing • Ожидаемые входные данные подменяются случайными или специально сформированными • И многие другие Методики анализа бинарного кода
  • 7. Заголовок Типы анализа: • Статический анализ • Исполнения программы не происходит • Динамический анализ • Анализ по одной трассе исполнения • Комбинированный анализ Технологии, применяемые в анализе: • Символьное исполнение (symbolic execution) • Как правило, используется в статическом анализе • Анализ помеченных данных (taint analysis) • Как правило, применяется при динамическом анализе • Fuzzing • Ожидаемые входные данные подменяются случайными или специально сформированными Методики анализа бинарного кода На практике инструменты анализа комбинируют в себе различные типы и технологии из-за ограничений, существующих в них. Согласованное применение различных подходов позволяет преодолевать эти ограничения полностью или частично
  • 8. ЗаголовокСтатический анализ vs динамический анализ Динамический анализ • Наличие run-time информации: карты памяти процесса, адресов неявных вызовов и др. • Явное исполнение программы может требовать специфического окружения • Не всегда возможно воспроизвести результаты анализа Статический анализ • Как правило, работает быстрее • Один анализ покрывает потенциально бесконечное число путей исполнения • Работоспособен при отсутствии части исходников / библиотек • Пасует перед обфускацией и шифрованием • Отсутствие информации о неявных вызовах
  • 9. Заголовок • Основная идея – замена конкретных входных данных программы (аргументов функции) на символьные • Символ представляет множество всех возможных значений переменной • Вместо конкретных значений программа будет обрабатывать символьные выражения • Символьное исполнение способно покрывать все возможные пути в программе • Каждый путь – это «состояние» программы, в котором хранятся условия прохождения по этому пути (path constraints) и набор ограничений на значения символьных данных (value constraints) • SMT решатель (solver) – инструмент, определяющий совместность (разрешимость) условий для прохождения по заданному пути Символьное исполнение
  • 10. Заголовок int twice(int v) { return 2 * v; } void test(int x, int y) { z = twice(y); if (x == z) { if (x > y + 10) ERROR; } } int main() { x = read(); y = read(); test(x,y); } Символьное исполнение: пример При помощи символьного исполнения найдем значения x и y, при которых исполнение попадет в ERROR Пример взят из http://www.srl.inf.ethz.ch/pa2015/Lecture8.pdf
  • 11. Заголовок int twice(int v) { return 2 * v; } void test(int x, int y) { z = twice(y); if (x == z) { if (x > y + 10) ERROR; } } int main() { x = read(); y = read(); test(x,y); } Символьное исполнение: пример Value constraints: X->x0 Y->y0 Path constraints: True
  • 12. Заголовок int twice(int v) { return 2 * v; } void test(int x, int y) { z = twice(y); if (x == z) { if (x > y + 10) ERROR; } } int main() { x = read(); y = read(); test(x,y); } Символьное исполнение: пример Value constraints: X->x0 Y->y0 Z->2*y0 Path constraints: True Символьно исполняем вызов функции
  • 13. Заголовок int twice(int v) { return 2 * v; } void test(int x, int y) { z = twice(y); if (x == z) { if (x > y + 10) ERROR; } } int main() { x = read(); y = read(); test(x,y); } Символьное исполнение: пример Value constraints: X->x0 Y->y0 Z->2*y0 Path constraints: x0 = 2y0 Value constraints: X->x0 Y->y0 Z->2*y0 Path constraints: x0 != 2y0 Два различных состояния после условного перехода if (x==z)
  • 14. Заголовок int twice(int v) { return 2 * v; } void test(int x, int y) { z = twice(y); if (x == z) { if (x > y + 10) ERROR; } } int main() { x = read(); y = read(); test(x,y); } Символьное исполнение: пример Value constraints: X->x0 Y->y0 Z->2*y0 Path constraints: x0 =2y0 ^ x0 > y0+10 Value constraints: X->x0 Y->y0 Z->2*y0 Path constraints: x0 =2y0 ^ x0 <= y0+10 Исследуем условие x==z
  • 15. Заголовок int twice(int v) { return 2 * v; } void test(int x, int y) { z = twice(y); if (x == z) { if (x > y + 10) ERROR; } } int main() { x = read(); y = read(); test(x,y); } Символьное исполнение: пример Value constraints: X->x0 Y->y0 Z->2*y0 Path constraints: x0 = 2y0 ^ x0 > y0+10 Условие достижимости ERROR:
  • 16. Заголовок int twice(int v) { return 2 * v; } void test(int x, int y) { z = twice(y); if (x == z) { if (x > y + 10) ERROR; } } int main() { x = read(); y = read(); test(x,y); } Символьное исполнение: пример Value constraints: X->x0 Y->y0 Z->2*y0 Path constraints: x0 = 2y0 ^ x0 > y0+10 Условие достижимости ERROR: SMT Solver выдает решение: x0 = 40, y0 = 20
  • 17. ЗаголовокСимвольное исполнение: общая схема Транслятор в IR Ассемблерная инструкция Набор инструкций IR Пул состояний (по одному для каждого пути исполнения) State №1 State №2 State №… State №500 Каждое состояние хранит следующие данные: • Текущий IP (instruction pointer) • Символьный контекст (регистры, ячейки памяти, символьные ресурсы) • Constraints Executor (director) – занимается обработкой конкретного состояния X86: mov eax, ecx ___________________ IR: STR R_ECX:32, , V_00:32 STR V_00:32, , R_EAX:32 Интерпретатор – содержит обработчики для каждой инструкции IR Трансляция Инструкция перехода по условию X (branch) Если достигнута контрольная точка программы, проверяем её достижимость: извлекаем path constraints, решаем SMT- задачу SMT-Solvers: Z3, STP, Boolector New state a: Constraints += X New state b: Constraints += ~X Добавляем новые состояния в пул Searcher – выбирает состояние из пула
  • 18. ЗаголовокSymbolic execution: проблемы • Path explosion (как генерировать меньшее число состояний?) • Cycle-unrolling (что делать с циклами, условие остановки которых зависит от символьной переменной?) • Symbolic pointers (что делать с операциями load и store, адрес которых тоже символический?) • Constraint difficulty (не все SMT-solver’ы справятся с нахождением решения) • External resources (что делать с файлами, хэндлерами и другими внешними объектами?)
  • 19. ЗаголовокSymbolic execution: возможные пути решения проблем • Path explosion – мёрджить (объединять) несколько состояний в одно (но как и когда это делать?) • Path explosion – распараллелить обработку различных состояний • Cycle unrolling, symbolic pointers – применять специальные логики, созданные для верифицирования программ (но насколько это эффективно?) • External resources – создать DSL для описания внешних вызовов в терминах executor’а или SMT-solver’а (насколько это быстро и реализуемо?)
  • 20. ЗаголовокSymbolic execution: ссылки • KLEE: Unassisted and Automatic Generation of High-Coverage Tests for Complex Systems Programs (C. Cadar, D. Dunbar, D. Engler) • Unleashing MAYHEM on Binary Code (S. Cha, T. Avgerinos, A. Rebert and D. Brumley) • S2E: A Platform for In-Vivo Multi-Path Analysis of Software Systems (V. Chipounov, V. Kuznetsov, G. Candea)
  • 21. Заголовок • Исключительно динамический метод анализа • Связывает трассу исполнения программы с данными, которые обрабатывались в ней в процессе этого исполнения • Помогает дать ответ на вопрос о том, как именно программа обрабатывала те или иные входные данные Анализ помеченных данных (taint analysis)
  • 22. ЗаголовокTaint analysis: базовая идея • Основные концепции: shadow memory и taint propagation Shadow memory Taint propagation
  • 23. Заголовок mov eax, tainted_input xor eax, eax ; eax is UNTAINTED ----------------------------------------- push tainted_input pop eax ; eax is TAINTED, dword[esp + 4] is TAINTED ----------------------------------------------------------------- xor eax, eax cmp eax, tainted_input ; AF, CF, OF, PF, SF, ZF is TAINTED Taint propagation: примеры mov eax, tainted _input mov ecx, untainted_input add ecx, eax ; ecx is TAINTED ----------------------------------------- mov eax, tainted_input mov ecx, untainted_input mov ax, cx ; ax is UNTAINTED, eax is TAINTED ----------------------------------------------------------------- Пример взят из http://defcon.org.ua/data/1/4_Oleksyk_Code_Analysis.pdf
  • 24. ЗаголовокTaint analysis: общая схема Program code: ________________ push ebp mov ebp, esp lea eax, [esp+8] … ret Анализ исполняемых инструкций во время исполнения add eax, [esp+8] Instruction handler: Синтаксический парсинг инструкции на операнды, разрешение адресов у memory операндов Taint context EBX: not tainted Taint propagation ECX: tainted … EDI: tainted EAX: not tainted SHADOW MEMORY Операнды: dest - eax, src: eax, 0x7f2300 Чтение контекста: eax – not tainted 0x7f2300 - tainted Запись контекста: eax – tainted
  • 25. ЗаголовокTaint analysis Чем полезен taint-analysis: • Tainted EIP говорит о возможности перехвата управления (например, в результате stackheap overflow) • Tainted arguments в некоторых функциях (например, форматная строка в printf или строка команды в system) говорят о возможной уязвимости • Tainted resources (например, хэндлеры, мьютексы и пр., которые не зависят напрямую от пользовательского ввода) говорят о возможной ошибке в программе Недостатки: • По своей природе требует детального анализа каждой исполняемой инструкции, что может быть очень тяжело для набора x86 • Идеальный taint analysis должен отслеживать и инструментировать весь код, исполняемый операционной системой (как в режиме пользователя, так и в режиме ядра) Чревато низкой производительностью анализа
  • 26. ЗаголовокTaint analysis: ссылки • All You Ever Wanted to Know About Dynamic Taint Analysis and Forward Symbolic Execution (but might have been afraid to ask) E. Schwartz, T. Avgerinos, D. Brumley • Dynamic taint analysis: Automatic detection, analysis, and signature generation of exploit attacks on commodity software (J. Newsome , D. Song , J. Newsome, D. Song) • Program slicing (M. Weiser)
  • 27. ЗаголовокКомбинированный анализ – concolic execution Concrete + symbolic = concolic: • Для некоторых символьных переменных используются их «конкретные» значения при символьном исполнении Применение: • На контрольных точках создаём снимок всего процесса • Инструментируем конкретную трассу: делаем taint-analysis и одновременно набираем очередь символьных условий (constraints) для каждой инструкции перехода на пути • После завершения анализа текущей трассы откатываем процесс к контрольной точке, выбираем символьное условие из очереди, решаем для него SMT-задачу, полученное решение (регистры и участки памяти) подставляем в память и контекст процесса • Инструментируем новую трассу Concolic execution – метод, применяемый для покрытия максимального количества кода
  • 28. Заголовок int twice(int v) { return 2 * v; } void test(int x, int y) { z = twice(y); if (x == z) { if (x > y + 10) ERROR; } } int main() { x = read(); y = read(); test(x,y); } Комбинированный анализ: пример Теперь воспользуемся техникой concolic execution и найдем значения x и y, при которых исполнение попадет в ERROR
  • 29. Заголовок int twice(int v) { return 2 * v; } void test(int x, int y) { z = twice(y); if (x == z) { if (x > y + 10) ERROR; } } int main() { x = read(); y = read(); test(x,y); } Комбинированный анализ: пример Предположим, что функция read вернула «конкретные» значения X=22 Y=7
  • 30. Заголовок int twice(int v) { return 2 * v; } void test(int x, int y) { z = twice(y); if (x == z) { if (x > y + 10) ERROR; } } int main() { x = read(); y = read(); test(x,y); } Комбинированный анализ: пример «Конкретные» значения: X=22 Y=7 Делаем снимок процесса в точке входа в функцию test Value constraints: X->x0 Y->y0 Path constraints: True
  • 31. Заголовок int twice(int v) { return 2 * v; } void test(int x, int y) { z = twice(y); if (x == z) { if (x > y + 10) ERROR; } } int main() { x = read(); y = read(); test(x,y); } Комбинированный анализ: пример «Конкретные» значения: X=22 Y=7 Z=14 Value constraints: X->x0 Y->y0 Z->2*y0 Path constraints: True Исполняем вызов функции
  • 32. Заголовок int twice(int v) { return 2 * v; } void test(int x, int y) { z = twice(y); if (x == z) { if (x > y + 10) ERROR; } } int main() { x = read(); y = read(); test(x,y); } Комбинированный анализ: пример «Конкретные» значения: X=22 Y=7 Z=14 Value constraints: X->x0 Y->y0 Z->2*y0 Path constraints: X0 != 2*y0 Заталкиваем X0 == 2*y0 в пул собранных условий «Конкретное» исполнение пойдет по ветке else
  • 33. Заголовок int twice(int v) { return 2 * v; } void test(int x, int y) { z = twice(y); if (x == z) { if (x > y + 10) ERROR; } } int main() { x = read(); y = read(); test(x,y); } Комбинированный анализ: пример «Конкретные» значения: X=2 Y=1 Z=2 Value constraints: X->x0 Y->y0 Z->2*y0 Path constraints: x0 = 2*y0 Символьное исполнение вычислит новые x и y, чтобы пойти по ветке true, и «конкретное» исполнение будет перезапущено с точки входа в test
  • 34. Заголовок int twice(int v) { return 2 * v; } void test(int x, int y) { z = twice(y); if (x == z) { if (x > y + 10) ERROR; } } int main() { x = read(); y = read(); test(x,y); } Комбинированный анализ: пример «Конкретные» значения: X=2 Y=1 Z=2 Value constraints: X->x0 Y->y0 Z->2*y0 Path constraints: x0 = 2*y0 ^ x0 <= y0 + 10 Однако «конкретное» исполнение опять не дойдёт до error
  • 35. Заголовок int twice(int v) { return 2 * v; } void test(int x, int y) { z = twice(y); if (x == z) { if (x > y + 10) ERROR; } } int main() { x = read(); y = read(); test(x,y); } Комбинированный анализ: пример «Конкретные» значения: X=30 Y=15 Z=30 Value constraints: X->x0 Y->y0 Z->2*y0 Path constraints: x0 = 2*y0 ^ x0 > y0 + 10 Символьное исполнение вычислит новые значения x и y для нужных path constraints, откатимся к снимку и подменим x и y, исходя из новых условий.
  • 36. ЗаголовокСуществующие инструменты (Open Source) KLEE • Базируется на llvm IR • Использует символьное исполнение • Автоматическая генерация тестов (максимальное покрытие исходного кода) • Имеет несколько стратегий выбора состояний в процессе symbolic execution KLEE используется в S2E – платформе для анализа исполнения приложений в «реальной» среде
  • 37. ЗаголовокСуществующие инструменты (Open Source) Triton • Реализует схему concolic execution • Переводит инструкции непосредственно в выражения solver’а (Z3), минуя внутреннее представление Другие: FuzzBall, BitBlaze, Avalanche и прочие • Как правило, нет инструментов надлежащего продуктового качества • Каждый инструмент «заточен» под решение некоторой своей специфичной задачи
  • 38. ЗаголовокСуществующие инструменты (Closed Source) MAYHEM • Создан для поиска и автоматической генерации exploit’ов • Есть продвижение в работе с символьными адресами • Победитель конкурса DARPA в 2016 CodeSurfer, VeraCode • Платные инструменты бинарного анализа • Очень мало информации о деталях их работы
  • 39. ЗаголовокОбщий вывод • Методики бинарного анализа все еще нуждаются в глубоких исследованиях • В данный момент не существует универсального инструмента бинарного анализа • Каждый инструмент решает какую-либо конкретную задачу, обходя известные ограничения за счет качества анализа • Positive Technologies работает над своим инструментом – STAY TUNED!
  • 41. ЗаголовокСимвольное исполнение: общая схема Транслятор в IR Ассемблерная инструкция Набор инструкций IR Пул состояний (по одному для каждого пути исполнения) State №1 State №2 State №… State №500 Searcher – выбирает состояние из пула. Возможные стратегии выбора: • DPS BPS • Random choice • Best coverage state Каждое состояние хранит следующие данные: • Текущий IP (instruction pointer) • Символьный контекст (регистры, ячейки памяти, символьные ресурсы) • Path constraints Executor (director) – занимается обработкой конкретного состояния mov eax, ecx ___________________ STR R_ECX:32, , V_00:32 STR V_00:32, , R_EAX:32 Интерпретатор – содержит обработчики для каждой инструкции IR Трансляция Логическая или арифметическая микроинструкция: xor, and, or, bvadd, bvsub и пр. – изменить символьный контекст обрабатываемого состояния Обработка внешнего вызова: изменить символьный контекст в соответствии с семантикой, приписанной (в DSL) конкретной сторонней функции База с семантикой внешних функций Микроинструкции аллокации памяти / работы с памятью: создание новой или изменение существующей символьной ячейки памяти для обрабатываемого состояния Микроинструкции передачи управления по условию X Если достигнута контрольная точка программы, проверяем её достижимость: извлекаем path constraints, решаем SMT-задачу SMT-Solvers: Z3, STP, Boolector New state a: Constraints += X New state b: Constraints += ~X Добавляем новые состояния в пул