среда, 14 марта 2012 г.

MS12-020 или червивый RDP

Вчера Microsoft выпустила очередную порцию патчей и среди них мое внимание особенно привлек MS12-020, который имеет критический статус. Уязвимость позволяет выполнить произвольный код на удаленной системе при мощи специально сформированного RDP пакета. Данной уязвимости подвержены все версии MS Windows в том числе и 64-битные версии. На самом деле в рамках патча MS12-020 было закрыто две уязвимости CVE-2012-0002 (RCE в RDP) и CVE-2012-0152 (DoS в Terminal Server). Меня больше интересует первая уязвимость, так как она гораздо более опасная и может повлечь за собой появление сетевых червей, которые будут ее активно эксплуатировать (на данный момент о случаях ее использования во вредоносных программах мне не известно).

Кстати относительно недавно уже закрывалась уязвимость MS11-065 (август 2011), которая позволяла осуществлять DoS (WinXP/2003) и была замечена в том же драйвере rdpwd.sys, в котором была найдена CVE-2012-0002. Эти изменения можно отследить по временным меткам в   rdpwd.sys до и после патча. А также в официальных списках изменений для MS11-065 и для MS12-020.


Собственно основные изменения были замечены в функции HandleAttachUserReq(), декомпилированный вариант которой выглядит следующим образом:

 

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


Видно, что добавлена дополнительная проверка и освобождение памяти при помощи ExFreePoolWithTag():


Давайте теперь посмотрим на декомпилированный вариант этих изменений:



Именно отсутствие этой проверки может за собой повлечь возможность удаленного захвата памяти и возможность несанкционированного выполнения кода. Причем выполнения кода происходит в ядре.

Описание баги от автора (Luigi Auriemma)
Неплохой анализ CVE-2012-0152 (DoS в Terminal Server) можно найти здесь.
Еще один анализ CVE-2012-0002 здесь
DoS эксплойт для CVE-2012-0002 брать в metasploit