ASLR (рандомизация адресного пространства) — механизм защиты от эксплойтов, который размещает код программы, библиотеки, стек и кучу по случайным адресам, чтобы атакующий не мог предсказать нужные адреса.
Как работает ASLR
Эксплойты для повреждения памяти традиционно опирались на фиксированные адреса: атакующему, который перезаписал адрес возврата через переполнение буфера, нужно было знать, где находится полезный код, например функция системной библиотеки. С ASLR операционная система при каждом запуске программы выбирает новый базовый адрес для исполняемого файла, разделяемых библиотек, стека и кучи (в Windows для системных DLL — при каждой загрузке ОС). Жёстко заданные адреса атакующего указывают в недопустимую область памяти, и процесс аварийно завершается, а не оказывается захвачен.
Проект PaX реализовал ASLR для Linux в 2001 году; в основное ядро Linux механизм попал в 2005 году, в Windows — с Vista в 2007 году, позднее — в iOS и Android. KASLR применяет ту же идею к ядру операционной системы.
Значение ASLR и его ограничения
Вместе с неисполняемой памятью (DEP/NX) и стековыми канарейками ASLR сделал надёжную эксплуатацию гораздо сложнее и дороже. Полной защитой он, однако, не является:
- утечки информации — вторая ошибка, раскрывающая хотя бы один указатель, позволяет вычислить реальную раскладку, поэтому современные цепочки эксплойтов сочетают утечку, например, с use-after-free;
- низкая энтропия — в 32-битных системах число возможных положений достаточно мало для перебора;
- нерандомизированные модули — одна библиотека, собранная без поддержки ASLR, даёт атакующему фиксированные адреса;
- аппаратные сторонние каналы — исследования неоднократно показывали, что кеши процессора и предсказатели ветвлений раскрывают смещения KASLR.
Рекомендации
- Собирать программы как позиционно-независимые исполняемые файлы (PIE) и держать ASLR включённым во всей системе.
- Использовать 64-битные сборки ради более высокой энтропии.
- Сочетать ASLR с другими механизмами, например Control Flow Guard, и быстро исправлять ошибки безопасности памяти.





