Личный блог Suvan`a.

Работая и играя с Linux... И что из этого иногда получается.

Рандомизация размещения адресного пространства.

Рубрика: Безопасность -> Укрепляем Linux
Метки: |
Пятница, 5 июня 2009 г.
Просмотров: 6321

Рандомизация адресного пространства применяется для усложнения про­цесса вычисления расположения в памяти стека и DLL. Вычислить адрес стека и DLL хакеру стало значительно сложнее, чем без рандомизации.

     Если хакер неправильно «угадает» адрес памяти, то приложение будет аварийно завершено - как и без рандомизации. Но когда хакер вторично запустит приложение, адресное пространство будет вторично изменено.


     Подобрать нужный адрес стало значительно сложнее. Если без ран­домизации нужно было действовать «медленно и уверенно» (рано или поз­дно хакер достиг бы своей цели), то теперь ему нужно полагаться лишь на свое везение. На данный момент популярна лишь одна возможность атаки: при системном вызове fork() размещение адресного пространства у каждого потомка такое же, как и предка.

     Каждый запущенный процесс отображается в файловой системе /рrос. Карта памяти процесса содержится в файле /proc/<PID>maps:

$ cat /proc/self/maps

08048000-0804c000 r-xp 00000000 03:02 556532 /bin/cat

0804c000-0804d000 rw-p 00003000 03:02 556532 /bin/cat

0804d000-0804e000 rwxp 00000000 00:00 0

40000000-40015000 r-xp 00000000 03:02 655683 /lib/ld-2.3.2.so

40015000-40016000 rw-p 00014000 03:02 655683 /lib/ld-2.3.2.so

40029000-40158000 r-xp 00000000 03:02 655661 /lib/libc-2.3.2.so

40158000-4015d000 rw-p 0012f000 03:02 655661 /lib/libc-2.3 . 2 . so

4015d000-40160000 rw-p 00000000 00:00 0

bfffe000-c0000000 rwxp fffffOOO 00:00 0

     Карта памяти отображает, что в памяти находится /bin/cat и две DDL - ld-2.3.2.so и libc-2.3.2.so. Если несколько раз просмотреть карту памяти этой же программы, то можно заметить, что адреса (два шестнадцатеричных разделенных дефисом числа) не изменяются. Во второй колонке отображаются права доступа к этому участку памяти (read - чтение, write - запись и execute - выполнение).

     Первая рандомизация, которую делает ASLR, заключается в базовом адресе, используемом функцией mmap(), не требует указания адреса. Это приводит к тому, что DLL загружаются не последовательно, а в случайном порядке. Такое действие защищает от самого неиспользуемого (но не ме­нее опасного) метода переполнения буфера, при котором хакер «переключает» процесс выполнения на код, содержащийся в библиотечной функции - так называемая атака возврата в libc ("return to libc" attack).

     Вторая рандомизация касается стека пользовательского процесса, при этом вершина стека сдвигается, уменьшая доступную процессу память. При ис­пользовании с методом SEGMEXEC такое действие ограничивает доступную процессу память до 1,25 Гб, но данного вполне хватает для большинства приложений. ASLR тоже поддерживает рандомизацию стека каждой задачи ядра, одна­ко такое действие может вызвать неожиданное переполнение стека (в результате приложение потерпит крушение), поэтому данная рандомизация не рекомен­дуется для общего использования.

     Кроме всего данного, ASLR исправляет некоторые новые уязвимости, которые были обнаруженны в ядре 2.6, в частности уязвимость, связанную с системным вызовом vsyscall(). PaX отключает данный системный вызов, заставляя ядро применять старые методы, используемые в ядре 2.4. Такой режим, хотя и более медленный, зато более безопасный.