Ловим шеллкоды под arm

30
Ловим шеллкоды под ARM Докладчики : Гайворонская Светлана @SadieSv Петров Иван Сергеевич @_IvanPetrov_

Upload: positive-hack-days

Post on 12-May-2015

203 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Ловим шеллкоды под ARM

Ловим шеллкоды под ARMДокладчики : Гайворонская Светлана @SadieSvПетров Иван Сергеевич @_IvanPetrov_

Page 2: Ловим шеллкоды под ARM

Актуальность

• Значительный рост устройств на базе процессоров ARM: количество устройств на базе ARM превышает количество PC в несколько раз.

• Большая установочная база уязвимых программ и преемственность кода

• Ошибки работы с памятью все еще актуальны • Уязвимости в программном обеспечении этих устройств

могут принести огромный ущерб, как пользователям, так и производителям

@SadieSv @_IvanPetrov_

Page 3: Ловим шеллкоды под ARM

Решаема ли эта задача?

Activator• NOP• GetPC

Decryptor

Payload

Return address zone

• Ограничения по структуре • Ограничения по размеру

@SadieSv @_IvanPetrov_

Page 4: Ловим шеллкоды под ARM

Может все не так плохо?

• Stack canaries: вычисление псевдо-радномного значения и сохранения его на стек;

• SafeSEH: вместо защиты стека, используются техники защиты обработчиков исключений;

• DEP: стек или часть стека становятся неисполнимыми;

• ASLR: рандомизация начала кода, стека, кучи в адресном пространстве исполнимого процесса.

BYPASSED@SadieSv @_IvanPetrov_

Page 5: Ловим шеллкоды под ARM

Так что же с ARM-ом?

• Шеллкоды уже есть

• Методов обнаружения «поумнее» сигнатур…

Page 6: Ловим шеллкоды под ARM

Анализ применимости существующих методов

обнаружения шеллкодов

Для анализа применимости существующих методов

детектирования шеллкодов х86

к платформе ARM нужно выделить основные отличия этих архитектур.

@SadieSv @_IvanPetrov_

Page 7: Ловим шеллкоды под ARM

Основные отличия архитектур ARM от x86:

• Фиксированный размер команд;• Наличие 2-х режимов работы процессора (32bit и 16bit) и

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

(в зависимости от значения регистра флагов);• Возможность прямого обращения к счетчику инструкций;• load-store архитектура (мы не можем из арифметических

инструкций обращаться напрямую в память);• При вызове функций аргументы помещаются в регистры.

@SadieSv @_IvanPetrov_

Page 8: Ловим шеллкоды под ARM

i f ( e r r != 0)p r i n t f ( " Er r o r c o d e = %i \ n " , e r r ) ;

e l s ep r i n t f ( "OK! \ n " ) ;

CMP r1 , #0 BEQ . L4 LDR r0 , < string_1_address > BL printf B . L8. L4 : LDR r0 , < string_2_address > BL printf. L8 :

CMP r1 , #0LDRNE r0 , < string_1_address >LDREQ r0 , < string_2_address >BL printf

Без условного выполнения

С условным выполнением

Условное выполнение

@SadieSv @_IvanPetrov_

Page 9: Ловим шеллкоды под ARM

Thumb режим процессора

chmod("/etc/passwd", 0777) - 31 byte

"\x78\x46" // mov r0, pc"\x10\x30" // adds r0, #16"\xff\x21" // movs r1, #255 ; 0xff"\xff\x31" // adds r1, #255 ; 0xff"\x01\x31" // adds r1, #1"\x0f\x37" // adds r7, #15"\x01\xdf" // svc 1 ; chmod(..)"\x40\x40" // eors r0, r0"\x01\x27" // movs r7, #1"\x01\xdf" // svc 1 ; exit(0)"\x2f\x65\x74\x63" "\x2f\x70\x61\x73" "\x73\x77" "\x64”

chmod("/etc/passwd", 0777) - 51 byte

"\x0f\x00\xa0\xe1" // mov r0, pc"\x20\x00\x90\xe2" // adds r0, r0, #32"\xff\x10\xb0\xe3" // movs r1, #255 ; 0xff"\xff\x10\x91\xe2" // adds r1, r1, #255; 0xff"\x01\x10\x91\xe2" // adds r1, r1, #1"\x0f\x70\x97\xe2" // adds r7, r7, #15"\x01\x00\x00\xef" // svc 1"\x00\x00\x30\xe0" // eors r0, r0, r0"\x01\x70\xb0\xe3" // movs r7, #1"\x01\x00\x00\xef" // svc 1"\x2f\x65\x74\x63" "\x2f\x70\x61\x73" "\x73\x77" "\x64"

Thumb режим ARM режим

@SadieSv @_IvanPetrov_

Page 10: Ловим шеллкоды под ARM

Результаты анализа

затрудняется (в некоторых случаях не представляется возможным).

Статический анализ

Динамический анализ

затрудняется

@SadieSv @_IvanPetrov_

Page 11: Ловим шеллкоды под ARM

Причины затруднения анализа

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

1. Условному выполнению инструкций;

2. Дополнительному режиму процессора.

@SadieSv @_IvanPetrov_

Page 12: Ловим шеллкоды под ARM

Статические признаки• Корректное дизассемблирование данных в цепочку, содержащую

не менее K инструкций;

• Наличие команды смены режима процессора (BX Rm) на пересечении цепочек команд из разных режимов процессора;

