Как ASLR может быть эффективным? - PullRequest
6 голосов
/ 04 октября 2010

Я слышал теорию. Рандомизация местоположения адресного пространства берет библиотеки и загружает их в случайных местах в виртуальном адресном пространстве, так что в случае, если хакер обнаружит дыру в вашей программе, у него не будет заранее известного адреса для выполнения атаки return-to-libc против, например. Но, подумав об этом несколько секунд, это не имеет смысла в качестве защитной меры.

Предположим, что наш гипотетический TargetLib (libc или что-то еще, что ищет хакер) загружается по случайному адресу вместо детерминированного. Теперь хакер не знает заранее, где находится TargetLib и подпрограммы внутри него, но не знает и код приложения. Он должен иметь какую-то таблицу поиска где-то в двоичном файле, чтобы найти подпрограммы внутри TargetLib, и это должно быть в детерминированном месте. (Или в произвольном месте, на которое указывает что-то другое. Вы можете добавить столько косвенных указаний, сколько захотите, но в конечном итоге вам придется начинать с известного места.)

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

Есть ли что-то в том, как работает ASLR, что я не понимаю? Потому что, как описано, я не вижу, что это нечто большее, чем просто удар скорости, обеспечивающий представление о безопасности, но не являющийся реальной субстанцией. Я что-то упустил?

Ответы [ 2 ]

2 голосов
/ 04 октября 2010

Я считаю, что это эффективно, потому что это изменяет базовый адрес разделяемой библиотеки.Вспомните, что импортированные функции из общей библиотеки вставляются в ваш исполняемый образ при его загрузке, и поэтому нет таблицы как таковой, только конкретные адреса, указывающие на данные и код, разбросанный по всему коду программы.

Это повышаетпланка для эффективной атаки, потому что она делает простое переполнение буфера (где адрес возврата в стеке может быть установлен) в тот, где переполнение должно содержать код для определения правильного местоположения и затем jmp к нему.Предположительно, это только усложняет ситуацию.

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

1 голос
/ 23 июля 2014

Я не знаю, правильно ли вам задать вопрос, но я объясню, когда ASLR эффективен, а когда нет.

Допустим, у нас есть app.exe и TargetLib.dll. app.exe использует (связанный с) TargetLib.dll. Чтобы упростить объяснение, давайте предположим, что виртуальное адресное пространство имеет только эти 2 модуля.

Если оба включены ALSR, базовый адрес app.exe неизвестен. Он может разрешать некоторые адреса вызовов функций при загрузке, но злоумышленник не знает, где находится функция и где находятся разрешенные переменные. То же самое происходит при загрузке TargetLib.dll. Несмотря на то, что app.exe имеет таблицу поиска, злоумышленник не знает, где находится таблица.

Поскольку злоумышленник не может определить содержание определенного адреса, он должен атаковать приложение, не используя никакой информации о фиксированном адресе. Обычно сложнее, если он использует обычный метод атаки, такой как переполнение стека, переполнение кучи, использование после освобождения ...

С другой стороны, если app.exe НЕ поддерживает ASLR, злоумышленнику будет проще использовать приложение. Потому что может быть вызов функции интересующего API по определенному адресу в app.exe, и злоумышленник может использовать этот адрес в качестве целевого адреса для перехода. (Атака приложения обычно начинается с перехода на произвольный адрес.).

Supplementation: Возможно, вы уже понимаете это, но я хочу прояснить одну вещь. Когда злоумышленник использует приложение с помощью уязвимости, такой как повреждение памяти, он обычно вынужден использовать fixed address jump instruction. Они не могут использовать relative address jump инструкцию для использования. Это причина, почему ALSR действительно эффективен для таких эксплойтов.

...