Обход Windows ASLR путем определения адреса библиотеки с помощью общих страниц

Я хорошо знаком с ASLR, но сегодня услышал новый интересный факт о реализации ASLR в Windows.

Чтобы оптимизировать производительность, если процессы A и B загружают одну и ту же DLL, Windows загрузит ее только один раз в физическую память, и оба процесса будут совместно использовать один и тот же экземпляр через общие страницы.

Это старые новости. Но самое интересное, что и процесс A, и процесс B будут загружать разделяемую библиотеку по одному и тому же виртуальному адресу (почему??).

Мне кажется, что любая локальная атака (например, повышение привилегий) может легко обойти ASLR следующим образом:

1. Create a new dummy process
2. Check the address of dlls of interest (kernel32, user32 ..)
3. Attack the privileged process and bypass ASLR with the information from step 2.

Я провел несколько простых тестов с помощью Olly и обнаружил, что общие библиотеки действительно загружаются по одному и тому же виртуальному адресу.

Если это действительно так, бесполезен ли ASLR для локальной эксплуатации?


person Michael    schedule 25.04.2015    source источник
comment
Если DLL будет загружена по другому адресу, ее необходимо переместить, и страницы ОЗУ больше не будут использоваться совместно. Основная особенность ASLR заключается в том, что место, где он загружается на вашем компьютере, отличается от места, где оно загружается на моем. И при перезагрузке тоже будет по другому.   -  person Hans Passant    schedule 25.04.2015
comment
Насколько я помню.. У каждого процесса есть таблица, которая переводит адреса Виртуальных страниц в Физические страницы. Каждый процесс имеет собственную уникальную таблицу. Не могла ли Microsoft загрузить DLL один раз в физическую память и для каждого процесса загрузить DLL в другой виртуальный адрес?   -  person Michael    schedule 25.04.2015
comment
Нет, переезд меняет код так, что одна копия становится недействительной.   -  person Hans Passant    schedule 25.04.2015


Ответы (1)


Вы правы, ASLR - слабая защита от локального злоумышленника. Он в первую очередь предназначен для предотвращения использования жестко закодированных адресов в удаленных эксплойтах.

Редактировать: некоторые детали в моем предыдущем ответе были неверны, хотя указанный выше пункт остается в силе. Базовый адрес DLL с поддержкой ASLR на самом деле является функцией обоих: (1) случайного смещения, выбранного Windows из набора 256 возможных значений во время загрузки; и (2) порядок загрузки DLL, который для известных DLL определяется менеджером сеансов во время запуска системы. Таким образом, знания только случайного смещения недостаточно для вычисления базового адреса произвольной библиотеки DLL ASLR. Однако, если вы можете напрямую наблюдать адрес целевой DLL в разделяемой памяти, как вы описываете, то в любом случае все ставки сняты.

Источники: http://www.symantec.com/avcenter/reference/Address_Space_Layout_Randomization.pdf Внутреннее устройство Windows, 6-е издание

person peterdn    schedule 25.04.2015
comment
Очень интересно .. Используется ли этот метод в дикой природе ? Я читал несколько тематических исследований о локальных эксплойтах и ​​никогда не видел, чтобы злоумышленник использовал эту технику. - person Michael; 25.04.2015
comment
@MichaelEngstler извиняется, я полагаю, что был совершенно неправ в этой детали. Я изменил свой ответ, чтобы отразить. - person peterdn; 25.04.2015