3.1 KiB
Relro
Relro
RELRO означає Relocation Read-Only і це функція безпеки, яка використовується в двійкових файлах для зменшення ризиків, пов'язаних з перезаписами GOT (Global Offset Table). Розглянемо концепцію у двох відмінних типах для ясності: Partial RELRO та Full RELRO.
Partial RELRO
Partial RELRO використовує простіший підхід для підвищення безпеки без значного впливу на продуктивність двійкового файлу. Розмістивши GOT вище змінних програми в пам'яті, Partial RELRO спрямований на запобігання переповнення буфера до досягнення та порушення GOT.
Це не заважає використанню GOT з довільним записом уразливостей.
Full RELRO
Full RELRO підвищує захист, роблячи GOT та розділ .fini_array повністю тільки для читання. Як тільки двійковий файл стартує, всі адреси функцій вирішуються та завантажуються в GOT, після чого GOT позначається як тільки для читання, ефективно запобігаючи будь-яким змінам під час виконання.
Проте, компроміс з Full RELRO полягає в продуктивності та часі запуску. Оскільки потрібно вирішити всі динамічні символи при запуску перед позначенням GOT як тільки для читання, двійкові файли з увімкненим Full RELRO можуть мати довші часи завантаження. Цей додатковий час запуску - причина, чому Full RELRO не увімкнено за замовчуванням у всіх двійкових файлах.
Можна перевірити, чи увімкнено Full RELRO у двійковому файлі за допомогою:
readelf -l /proc/ID_PROC/exe | grep BIND_NOW
Обхід
Якщо ввімкнено повний RELRO, єдиний спосіб обійти його - знайти інший спосіб, який не потребує запису в таблицю GOT для отримання довільного виконання.
Зверніть увагу, що GOT бібліотеки LIBC зазвичай має частковий RELRO, тому його можна змінити за допомогою довільного запису. Додаткова інформація в Targetting libc GOT entries.