• Наличие Get-UsePC кода;

• Число паттернов ( инициализация аргументов, вызов функции ) превышает предопределенное пороговое значение;

• Системному вызову предшествует инициализация аргументов вызова;

• Наличие цикла записи/загрузки из памяти;

• Адрес возврата находится в определенном диапазоне значений;

• Последняя инструкция в цепочке заканчивается командой перехода (BL, BLX), либо системным вызовом(svc);

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

Page 13: Ловим шеллкоды под ARM

Корректное дизассемблирование данных в цепочку, содержащую не менее K инструкций

Не шеллкод

Не шеллкод

Не шеллкод

Не шеллкод

Шеллкод!

@SadieSv @_IvanPetrov_

Page 14: Ловим шеллкоды под ARM

Наличие команды смены режима процессора (BX Rm) на пересечении цепочек команд из разных режимов

процессора

Переключение режима

Шеллкод в режиме Thumb

Данные для шеллкода

Регистр PCПереход с переключением Код режима Thumb

@SadieSv @_IvanPetrov_

Page 15: Ловим шеллкоды под ARM

Наличие Get-UsePC кодаРегистр PC

Зашифрованный шеллкод

Получение PCИспользование PC

Получение PC в регистр LR (r14)

Использование PC

@SadieSv @_IvanPetrov_

Page 16: Ловим шеллкоды под ARM

Инициализация аргументов вызовов функций и системных вызовов

Аргументы вызова

Номер вызова

Системный вызов

_socket #281

_connect #283

@SadieSv @_IvanPetrov_

Page 17: Ловим шеллкоды под ARM

Наличие цикла записи/загрузки из памяти

Зашифрованный шеллкод

Чтение из памяти

Загрузка в память

Счетчик цикла

Адрес зашифрованной полезной нагрузки

Основной цикл

@SadieSv @_IvanPetrov_

Page 18: Ловим шеллкоды под ARM

Адрес возврата находится в определенном диапазоне значений

Адрес возврата

Уязвимый буфер

Стек

Полезная нагрузка

Шеллкод

0xbeffedbc0xbeffedbc0xbeffedbc0xbeffedbc0xbeffedbc0xbeffedbc

Зона адресов возврата

@SadieSv @_IvanPetrov_

Page 19: Ловим шеллкоды под ARM

Динамические признаки• Количество чтений полезной нагрузки превышает

определенный порог;

• Количество уникальных записей в память превышает определенный порог;

• Поток управления хотя бы один раз передается из адресного пространства входного буфера на адрес, по которому ранее осуществлялась запись;

• Количество исполненных wx-инструкций превышает определенный порог;

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

@SadieSv @_IvanPetrov_

Page 20: Ловим шеллкоды под ARM

Запись и чтение из памяти

Декриптор Зашифрованная полезная нагрузка

N Уникальных чтений и записей

@SadieSv @_IvanPetrov_

Page 21: Ловим шеллкоды под ARM

Передача потока управления

Декриптор Расшифрованная полезная нагрузка

Поток управления

@SadieSv @_IvanPetrov_

Page 22: Ловим шеллкоды под ARM

Зависимость сигнатуры от флагов

Z = 0 & C = 0 Z = 1 & C = 0

ADDNES r0, r1 ADDNES r0, r1

Блок AL (любой флаг)

Блок AL (любой флаг)

Блок CS( С == 1)

Z = 0С = 1

Блок CS( С == 1)

Блок EQ( Z == 0)

Блок EQ( Z == 0)

ADDCCS r3, r4 ADDCCS r3, r4

Z = 1С = 0

Если был выполнен блок

EQ, то Z = 1, иначе Z = 0

Блок EQ( Z == 0)

Блок EQ( Z == 0)

@SadieSv @_IvanPetrov_

Page 23: Ловим шеллкоды под ARM

Предложенное решение

Реализовывать детекторы выделенных признаков, как расширение к существующей библиотеке детектирования шеллкодов - Demorpheus

@SadieSv @_IvanPetrov_

Page 24: Ловим шеллкоды под ARM

Demorpheus - идея

@SadieSv @_IvanPetrov_

Page 25: Ловим шеллкоды под ARM

Гибридный классификатор

Дизассемблирование

Построение CFG

Построение IFG

Дизассемблированный поток

CFG

IFG

Детектор признака 1

Детектор признака К

@SadieSv @_IvanPetrov_

Page 26: Ловим шеллкоды под ARM

Апробация

• Шеллкодов;

• Легитимных исполняемых файлов;

• Произвольных данных;

• Мультимедиа данных.

Апробация детекторов проводится на тестовой выборке, состоящей из:

@SadieSv @_IvanPetrov_

Page 27: Ловим шеллкоды под ARM

Результат исследований• Выделены признаки шеллкодов для

платформы ARM

• Реализованы детекторы, использующие признаки шеллкодов ARM

• Детекторы объединены в гибридный классификатор

• Классификатор реализован как расширение к библиотеке Demorpheus

@SadieSv @_IvanPetrov_

Page 28: Ловим шеллкоды под ARM

Результат исследований

@SadieSv @_IvanPetrov_

Page 29: Ловим шеллкоды под ARM

Результат исследований

@SadieSv @_IvanPetrov_

Page 30: Ловим шеллкоды под ARM

• Вопросы?

Спасибо за внимание!

@SadieSv @_IvanPetrov_