Ловим шеллкоды под arm
TRANSCRIPT
Ловим шеллкоды под ARMДокладчики : Гайворонская Светлана @SadieSvПетров Иван Сергеевич @_IvanPetrov_
Актуальность
• Значительный рост устройств на базе процессоров ARM: количество устройств на базе ARM превышает количество PC в несколько раз.
• Большая установочная база уязвимых программ и преемственность кода
• Ошибки работы с памятью все еще актуальны • Уязвимости в программном обеспечении этих устройств
могут принести огромный ущерб, как пользователям, так и производителям
@SadieSv @_IvanPetrov_
Решаема ли эта задача?
Activator• NOP• GetPC
Decryptor
Payload
Return address zone
• Ограничения по структуре • Ограничения по размеру
@SadieSv @_IvanPetrov_
Может все не так плохо?
• Stack canaries: вычисление псевдо-радномного значения и сохранения его на стек;
• SafeSEH: вместо защиты стека, используются техники защиты обработчиков исключений;
• DEP: стек или часть стека становятся неисполнимыми;
• ASLR: рандомизация начала кода, стека, кучи в адресном пространстве исполнимого процесса.
BYPASSED@SadieSv @_IvanPetrov_
Так что же с ARM-ом?
• Шеллкоды уже есть
• Методов обнаружения «поумнее» сигнатур…
Анализ применимости существующих методов
обнаружения шеллкодов
Для анализа применимости существующих методов
детектирования шеллкодов х86
к платформе ARM нужно выделить основные отличия этих архитектур.
@SadieSv @_IvanPetrov_
Основные отличия архитектур ARM от x86:
• Фиксированный размер команд;• Наличие 2-х режимов работы процессора (32bit и 16bit) и
возможность динамического переключения между ними;• Возможность условного выполнения инструкций
(в зависимости от значения регистра флагов);• Возможность прямого обращения к счетчику инструкций;• load-store архитектура (мы не можем из арифметических
инструкций обращаться напрямую в память);• При вызове функций аргументы помещаются в регистры.
@SadieSv @_IvanPetrov_
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_
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_
Результаты анализа
затрудняется (в некоторых случаях не представляется возможным).
Статический анализ
Динамический анализ
затрудняется
@SadieSv @_IvanPetrov_
Причины затруднения анализа
Появление в платформе ARM новых возможностей обфускации программ благодаря:
1. Условному выполнению инструкций;
2. Дополнительному режиму процессора.
@SadieSv @_IvanPetrov_
Статические признаки• Корректное дизассемблирование данных в цепочку, содержащую
не менее K инструкций;
• Наличие команды смены режима процессора (BX Rm) на пересечении цепочек команд из разных режимов процессора;
• Наличие Get-UsePC кода;
• Число паттернов ( инициализация аргументов, вызов функции ) превышает предопределенное пороговое значение;
• Системному вызову предшествует инициализация аргументов вызова;
• Наличие цикла записи/загрузки из памяти;
• Адрес возврата находится в определенном диапазоне значений;
• Последняя инструкция в цепочке заканчивается командой перехода (BL, BLX), либо системным вызовом(svc);
• Операнды самомодифицирующегося кода и кода с косвенными переходами должны быть инициализированы.
Корректное дизассемблирование данных в цепочку, содержащую не менее K инструкций
Не шеллкод
Не шеллкод
Не шеллкод
Не шеллкод
Шеллкод!
@SadieSv @_IvanPetrov_
Наличие команды смены режима процессора (BX Rm) на пересечении цепочек команд из разных режимов
процессора
Переключение режима
Шеллкод в режиме Thumb
Данные для шеллкода
Регистр PCПереход с переключением Код режима Thumb
@SadieSv @_IvanPetrov_
Наличие Get-UsePC кодаРегистр PC
Зашифрованный шеллкод
Получение PCИспользование PC
Получение PC в регистр LR (r14)
Использование PC
@SadieSv @_IvanPetrov_
Инициализация аргументов вызовов функций и системных вызовов
Аргументы вызова
Номер вызова
Системный вызов
_socket #281
_connect #283
@SadieSv @_IvanPetrov_
Наличие цикла записи/загрузки из памяти
Зашифрованный шеллкод
Чтение из памяти
Загрузка в память
Счетчик цикла
Адрес зашифрованной полезной нагрузки
Основной цикл
@SadieSv @_IvanPetrov_
Адрес возврата находится в определенном диапазоне значений
Адрес возврата
Уязвимый буфер
Стек
Полезная нагрузка
Шеллкод
0xbeffedbc0xbeffedbc0xbeffedbc0xbeffedbc0xbeffedbc0xbeffedbc
Зона адресов возврата
@SadieSv @_IvanPetrov_
Динамические признаки• Количество чтений полезной нагрузки превышает
определенный порог;
• Количество уникальных записей в память превышает определенный порог;
• Поток управления хотя бы один раз передается из адресного пространства входного буфера на адрес, по которому ранее осуществлялась запись;
• Количество исполненных wx-инструкций превышает определенный порог;
• В зависимости от определенных значений флагов выполняется набор инструкций, удовлетворяющих вредоносной сигнатуре.
@SadieSv @_IvanPetrov_
Запись и чтение из памяти
Декриптор Зашифрованная полезная нагрузка
N Уникальных чтений и записей
@SadieSv @_IvanPetrov_
Передача потока управления
Декриптор Расшифрованная полезная нагрузка
Поток управления
@SadieSv @_IvanPetrov_
Зависимость сигнатуры от флагов
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_
Предложенное решение
Реализовывать детекторы выделенных признаков, как расширение к существующей библиотеке детектирования шеллкодов - Demorpheus
@SadieSv @_IvanPetrov_
Demorpheus - идея
@SadieSv @_IvanPetrov_
Гибридный классификатор
Дизассемблирование
Построение CFG
Построение IFG
…
Дизассемблированный поток
CFG
IFG
…
Детектор признака 1
Детектор признака К
…
@SadieSv @_IvanPetrov_
Апробация
• Шеллкодов;
• Легитимных исполняемых файлов;
• Произвольных данных;
• Мультимедиа данных.
Апробация детекторов проводится на тестовой выборке, состоящей из:
@SadieSv @_IvanPetrov_
Результат исследований• Выделены признаки шеллкодов для
платформы ARM
• Реализованы детекторы, использующие признаки шеллкодов ARM
• Детекторы объединены в гибридный классификатор
• Классификатор реализован как расширение к библиотеке Demorpheus
@SadieSv @_IvanPetrov_
Результат исследований
@SadieSv @_IvanPetrov_
Результат исследований
@SadieSv @_IvanPetrov_
• Вопросы?
Спасибо за внимание!
@SadieSv @_IvanPetrov_