ASLR и уязвимости

Тема в разделе "WASM.NT.KERNEL", создана пользователем Dfg, 30 дек 2011.

  1. Dfg

    Dfg New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2011
    Сообщения:
    4
    Извиняюсь заранее, если задал вопрос не в той ветку.

    Хотелось бы разобраться с таким вопросом.

    Есть уязвимость, к примеру.
    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
    Но подробностей я не получил, поэтому надеюсь тут растолкуют, что к чему тут.
     
  2. lecay

    lecay New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2007
    Сообщения:
    8
    ASLR в данном случае не работает потому что уязвимость используется совместно со старыми версиями офиса, в которых ещё остались не ASLR либы.

    DEP без ASLR бесполезен (смотри ROP shellcodes), также как и ASLR без DEP бесполезен (смотри Heap Spraying).
     
  3. Dfg

    Dfg New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2011
    Сообщения:
    4
    А можно вот тут поподробнее.

    Вот нашел пример.
    http://blogs.msdn.com/b/security_ru/archive/2010/10/15/isv-adoption-of-mitigation-technologies.aspx

    Что значит, что для конкретной библиотеки ASLR отключен? Что ее адрес будет всегда одним и тем-же в памяти и не будет рандомизироваться? В конкретном процессе, или по всей памяти?
     
  4. lecay

    lecay New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2007
    Сообщения:
    8
    Библиотека без флажка ASLR будет в любом процессе всегда загружаться по статическому адресу Image Base (если он уже не занят конечно).
     
  5. Dfg

    Dfg New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2011
    Сообщения:
    4
    Да спасибо, я нашел пример такой библиотеки у себя в системе, адрес которой не меняется.

    Хотел задать еще такой вопрос. Существует ли разница в реализации aslr в linux и windows.

    Конкретнее. Вот windows.

    Запускаем notepad первый раз. Получаем.

    Код (Text):
    1. Process: notepad.exe Pid: 2224     
    2.  
    3. Name    Base    Image Base
    4. advapi32.dll    0x77610000  0x77610000
    5. apisetschema.dll    0x77D30000  0x0
    6. comctl32.dll    0x74AC0000  0x74AC0000
    7. comdlg32.dll    0x76400000  0x76400000
    8. cryptbase.dll   0x75BC0000  0x75BC0000
    9. gdi32.dll   0x775C0000  0x775C0000
    10. imagehlp.dll    0x77590000  0x77590000
    11. imm32.dll   0x76520000  0x76520000
    12. kernel32.dll    0x77740000  0x77740000
    13. KernelBase.dll  0x75DB0000  0x75DB0000
    14. locale.nls  0x60000 0x0
    15. lpk.dll 0x77D10000  0x77D10000
    16. msctf.dll   0x77820000  0x77820000
    17. msvcrt.dll  0x772F0000  0x772F0000
    18. notepad.exe 0xE80000    0xE80000
    19. notepad.exe.mui 0xD0000 0x0
    20. ntdll.dll   0x77AF0000  0x77AF0000
    21. ole32.dll   0x75FF0000  0x75FF0000
    22. oleaut32.dll    0x776B0000  0x776B0000
    23. pshook.dll  0x70240000  0x70240000
    24. rpcrt4.dll  0x75F40000  0x75F40000
    25. sechost.dll 0x763D0000  0x763D0000
    26. shell32.dll 0x765A0000  0x765A0000
    27. shlwapi.dll 0x76540000  0x76540000
    28. SortDefault.nls 0x570000    0x0
    29. user32.dll  0x76160000  0x76160000
    30. usp10.dll   0x76480000  0x76480000
    31. uxtheme.dll 0x74A40000  0x74A40000
    32. version.dll 0x75140000  0x75140000
    33. winspool.drv    0x714F0000  0x714F0000
    Запускаем второй раз.
    Код (Text):
    1. Process: notepad.exe Pid: 612      
    2.  
    3. Name    Base    Image Base
    4. advapi32.dll    0x77610000  0x77610000
    5. apisetschema.dll    0x77D30000  0x0
    6. comctl32.dll    0x74AC0000  0x74AC0000
    7. comdlg32.dll    0x76400000  0x76400000
    8. cryptbase.dll   0x75BC0000  0x75BC0000
    9. gdi32.dll   0x775C0000  0x775C0000
    10. imagehlp.dll    0x77590000  0x77590000
    11. imm32.dll   0x76520000  0x76520000
    12. kernel32.dll    0x77740000  0x77740000
    13. KernelBase.dll  0x75DB0000  0x75DB0000
    14. locale.nls  0x60000 0x0
    15. lpk.dll 0x77D10000  0x77D10000
    16. msctf.dll   0x77820000  0x77820000
    17. msvcrt.dll  0x772F0000  0x772F0000
    18. notepad.exe 0xBA0000    0xBA0000
    19. notepad.exe.mui 0x1A0000    0x0
    20. ntdll.dll   0x77AF0000  0x77AF0000
    21. ole32.dll   0x75FF0000  0x75FF0000
    22. oleaut32.dll    0x776B0000  0x776B0000
    23. pshook.dll  0x70240000  0x70240000
    24. rpcrt4.dll  0x75F40000  0x75F40000
    25. sechost.dll 0x763D0000  0x763D0000
    26. shell32.dll 0x765A0000  0x765A0000
    27. shlwapi.dll 0x76540000  0x76540000
    28. SortDefault.nls 0x5C0000    0x0
    29. user32.dll  0x76160000  0x76160000
    30. usp10.dll   0x76480000  0x76480000
    31. uxtheme.dll 0x74A40000  0x74A40000
    32. version.dll 0x75140000  0x75140000
    33. winspool.drv    0x714F0000  0x714F0000
    Как видим адреса в памяти не меняются. Ребутим.

    После ребута Адреса наконец поменялись. aslr перемешала.

    Код (Text):
    1. Process: notepad.exe Pid: 1788     
    2.  
    3. Name    Base    Image Base
    4. advapi32.dll    0x764D0000  0x764D0000
    5. apisetschema.dll    0x77DE0000  0x0
    6. comctl32.dll    0x74B70000  0x74B70000
    7. comdlg32.dll    0x760F0000  0x760F0000
    8. cryptbase.dll   0x75C70000  0x75C70000
    9. gdi32.dll   0x76660000  0x76660000
    10. imagehlp.dll    0x76170000  0x76170000
    11. imm32.dll   0x76000000  0x76000000
    12. kernel32.dll    0x77710000  0x77710000
    13. KernelBase.dll  0x75F70000  0x75F70000
    14. locale.nls  0x60000 0x0
    15. lpk.dll 0x76030000  0x76030000
    16. msctf.dll   0x76590000  0x76590000
    17. msvcrt.dll  0x76040000  0x76040000
    18. notepad.exe 0x7B0000    0x7B0000
    19. notepad.exe.mui 0x1A0000    0x0
    20. ntdll.dll   0x77BA0000  0x77BA0000
    21. ole32.dll   0x778F0000  0x778F0000
    22. oleaut32.dll    0x77D40000  0x77D40000
    23. pshook.dll  0x70310000  0x70310000
    24. rpcrt4.dll  0x77AF0000  0x77AF0000
    25. sechost.dll 0x76570000  0x76570000
    26. shell32.dll 0x76A30000  0x76A30000
    27. shlwapi.dll 0x76270000  0x76270000
    28. SortDefault.nls 0x15C0000   0x0
    29. user32.dll  0x761A0000  0x761A0000
    30. usp10.dll   0x77A50000  0x77A50000
    31. uxtheme.dll 0x74AF0000  0x74AF0000
    32. version.dll 0x751F0000  0x751F0000
    33. winspool.drv    0x715A0000  0x715A0000
    А теперь смотрим в linux. И видим что адреса мешает не только при ребуте , но и просто при запуске процессов.

    Код (Text):
    1. [home@dfg ~]$ ldd /bin/nano
    2.     linux-gate.so.1 =>  (0xb78ca000)
    3.     libncursesw.so.5 => /lib/libncursesw.so.5 (0xb7871000)
    4.     libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb772b000)
    5.     libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7726000)
    6.     /lib/ld-linux.so.2 (0xb78cb000)
    7. [home@dfg ~]$ ldd /bin/nano
    8.     linux-gate.so.1 =>  (0xb76ee000)
    9.     libncursesw.so.5 => /lib/libncursesw.so.5 (0xb7695000)
    10.     libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb754f000)
    11.     libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb754a000)
    12.     /lib/ld-linux.so.2 (0xb76ef000)
    13. [home@dfg ~]$ ldd /bin/nano
    14.     linux-gate.so.1 =>  (0xb7790000)
    15.     libncursesw.so.5 => /lib/libncursesw.so.5 (0xb7737000)
    16.     libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb75f1000)
    17.     libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb75ec000)
    18.     /lib/ld-linux.so.2 (0xb7791000)
    Почему так? Реализация aslr на linux более сильная?
     
  6. Dfg

    Dfg New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2011
    Сообщения:
    4
    В догонку.
    Что-то не удалось проверить, то что виновата старая либа от оффиса.
    Уязвимоти подверженны все графические приложения, поэтому.

    Зашел эксплорером сюда.
    http://www.microsoft.com/typography/web/embedding/demos/1/demo1.htm

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

    t2embed.dll 0x6ED60000

    Ребут.

    t2embed.dll 0x70850000

    Адрес сменился. Либа с ASLR получается? (И вобще все либы, которые подгружает IE поменяли адрес после ребута.)
    Смотрел Process explorer-ом.
     
  7. lecay

    lecay New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2007
    Сообщения:
    8
    Причина в совместимости, много windows приложений ожидают что адреса модулей будут одинаковыми в разных процессах.

    Неважно стоит ли в уязвимой либе флажок ASLR, для обхода достаточно любой другой либы без флажка. В офисе такие либы были на момент появления Duqu.
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    lecay
    Это неправда. Dll могут помещаться по разным адресам в разных процессах, и это не повлияет на работоспособность приложений. Другое дело, что это нежелательно, т.к. помещение dll по различным адресам означает, что будут применены релоки, т.е. кодовые секции dll будут модифицированы. Windows же старается располагать dll во всех процессах по одинаковым адресам, чтобы не дублировать кодовые секции во всех процессах. Поэтому рандомизация действует в лучшем случае в пределах жизни секции, а в худшем в пределах одной перезагрузки. При перезагрузке генерируется случайное число, используемое в течение текущей сессии для выбора баз.

    Dfg
    Может быть. Но насколько мне известно, в linux не реализована ядерная ASLR. А в Windows ядро так же получает случайную базу после перезагрузки.