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, і швидко виправляти помилки безпеки пам’яті.





