Извиняюсь заранее, если задал вопрос не в той ветку. Хотелось бы разобраться с таким вопросом. Есть уязвимость, к примеру. http://technet.microsoft.com/ru-ru/security/bulletin/MS11-087 Данную уязвимость использовал в свое время вирь Duqu. Так вот, по описанию, используется переполнение буфера и при этом код сплоита выполняется на абсолютно всех платформах. (2008, 7 - 32/64) 1. Прежде всего меня интересует вопрос почему не работает ASLR в данном случае? Я не специалист в тонкостях ядра, но по классическим примерам. Мы выполнили переполнение буфера, начали выполнять нужный нам код. Код должен вызвать функцию, например для закачки трояна. В классических примерах для прикладных программ, функцию вызывают например из user32.dll, но в семерке адрес этой либы раномизируется, обратится нельзя. Что же вызывается с постоянным адресом в данном случае, при выполнении кода на уровне ядра? Или я не правильно что-то понимаю, при эксплуатации такого рода уязвимостей? 2. И во вторую очередь, интересует, почему так же обходится DEP и NX, даже на 64 битах. ps. Вот тут мне написали, что в ядре и ядерной памяти ни ASLR ни DEP работают. http://www.anti-malware.ru/forum/index.php?showtopic=20054&view=findpost&p=147946 Но подробностей я не получил, поэтому надеюсь тут растолкуют, что к чему тут.
ASLR в данном случае не работает потому что уязвимость используется совместно со старыми версиями офиса, в которых ещё остались не ASLR либы. DEP без ASLR бесполезен (смотри ROP shellcodes), также как и ASLR без DEP бесполезен (смотри Heap Spraying).
А можно вот тут поподробнее. Вот нашел пример. http://blogs.msdn.com/b/security_ru/archive/2010/10/15/isv-adoption-of-mitigation-technologies.aspx Что значит, что для конкретной библиотеки ASLR отключен? Что ее адрес будет всегда одним и тем-же в памяти и не будет рандомизироваться? В конкретном процессе, или по всей памяти?
Библиотека без флажка ASLR будет в любом процессе всегда загружаться по статическому адресу Image Base (если он уже не занят конечно).
Да спасибо, я нашел пример такой библиотеки у себя в системе, адрес которой не меняется. Хотел задать еще такой вопрос. Существует ли разница в реализации aslr в linux и windows. Конкретнее. Вот windows. Запускаем notepad первый раз. Получаем. Code (Text): Process: notepad.exe Pid: 2224 Name Base Image Base advapi32.dll 0x77610000 0x77610000 apisetschema.dll 0x77D30000 0x0 comctl32.dll 0x74AC0000 0x74AC0000 comdlg32.dll 0x76400000 0x76400000 cryptbase.dll 0x75BC0000 0x75BC0000 gdi32.dll 0x775C0000 0x775C0000 imagehlp.dll 0x77590000 0x77590000 imm32.dll 0x76520000 0x76520000 kernel32.dll 0x77740000 0x77740000 KernelBase.dll 0x75DB0000 0x75DB0000 locale.nls 0x60000 0x0 lpk.dll 0x77D10000 0x77D10000 msctf.dll 0x77820000 0x77820000 msvcrt.dll 0x772F0000 0x772F0000 notepad.exe 0xE80000 0xE80000 notepad.exe.mui 0xD0000 0x0 ntdll.dll 0x77AF0000 0x77AF0000 ole32.dll 0x75FF0000 0x75FF0000 oleaut32.dll 0x776B0000 0x776B0000 pshook.dll 0x70240000 0x70240000 rpcrt4.dll 0x75F40000 0x75F40000 sechost.dll 0x763D0000 0x763D0000 shell32.dll 0x765A0000 0x765A0000 shlwapi.dll 0x76540000 0x76540000 SortDefault.nls 0x570000 0x0 user32.dll 0x76160000 0x76160000 usp10.dll 0x76480000 0x76480000 uxtheme.dll 0x74A40000 0x74A40000 version.dll 0x75140000 0x75140000 winspool.drv 0x714F0000 0x714F0000 Запускаем второй раз. Code (Text): Process: notepad.exe Pid: 612 Name Base Image Base advapi32.dll 0x77610000 0x77610000 apisetschema.dll 0x77D30000 0x0 comctl32.dll 0x74AC0000 0x74AC0000 comdlg32.dll 0x76400000 0x76400000 cryptbase.dll 0x75BC0000 0x75BC0000 gdi32.dll 0x775C0000 0x775C0000 imagehlp.dll 0x77590000 0x77590000 imm32.dll 0x76520000 0x76520000 kernel32.dll 0x77740000 0x77740000 KernelBase.dll 0x75DB0000 0x75DB0000 locale.nls 0x60000 0x0 lpk.dll 0x77D10000 0x77D10000 msctf.dll 0x77820000 0x77820000 msvcrt.dll 0x772F0000 0x772F0000 notepad.exe 0xBA0000 0xBA0000 notepad.exe.mui 0x1A0000 0x0 ntdll.dll 0x77AF0000 0x77AF0000 ole32.dll 0x75FF0000 0x75FF0000 oleaut32.dll 0x776B0000 0x776B0000 pshook.dll 0x70240000 0x70240000 rpcrt4.dll 0x75F40000 0x75F40000 sechost.dll 0x763D0000 0x763D0000 shell32.dll 0x765A0000 0x765A0000 shlwapi.dll 0x76540000 0x76540000 SortDefault.nls 0x5C0000 0x0 user32.dll 0x76160000 0x76160000 usp10.dll 0x76480000 0x76480000 uxtheme.dll 0x74A40000 0x74A40000 version.dll 0x75140000 0x75140000 winspool.drv 0x714F0000 0x714F0000 Как видим адреса в памяти не меняются. Ребутим. После ребута Адреса наконец поменялись. aslr перемешала. Code (Text): Process: notepad.exe Pid: 1788 Name Base Image Base advapi32.dll 0x764D0000 0x764D0000 apisetschema.dll 0x77DE0000 0x0 comctl32.dll 0x74B70000 0x74B70000 comdlg32.dll 0x760F0000 0x760F0000 cryptbase.dll 0x75C70000 0x75C70000 gdi32.dll 0x76660000 0x76660000 imagehlp.dll 0x76170000 0x76170000 imm32.dll 0x76000000 0x76000000 kernel32.dll 0x77710000 0x77710000 KernelBase.dll 0x75F70000 0x75F70000 locale.nls 0x60000 0x0 lpk.dll 0x76030000 0x76030000 msctf.dll 0x76590000 0x76590000 msvcrt.dll 0x76040000 0x76040000 notepad.exe 0x7B0000 0x7B0000 notepad.exe.mui 0x1A0000 0x0 ntdll.dll 0x77BA0000 0x77BA0000 ole32.dll 0x778F0000 0x778F0000 oleaut32.dll 0x77D40000 0x77D40000 pshook.dll 0x70310000 0x70310000 rpcrt4.dll 0x77AF0000 0x77AF0000 sechost.dll 0x76570000 0x76570000 shell32.dll 0x76A30000 0x76A30000 shlwapi.dll 0x76270000 0x76270000 SortDefault.nls 0x15C0000 0x0 user32.dll 0x761A0000 0x761A0000 usp10.dll 0x77A50000 0x77A50000 uxtheme.dll 0x74AF0000 0x74AF0000 version.dll 0x751F0000 0x751F0000 winspool.drv 0x715A0000 0x715A0000 А теперь смотрим в linux. И видим что адреса мешает не только при ребуте , но и просто при запуске процессов. Code (Text): [home@dfg ~]$ ldd /bin/nano linux-gate.so.1 => (0xb78ca000) libncursesw.so.5 => /lib/libncursesw.so.5 (0xb7871000) libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb772b000) libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7726000) /lib/ld-linux.so.2 (0xb78cb000) [home@dfg ~]$ ldd /bin/nano linux-gate.so.1 => (0xb76ee000) libncursesw.so.5 => /lib/libncursesw.so.5 (0xb7695000) libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb754f000) libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb754a000) /lib/ld-linux.so.2 (0xb76ef000) [home@dfg ~]$ ldd /bin/nano linux-gate.so.1 => (0xb7790000) libncursesw.so.5 => /lib/libncursesw.so.5 (0xb7737000) libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb75f1000) libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb75ec000) /lib/ld-linux.so.2 (0xb7791000) Почему так? Реализация aslr на linux более сильная?
В догонку. Что-то не удалось проверить, то что виновата старая либа от оффиса. Уязвимоти подверженны все графические приложения, поэтому. Зашел эксплорером сюда. http://www.microsoft.com/typography/web/embedding/demos/1/demo1.htm Эксплорер соответственно, для отображения, подгрузил либу из-за которой весь сыр бор. (судя по описнию дырки, запрет доступа к этой либе проблемму решает) t2embed.dll 0x6ED60000 Ребут. t2embed.dll 0x70850000 Адрес сменился. Либа с ASLR получается? (И вобще все либы, которые подгружает IE поменяли адрес после ребута.) Смотрел Process explorer-ом.
Причина в совместимости, много windows приложений ожидают что адреса модулей будут одинаковыми в разных процессах. Неважно стоит ли в уязвимой либе флажок ASLR, для обхода достаточно любой другой либы без флажка. В офисе такие либы были на момент появления Duqu.
lecay Это неправда. Dll могут помещаться по разным адресам в разных процессах, и это не повлияет на работоспособность приложений. Другое дело, что это нежелательно, т.к. помещение dll по различным адресам означает, что будут применены релоки, т.е. кодовые секции dll будут модифицированы. Windows же старается располагать dll во всех процессах по одинаковым адресам, чтобы не дублировать кодовые секции во всех процессах. Поэтому рандомизация действует в лучшем случае в пределах жизни секции, а в худшем в пределах одной перезагрузки. При перезагрузке генерируется случайное число, используемое в течение текущей сессии для выбора баз. Dfg Может быть. Но насколько мне известно, в linux не реализована ядерная ASLR. А в Windows ядро так же получает случайную базу после перезагрузки.