Upload
hackit-ukraine
View
344
Download
1
Embed Size (px)
Citation preview
ПЕРЕПОЛНЕНИЕ БУФЕРА И ДРУГИЕ УЯЗВИМОСТИ
ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ: ТЕОРИЯ И ПРАКТИКА ЗАЩИТЫ
Роман Олейников
http://www.slideshare.net/oliynykov
План доклада
●краткое представление●уязвимости ПО: универсальный вектор реализации атаки
●базовые типы уязвимостей программного обеспечения (системный уровень)
●переполнение буфера: пример атаки●методы защиты и способы их обхода●примеры широко распространенных критичных уязвимостей, их особенности и последствия использования
Коротко о докладчике
●доктор технических наук (симметричная криптография)●начальник отдела научных исследований АО "Институт информационных технологий" (Харьков)
●профессор кафедры безопасности информационных систем и технологий (ХНУ им. В.Н.Каразина) и кафедры безопасности информационных технологий (ХНУРЭ)
●visiting professor at Samsung Advanced Technology Training Institute (Suwon, South Korea)
● invited professor at the Selmer Center, Crypto and Security Research Group, University of Bergen (Norway)
●ответственный исполнитель (технический руководитель разработки), соавтор национальных криптографических стандартов ДСТУ 7624:2014 и ДСТУ 7564:2014 (блочный шифр “Калина” и функция хэширования “Купина”)
Количество опубликованных критичных уязвимостей в браузерах
Источник: Symantec Internet Security Threat report, 2015
Соотношение количества уязвимых Android-устройств (опубликованные уязвимости)
Источник: D.R.Thomas, A.R. Beresford. Security Metrics for the Android Ecosystem. University of Cambridge, United KingdomАктуальное состояние (октябрь 2015): подавляющее большинство устройств имеет незакрытую уязвимость Stagefright.
Результаты конкурса Pwn2Own 2015 (демонстрация уязвимостей нулевого дня)
● 5 bugs in the Windows operating system● 4 bugs in Internet Explorer 11● 3 bugs in Mozilla Firefox● 3 bugs in Adobe Reader● 3 bugs in Adobe Flash● 2 bugs in Apple Safari● 1 bug in Google Chrome (75,000 USD)
Итог: исследователям в общей сложности выплачено 557 500 USD за два дня проведения конкурса
NB: компании, целенаправленно занимающиеся обнаружением 0-day, как правило, в таких конкурсах не участвуют (из-за низких выплат)
Источник: HP Security Research Blog
Последствия киберпреступности для глобальной экономики
Источник: Norton/Symantec Cybercrime Report, 2013
Базовые типы уязвимостей программного обеспечения (системный уровень)
● переполнение буфера (buffer overflow) - прямой захват потока исполнения, возможен через:– стек; – динамическую память (heap); – сегмент данных;
● некорректные форматные строки (uncontrolled format string):– чтение локальных переменных (стек);– чтение любого блока данных в адресном пространстве процесса;– модификация значения в адресном пространстве процесса;
● целочисленные переполнения (integer oveflows):– выход за пределы допустимого диапазона значений
(предварительный этап захвата потока исполнения);– некорректные значения выходных данных модуля;– неверное ветвление при исполнении и пр.
● etc.
Переполнение буфера
Пример кода (С/С++) без проверки дипазона
Результат компиляции
Что будет, если копируемая строка окажется длиннее приемного буфера?
strcpy( &dst, &src ) , в отличие от strncpy( &dst, &src, sizeof (dst) ) , учитывает только длину копируемой строки (перезапись идет до нахождения завершающего нулевого символа), без учета размера приемного буфера
Стек потока (thread) при атаке: переполнение специально сформированным блоком (shellcode)
Практическая демонстрация
●netcalcd – уязвимый сетевой демон (сервис) для Linux (x86), разработанный для демонстрации переполнения буфера–прием и обработка текстовых запросов по сети
–печать отладочной информации в консоль
●утилита для атаки (exploit)–соединение с удаленным сервером
–отправка блока с кодом для переполнения буфера (exploitation)
netcalcd: нормальная работа
Запуск злоумышленного кода для атаки netcalcd
Переполнение буфера в стеке netcalcd
Linux-сервер: открытые порты до и после проведения атаки
Подключение к только что открытому порту на Linux-сервере
Утилита для реализации атаки
●клиентское приложение под Windows●открытие сетевого соединения с уязвимым сервером и отправить блок данных, вызывающий переполнение буфера
●блок данных, вызывающий переполнение, содержить исполнимый код, выполняющийся на атакованном компьютере (и запускающий дополнительный web-сервер)
Утилита для реализации атаки: клиентское приложение под Windows
открытие сетевого соединения
Блок данных, отправляемый на сервер: исполнимый код
Базовые рекомендации для защиты от переполнения буфера
●основная: писать безопасный код, делать вызовы только защищенных функций с верификацией всех входных данных; проводить независимый аудит кода;
●применение ASLR (Address Space Layout Randomization) в операционной системе;
●обязательное использование бита NX (XD) для процессоров х86/х86_64 (уровень операционной системы);
●применение компилятором canary words; ●запуск процессов/потоков с наименьшими привилегиями, необходимыми для нормальной работы.
ASLR: пример работы
Методы обхода ASLR
●прямой подбор верного адреса (старшие биты не меняются; слово выровнено по определенной границе; вероятность успеха рассчитываем на основе парадокса дней рождения);–метод эффективно работает и для обхода canary words
●возврат в код, находящийся в нерандомизированной памяти;
● jmp *esp●etc.
Источник (часть): Tio Muller, ASLR Smack & Laugh Reference
Бит NX: обход через returntolibc
● нет исполнения кода в стеке (и исключения процессора)
● адрес возврата перезаписывается и указывает на существующий код
● атакующий выбирает нужную функцию и аргументы для нее
● в Windows возможно сделать цепочку вызовов (для _stdcall_ вызываемая функция очищает стек)
Защита компилятора: canary words
NB: вероятность успеха обхода метода защиты на 32-битовой платформе примерно равна ½ для 216 попыток (математика: парадокс дней рождения)
Примеры широко распространенных критичных уязвимостей
● Heartbleed – уязвимость OpenSSL:–возможность получить доступ на чтение данных за пределами буфера по запросу из сети ;
–уязвимыми оказались сотни тысяч web-серверов, использующих библиотеку OpenSSL;
–похищены криптографические ключи и скомпрометированы данные миллионов пользователей;
● GotoFail – уязвимость реализации TLS (SSL) для OSX и iOS:–лишний оператор goto блокировал проверку подлинности сертификатов;
–злоумышленик получил возможность перехватывать трафик (maninthemiddle) и/или организовывать фишинг через TLS-соединения (отображаемые как доверенные);
● Stagefright – уязвимость Android:–мультимедийная библиотека, написанная на С++ (нет sandbox-защиты, как у java-приложений);
–используется во всех версиях Android (2.2-5.1), для большинства версий нет исправления безопасности (security update) и в октябре 2015;
–работает как привилегированный и автоматически перезапускаемый системный процесс;
–автоматическая обработка полученного видео, изображений, MMS, до отправки уведомления пользователю;
–использование целочисленного переполнения, ведущего к разрушению структуры динамической памяти и последующему захвату управления.
ИТ-безопасность: не существует “гарантированно защищенных” решений (“серебряной пули”)
Если система включена и работает, возможно только лишь состояние с закрытыми уязвимостями ПО,
известными на текущий момент
Безопасность – процесс, а не состоние системы