Презентация с форума http://hackit-ukraine.com/
Роман Олейников
ХНУ им. В.Н.Каразина.
Переполнение буфера и другие уязвимости ПО
Теория и практика защиты.О спикере: Проф. каф. безопасности информационных систем и технологий. Начальник отдела научных исследований АО "Институт информационных технологий", г.Харьков (основная должность); приглашенный профессор в университете г.Берген (Норвегия); приглашенный профессор в Samsung Advanced Technology Training Institute (Ю.Корея);профессор кафедры безопасности информационных технологий Харьковского национального университета радиоэлектроники;
Владимир Махитко - Automotive security. New challenges
Переполнение буфера и другие уязвимости ПО - Роман Олейников
1. ПЕРЕПОЛНЕНИЕ БУФЕРА И
ДРУГИЕ УЯЗВИМОСТИ
ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ:
ТЕОРИЯ И ПРАКТИКА ЗАЩИТЫ
Роман Олейников
roliynykov@gmail.com
http://www.slideshare.net/oliynykov
2. План доклада
● краткое представление
● уязвимости ПО: универсальный вектор реализации
атаки
● базовые типы уязвимостей программного обеспечения
(системный уровень)
● переполнение буфера: пример атаки
● методы защиты и способы их обхода
● примеры широко распространенных критичных
уязвимостей, их особенности и последствия
использования
3. Коротко о докладчике
● доктор технических наук (симметричная криптография)
● начальник отдела научных исследований
АО "Институт информационных технологий" (Харьков)
● профессор кафедры безопасности информационных
систем и технологий (ХНУ им. В.Н.Каразина) и кафедры
безопасности информационных технологий (ХНУРЭ)
● 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 (блочный
шифр “Калина” и функция хэширования “Купина”)
5. Соотношение количества уязвимых Android-
устройств (опубликованные уязвимости)
Источник: D.R.Thomas, A.R. Beresford. Security Metrics for the Android Ecosystem.
University of Cambridge, United Kingdom
Актуальное состояние (октябрь 2015): подавляющее большинство устройств
имеет незакрытую уязвимость Stagefright.
6. Результаты конкурса 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
8. Базовые типы уязвимостей программного
обеспечения (системный уровень)
● переполнение буфера (buffer overflow) - прямой захват потока
исполнения, возможен через:
– стек;
– динамическую память (heap);
– сегмент данных;
● некорректные форматные строки (uncontrolled format string):
– чтение локальных переменных (стек);
– чтение любого блока данных в адресном пространстве процесса;
– модификация значения в адресном пространстве процесса;
● целочисленные переполнения (integer oveflows):
– выход за пределы допустимого диапазона значений
(предварительный этап захвата потока исполнения);
– некорректные значения выходных данных модуля;
– неверное ветвление при исполнении и пр.
● etc.
12. Что будет, если копируемая строка
окажется длиннее приемного буфера?
strcpy( &dst, &src ) ,
в отличие от
strncpy( &dst, &src, sizeof
(dst) ) ,
учитывает только длину
копируемой строки
(перезапись идет до
нахождения завершающего
нулевого символа), без учета
размера приемного буфера
13. Стек потока (thread) при атаке: переполнение
специально сформированным блоком (shellcode)
14. Практическая демонстрация
● netcalcd – уязвимый сетевой демон
(сервис) для Linux (x86), разработанный
для демонстрации переполнения буфера
–прием и обработка текстовых запросов по
сети
–печать отладочной информации в консоль
● утилита для атаки (exploit)
–соединение с удаленным сервером
–отправка блока с кодом для переполнения
буфера (exploitation)
20. Утилита для реализации атаки
● клиентское приложение под Windows
● открытие сетевого соединения с уязвимым
сервером и отправить блок данных,
вызывающий переполнение буфера
● блок данных, вызывающий переполнение,
содержить исполнимый код,
выполняющийся на атакованном
компьютере (и запускающий
дополнительный web-сервер)
21. Утилита для реализации атаки: клиентское
приложение под Windows
открытие сетевого соединения
23. Базовые рекомендации для защиты от
переполнения буфера
● основная: писать безопасный код, делать вызовы
только защищенных функций с верификацией всех
входных данных; проводить независимый аудит кода;
● применение ASLR (Address Space Layout
Randomization) в операционной системе;
● обязательное использование бита NX (XD) для
процессоров х86/х86_64 (уровень операционной
системы);
● применение компилятором canary words;
● запуск процессов/потоков с наименьшими
привилегиями, необходимыми для нормальной работы.
25. Методы обхода ASLR
●
прямой подбор верного адреса (старшие биты не
меняются; слово выровнено по определенной
границе; вероятность успеха рассчитываем на
основе парадокса дней рождения);
–метод эффективно работает и для обхода canary words
●
возврат в код, находящийся в
нерандомизированной памяти;
●
jmp *esp
●
etc.
Источник (часть): Tio Muller, ASLR Smack & Laugh Reference
26. Бит NX: обход через returntolibc
● нет исполнения кода в стеке
(и исключения процессора)
● адрес возврата
перезаписывается и
указывает на существующий
код
● атакующий выбирает
нужную функцию и
аргументы для нее
● в Windows возможно
сделать цепочку вызовов
(для _stdcall_ вызываемая
функция очищает стек)
27. Защита компилятора: canary words
NB: вероятность успеха обхода метода защиты на 32-битовой платформе
примерно равна ½ для 216
попыток (математика: парадокс дней рождения)
28. Примеры широко распространенных
критичных уязвимостей
●
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, до отправки
уведомления пользователю;
–использование целочисленного переполнения, ведущего к разрушению структуры
динамической памяти и последующему захвату управления.
29. ИТ-безопасность: не существует “гарантированно
защищенных” решений (“серебряной пули”)
Если система включена и работает, возможно только
лишь состояние с закрытыми уязвимостями ПО,
известными на текущий момент
Безопасность – процесс, а не состоние системы