вторник, 6 марта 2012 г.

CVE-2011-3544: самый пробивной в Рунете

Про Java эксплойты вроде бы уже давно всем все понятно, но как показывает практика положение дел от этого не меняется. Казалось бы прошлогодняя уязвимость CVE-2011-3544 (Java/Exploit.CVE-2011-3544) и патч уже давно есть, но по количеству пробивов по-прежнему на первом месте. Сподвигло меня вернуться к этому вопросу, лишь тот факт, что по-прежнему есть огромное количество успешных атак использующих эти уязвимости. Несмотря на большой шум вокруг безопасности платформы Java в последнее время, она не становится от этого безопаснее. Вот пример статистики, позаимствованный из блога французского исследователя Xylitol, на которой изображены в процентном соотношении пробивы из BlackHole последней версии:




Отчетливо видно, что CVE-2011-3544 (Rhino), лидирует по количеству на фоне других уязвимостей и сейчас именно она дает большую часть успешных установок различного рода вредоносных программ в составе эксплойт-набора BlackHole.

Впервые стало известно публично об этой уязвимости из бюллетеня  ZDI-11-305, опубликованного в октябре прошлого года. Вообще стоимость Java-эксплойтов на “черном” рынке сейчас очень высока, да впрочем и ZDI их оценивает не меньше. Java/Exploit.CVE-2011-3544 работает на всех браузерах и под все версии MS Windows (и не только), причем из-за особенностей эксплуатации этой уязвимости эксплойт очень компактен (в среднем не превышает 10Kb) и отрабатывает крайне быстро. Кстати, именно эта уязвимость используется для распространения троянца OSX/Flashback для Mac OSX.

Природа этой уязвимости кроется в механизмах обработки ошибок Rhino Script Engine, который позволяет выполнять динамический JavaScript код на лету в среде JVM и взаимодействовать при этом с Java объектами и апплетами. Эксплуатация происходит в несколько этапов:

  • создается объект посредник, который через объект ScriptEngine во время выполнения на лету вызывает метод toString(), в рамках которого генерируется ошибка (обработка ошибок происходит с повышением привилегий) и передается на выполнение код для отключения Java SecurityManager (java.lang.System.setSecurityManager(null)), что в свою очередь в перспективе позволяет выполнить вредоносный апплет за пределами песочницы
  • отключить SecurityManager и выполнить вредоносный код, удается из-за того, что метод toString() в рамках обработки исключений не проверяется на соответствие политикам безопасности

Так выглядит JS-код эксплуатирующий CVE-2011-3544 (BlackHole):


А так выглядит часть вредоносного апплета, создающая объект ScriptEngine:


Еще одним важным и интересным моментом эксплуатации этой уязвимости является то, что вредоносный апплет сохраняется в так называемом Java cache и может быть обнаружен в нем уже после эксплуатации:

\Users\Admin\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\22\44d64396-156c1837
\Users\Admin\AppData\LocalLow\Sun\Java\Deployment\cache\6.0\40\2f3fd5e8-3316ca13 -->market.class



Так же в Java cache сохраняется полезная нагрузка в виде какого-нибудь дроппера, который уже следующим этапом заражает систему.