Технологии защиты ОС от эксплуатации уязвимостей
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Дисциплина:
«Операционные системы»
Преподаватель:
Алексеев Кирилл Анатольевич
учебный год 2020/2021
online.mirea.ru
Тема 1
Безопасность ОС
Занятие 1.7
лекция
Технологии защиты операционных систем
от эксплуатации уязвимостей
online.mirea.ru
Технологии защиты ОС от эксплуатации уязвимостей
Учебные вопросы:
1) Защита от исполнения кода в сегментах данных.
2) Рандомизация адресного пространства сегментов
программы при их загрузке в память.
3) Технологии контроля целостности потока выполнения
программы.
Литература
Основная:
1) Назаров С. В., Гудыно Л. П., Кириченко А. А. Операционные системы. Практикум.
2) Олифер В.Г., Олифер Н.А. Сетевые операционные системы.
3) Таненбаум Э. Современные операционные системы.
Дополнительная:
1) Староверова Н. А. Операционные системы.
2) Стащук П. В. Краткое введение в операционные системы.
online.mirea.ru
Технологии защиты ОС от эксплуатации уязвимостей
Пример уязвимой программы
Стек процесса
Адреса
Стековый кадр
функции main
адрес возврата
RBP
int val
(локальные
переменные)
адрес возврата
char buf[10]
локальные
переменные
int val
Стековый кадр
функции func
rbp
В функции func отсутствует проверка выхода за границы массива buf при копировании строки из
пользовательского ввода. Это приводит к возможности эксплуатации уязвимости типа
online.mirea.ru
переполнение буфера на стеке.
Технологии защиты ОС от эксплуатации уязвимостей
Переполнение буфера (англ. Buffer Overflow) — явление, возникающее, когда компьютерная
программа записывает данные за пределами выделенного в памяти буфера.
Переполнение буфера обычно возникает из-за неправильной работы с данными, полученными
извне, и памятью, при отсутствии жесткой защиты со стороны подсистемы программирования
(компилятор или интерпретатор) и операционной системы. В результате переполнения могут
быть испорчены данные, расположенные следом за буфером (или перед ним).
Переполнение буфера является одним из наиболее популярных способов взлома компьютерных
систем, так как большинство языков высокого уровня использует технологию стекового кадра —
размещение данных в стеке процесса, смешивая данные программы с управляющими данными
(в том числе адреса начала стекового кадра и адреса возврата из исполняемой функции).
Переполнение буфера может вызывать аварийное завершение или зависание программы,
ведущее к отказу обслуживания (denial of service, DoS). Отдельные виды переполнений, например
переполнение в стековом кадре, позволяют злоумышленнику загрузить и выполнить
произвольный машинный код от имени программы и с правами учетной записи, от которой она
выполняется.
Технологии защиты ОС от эксплуатации уязвимостей:
•
•
•
Защита от исполнения кода в сегментах данных (управление атрибутами доступа к сегментам
памяти процесса)
Рандомизация адресного пространства сегментов программы при их загрузке в память
online.mirea.ru
Технологии контроля целостности потока выполнения программы
1. Защита от исполнения кода в сегментах данных
Защита от исполнения кода в сегментах данных
(управление атрибутами доступа к сегментам памяти процесса)
Программное ограничение доступа на исполнение:
• программная эмуляция запрета исполнения.
Аппаратный запрет доступа на исполнение с использованием
NX-бита/XD-бита:
• PaX;
• RedHat ExecShield;
• Data Execution Protection (DEP).
Использование различных атрибутов доступа для сегментов данных
и кода:
• PaX;
• OpenBSD W^X.
Запрет на исполнение памяти пользователя с привилегиями ядра
• PaX KERNEXEC/UDEREF/kGuard;
• SMEP/SMAP;
• PXN.
online.mirea.ru
2. Рандомизация адресного пространства процесса
Рандомизация адресного пространства процесса
Технология ASLR была предложена в ответ на появление атак, использующих
возврат в системную библиотеку (return-into-libc), позволяющих обойти
запрет на исполнение в стеке путем перезаписи адреса возврата таким
образом, чтобы он указывал на нужные функции системной библиотеки.
online.mirea.ru
2. Рандомизация адресного пространства процесса
Атака типа возврат в библиотеку (return-into-libc)
Стек уязвимой программы
Библиотека libc
Другая динамическая библиотека
Стек процесса
адрес возврата
адрес гаджета n
RBP
int val
(локальные
переменные)
Адреса
Адреса
8
Стек процесса
7
...
адрес гаджета i
5
val
адресint
гаджета
1
(локальные
адрес
гаджета 2
переменные)
Гаджет i
6
1
XOR EAX,EBX
RET
Гаджет 1
ADD EBX, EDX
RET
Гаджет 2
DIV EDX, 0x02
ADD EDX, 0x01
CALL [EBX]
RET
Гаджет n
2
адрес возврата
адрес гаджета 1
rbp
rbp
int val
int val
char buf[10]
char buf[10]
3
4
online.mirea.ru
2. Рандомизация адресного пространства процесса
ASLR (англ. address space layout randomization — «рандомизация размещения
адресного пространства») — технология, применяемая в операционных системах, при
использовании которой случайным образом изменяется расположение в адресном
пространстве процесса важных структур данных, а именно образов исполняемого
файла, подгружаемых библиотек, кучи и стека.
Технология ASLR создана для усложнения эксплуатации нескольких типов
уязвимостей. Например, если при помощи переполнения буфера или другим
методом атакующий получит возможность передать управление по произвольному
адресу, ему нужно будет угадать, по какому именно адресу расположен стек, куча или
другие структуры данных, в которые можно поместить шелл-код. Сходные проблемы
возникнут и при атаке типа «возврат в библиотеку» (return-to-libc): атакующему не
будет известен адрес, по которому загружена библиотека. В приведённых примерах
от атакующего скрыты конкретные адреса, и, если не удастся угадать правильный
адрес, приложение скорее всего аварийно завершится, тем самым лишив атакующего
возможности повторной атаки и привлекая внимание системного администратора.
online.mirea.ru
2. Рандомизация адресного пространства процесса
Типы реализаций рандомизации адресного пространства
Название
Разработчик
Год
Области, подвергающиеся рандомизации
Направление защиты
Dynamically linked code (shared PaX Team
objects) randomization / (mmap
base randomization)
2001
Динамически
компонуемые Усложнение атак типа return-intoразделяемые библиотеки
libc
Kernel stack randomization
2002
Стек ядра ОС
Heap (brk) randomization of
processes
2003
Stack-based randomization
2011
Position-independent executable
(PIE) randomization
2011
Open BSD Stack-Gap, mmap base Сообщество
randomization
OpenBSD
20032004
Динамическая
память
данных Усложнение
абсолютной
процесса, выделяемая с помощью адресации элементов кучи
системного вызова brk
Сегмент(ы) стека
Усложнение
абсолютной
адресации элементов в стеке
Сегмент
текста,
на
уровне Усложнение атак типа return-intoисполняемого
файла
–
секции, plt и атак с использованием
объединяемые при загрузке в память в возвратно-ориентированного
текстовый сегмент: .text, .plt, .init, .fini и программирования
т.п.
Сегмент(ы) стека за исключением стека Усложнение
абсолютной
ядра
ОС,
память,
выделяемая адресации элементов в стеке, атак
системным
вызовом
mmap типа return-into-libc
(разделяемые
библиотеки,
пользовательские страницы памяти)
Усложнение
эксплуатации
уязвимостей
ядра
ОС,
вызывающих
переполнение
буфера в стеке, усложнение атак
связанных с исполнением кода
пользователя с привилегиями
ядра ОС (ret2usr)
online.mirea.ru
2. Рандомизация адресного пространства процесса
Полностью рандомизирующей ASLR является та, которая рандомизирует
положение системных библиотек, стека, кучи и загружаемого образа
приложения, то есть та в которой есть PIE randomization.
На 32-разрядных системах с PIE randomization для рандомизации секций .plt,
.text, .секций startup-кода нужно компилировать программу как позиционнонезависимую.
Для этого нужно добавлять при сборке специальные опции компиляции, что
разработчиками ПО осуществляется далеко не всегда.
Большинство 32-разрядных программ из-за требований совместимости
компилируются позиционно-зависимыми, поэтому при их загрузке в память
рандомизируется все кроме сегмента текста. В 64 разрядных системах для 64
разрядных программ используется нативная независимость расположения
кода программы, поэтому там как правило, рандомизируется и стек, и куча, и
разделяемые библиотеки, и сама программа (сегмента текста).
online.mirea.ru
3. Технологии контроля целостности потока
выполнения программы.
5
Третье направление представляет собой встроенные в
компиляторы технологии проверки сохранения определенных
свойств программы. При включении определенных опций
компиляции при сборке программы современные компиляторы
инструментируют код программы таким образом, чтобы она при
выполнении сама отслеживала нарушение ряда предикатов
безопасности.
online.mirea.ru
3. Технологии контроля целостности потока
выполнения программы.
5
Компиляторные технологии проверки предикатов безопасности
StackGuard
StackShield
ProPolice
Virtual-Table Verification
Sanitizers (UBSan, ASAN, MSAN)
online.mirea.ru
3. Технологии контроля целостности потока
выполнения программы.
Стек процесса
Адреса
адрес возврата
RBP
(локальные
переменные)
адрес возврата
Стековый кадр
предыдущей функции
Принцип работы StackGuard заключается в
следующем: при входе в функцию в стек
после адреса возврата записывается
некоторое трудно угадываемое значение
(так
называемая
канарейка),
копия
которого хранится где-то в другом месте
программы. Инструментированный код
функции перед возвратом проверяет
значение в стеке проверяется на
соответствие
значению-копии,
при
обнаружении несоответствия делается
вывод о злоумышленной перезаписи стека.
5
canary
rbp
(локальные
переменные)
online.mirea.ru
Возвратно-ориентированное
программирование
online.mirea.ru