Одна из самых известных атак последних лет WannaCry стала возможной благодаря уязвимости EternalBlue. Тогда общий ущерб от атаки составил более 1 млрд. долларов и поразил от 200 тыс. до 300 тыс. компьютеров по меньшей мере в 150 странах мира.
Недавно обнаруженная уязвимость BlueKeep имеет нечто общее с EternalBlue: обе могут быть использованы для распространения компьютерных червей. А это значит, что достаточно всего лишь одного уязвимого компьютера, подключенного к интернету, чтобы вредоносное ПО распространилось по корпоративной сети.
В настоящее время уже около 1 млн. систем уязвимо для BlueKeep, а в сети уже появляются первые вредоносные экземпляры, использующие эту уязвимость, означает, что мы стоим на пороге еще более грандиозной атаки, превосходящей по своим размерам даже знаменитую WannaCry.
Краткий экскурс
14 мая Microsoft выпустила патч для исправления критической уязвимости CVE-2019-0708 более известной, как «BlueKeep» - уязвимость в службах удаленных рабочих столов RDS (на более ранних ОС – служба терминалов TS) в ОС Windows, которая позволяет злоумышленнику, не прошедшему проверку подлинности, осуществить удаленное выполнение произвольного кода на атакуемой системе.
Для эксплуатации этой уязвимости злоумышленнику достаточно отправить специально сформированный запрос службе удаленных рабочих столов целевых систем, используя RDP (сам протокол RDP при этом не является уязвимым). Важно отметить, что любое вредоносное ПО, использующее эту уязвимость, может перемещаться с одного уязвимого компьютера на другой аналогично шифровальщику WannaCry, который распространился по всему миру в 2017 году.
Проблема актуальна для Windows 7, Windows Server 2008 R2 и Windows Server 2008, а также Windows 2003 и Windows XP, последняя из которых не поддерживается.
Технический анализ CVE-2019-0708
CVE-2019-0708 - это уязвимость типа use-after-free драйвере termdd.sys, который используется в Microsoft RDP. Для лучшего понимания, рассмотрим схему начала связи RDP:
Сначала клиентом инициируется соединение X.224, которое используется для отправки запроса на подключение к серверу с последующим подтверждением этого подключения.
Последующие запросы «MCS Connect Initial and GCC Create» содержат информацию о создании виртуальных каналов, а также информацию, связанную с безопасностью и другие параметры, поддерживаемые клиентом RDP. Внутри есть 8-байтовое поле, оканчивающееся нулевым байтом с именем «channelName_N», которое используется для указания имени канала.
Так, если указан канал с именем «MS_T120\x00», функция termdd!IcaCreateChannel() вызовет функцию termdd!IcaFindChannelByName() и вернет структуру ChannelControl, на которую указывает структура MS_T120 в слоте, например, в 0x1F. Этот указатель также сохранится функцией termdd! IcaBindVirtualChannels(), и при получении запроса «MCS Channel Join Request» откроется канал «MS_T120».
Теперь, если злоумышленник отправит данные в канал MS_T120, termdd.sys попытается ответить на запрос, отправив сообщение об ошибке и закрыв канал с помощью termdd!IcaCloseChannel(), что вызовет termdd!_IcaFreeChannel(), который освободит структуру ChannelControl из структуры MS_T120 и удалит указатель в слоте пользователя в таблице ChannelPointerTable(0x1F).
Проблема в том, что указатель слота не удалится... Позже, когда соединение прервется, вызовется функция RDPWD!SignalBrokenConnection(), которая, в свою очередь, вызовет termdd!IcaChannelInputInternal() и попытается записать в управляющую структуру освобожденных каналов указатель слота (0x1F). Это приведет к состоянию use-after-free.
В результате злоумышленник, не прошедший проверку подлинности, может воспользоваться данной уязвимостью, установив RDP-соединение с целевым сервером на канале «MS_T120» и отправив на сервер специально созданные данные. Если эксплуатация пройдет успешно, то злоумышленник сможет выполнить код от уровня системы.
Актуальность угрозы
Несмотря на то, что с момента обнаружения уязвимости прошло уже больше трех недель, а на момент написания статьи пока не зафиксировано атак с ее использованием, BlueKeep не стоит недооценивать.
Специалистами нескольких ИБ-компаний (включая Zerodium, McAfee, Check Point и «Лабораторию Касперского») уже подтвердили возможность атаки с использованием данной уязвимости. Кроме того, независимый ИБ-эксперт Zǝɹosum0x0 разработал модуль MetaSploit для CVE-2019-0708, который позволяет получить полный доступ над уязвимой системой менее чем за минуту (пока модуль не выложен в открытый доступ). Поэтому появление нового WannaCry – всего лишь вопрос времени.
Так как многие организации используют RDS/RDP, BlueKeep может нанести даже больше ущерба, чем EternalBlue. В то время, как EternalBlue использует устаревшую версию протокола общего доступа к файлам SMB, который многие просто отключают, BlueKeep нацелен на протокол, широко используемый многими предприятиями. По оценкам компании Errata Security перед CVE-2019-0708 уязвимы по меньшей мере около миллиона систем. Сложно представить какой ущерб может нанести эта уязвимость.
Эксперты АНБ предупредили об опасности BlueKeep и необходимости установки патчей и оценили опасность уязвимости на 9,8 баллов из 10.
Рекомендации по устранению
Компания Microsoft уже выпустила патч, закрывающий данную уязвимость, и призывает компании и рядовых пользователей обратить внимание на эту уязвимость и срочно установить его. Также, в связи с критичностью BlueKeep, Microsoft опубликовали патчи и для Windows XP.
Для серверов, которые постоянно находятся в рабочем состоянии, компания 0patch выпустили workaround в виде 22 инструкций, которые призваны защитить серверы от попыток эксплуатации этой уязвимости.
Кроме того, специалисты US-CERT опубликовали статью с советами по обеспечению безопасности систем от BlueKeep:
- Заблокировать внешний доступ по RDP на периметровом FW и отключить проброс RDP порта (TCP 3389) в локальную сеть. Это позволит защитить хосты от эксплуатации уязвимости атакующими из-за пределов внутренней сети, однако хосты по-прежнему останутся уязвимыми из пределов внутренней сети.
- Включить поддержку Network Level Authentication (NLA — проверку подлинности на уровне сети – в настройках RDP на хостах). При включенной NLA для реализации уязвимости атакующему сначала нужно аутентифицироваться в службе.
- Временно или на постоянной основе (если RDP не требуется) отключить RDP-доступ к хостам и отключить службу RDS. Отключение неиспользуемых и ненужных служб помогает повысить общий уровень защищенности и является хорошей практикой даже без угрозы BlueKeep.