В начале 2017-го года Максим Малютин (Maksim Malyutin) из компании Embedi обнаружил уязвимость в Intel AMT, которая была официально оглашена Intel первого мая и получила номер CVE-2017-5689 (INTEL-SA-00075 в кодификации Intel). Уязвимости был присвоен тип «повышение прав» (Elevation of Privilege) и критический уровень опасности. Многие СМИ в ответ разразились заголовками что-то типа «серверные чипсеты Intel 9 лет имели уязвимость», видимо отталкиваясь от фразы «This vulnerability does not exist on Intel-based consumer PCs» в описании. Однако это не совсем так с переходом в совсем не так. Потому далее подробное техническое описание уязвимости, её реализация и, главное, способы защиты для систем, не имеющих обновления прошивки.
Intel ME, AMT, ISM, SBT
Без углубления в подробности что такое технология Intel Active Management Technology (AMT), всё же, нужно отметить, что не стоит путать Intel ME и Intel AMT, т.к. AMT всего лишь один из модулей (условно говоря — плагин), работающий на «движке» Intel ME. Мажорная версия Intel ME меняется с каждым поколением процессоров, вместе с ней, меняется и мажорная версия Intel AMT. Затронуты уязвимостью все версии начиная с Intel AMT 6 (соответственно Intel ME 6 и выше) — вплоть до самых новых (Intel ME 11.6 на момент написания статьи).
Также нужно добавить, что Intel Standard Manageability (ISM) — это урезанная версия Intel AMT (с ограниченным функционалом, но это AMT), а вот Intel Small Business Technology (SBT) — это технология, которая использует функционал AMT для своей работы (неточное определение но в общем смысл такой), но ею никак не является (это другой, отдельный плагин в составе движка Intel ME).
Hardware
Для поддержки Intel AMT требуется наличие трёх составляющих:
- Поддержка AMT в чипсете
- Поддержка AMT в процессоре
- Поддержка поддержка AMT в BIOS
Только наличие всех трёх даёт полноценную поддержку Intel AMT. Грубо (без совсем старых и деления на мобильные/десктоп) чипсеты Intel можно поделить на:
- Обычные — чипсеты Hxx и Zxx
- Малый бизнес — чипсеты с Bxx
- Бизнес/Корпоратив — чипсеты Qxx
- «Для энтузиастов» — чипсеты Xxx
- Серверные — чипсеты C2xx
Технологию Intel AMT поддерживают лишь чипсеты из 3-го и 5-го пункта, а технологию Intel SBT из 2-го — только этих сегментов касается уязвимость CVE-2017-5689. Если же уточнить, то из-за «непрямого» отношения SBT к AMT 2-й пункт рассматривать можно лишь условно, а поддерживающий на уровне чипсета 5-й пункт обычно отпадает, т.к. серверные чипсеты рассчитаны на использование BMC-контроллеров для удалённого управления, в многом дублируя функционал Intel AMT (или наоборот), потому реализовывать и поддержку BMC и поддержку AMT в BIOS вендоры особенно не спешат, в то время как для поддержки Intel AMT требуется и поддержка всех трёх условий (см. выше).
Соответственно, почти всегда в случае наличия Intel AMT речь будет идти лишь о чипсетах Qxx.
В системах SoC (System on Chip — когда процессор и чипсет интегрированы) узнать поддержку AMT сложней, т.к. это зависит от конкретной модели. В общем случае процессоры, поддерживающие Intel AMT можно найти на ark.intel.com/ru/Search/Advanced?ExtendedPageTables=True, выбрав в самом низу галку «Intel vPro Technology» (но также стоит не забывать про требования поддержки в BIOS).
Доступ
Уязвимостью можно воспользоваться:
- Локально на AMT-компьютере — требуется наличие установленных драйверов AMT, в частности драйвера LMS
- В локальной сети — firewall при этом не защищает, т.к. технология AMT перехватывает трафик ДО его обработки ОС. Кроме того, компьютер может быть вообще выключен (но подключён к сети+электросети)
- По интернету — в случае того, если компьютер был настроен на работу AMT через Intel MPS (плюс ранее указанное в пункте 2)
Во всех случаях требуется, чтобы технология AMT уже была проинициализирована/сконфигурирована.
Отдельной неприятной вещью является тот факт, что несконфигурированный компьютер, начиная с Intel AMT версии 7 и выше можно программно проинициализировать локально в клиентский режим (т.е. даже из расконфигурированного состояния). Потому в рекомендациях от Intel по борьбе с уязвимостью CVE-2017-5689, кроме различных телодвижений из разряда «всё выключить» есть опциональные «Disable CCM» — отключить клиентский режим и «Disable HBE» — отключить автоматическую инициализацию AMT (неприменимо для обычных компьютеров-ноутбуков — это лишь для встраиваемых систем). Потому как с помощью данных возможностей, предназначенных для упрощения программной инициализации, эту процедуру можно сделать на любой системе с поддержкой AMT (исключение — запрещённое AMT в BIOS).
Дизассемблирование
Все подробности нахождения уязвимости указаны в первоисточнике, они сделаны на примере Intel AMT 9 системы. Если коротко, то была дизассемблированная часть, обрабатывающая запросы к встроенному в Intel AMT web-серверу по характерным заголовкам (username, realm, nonce и т.д.) процесса аутентификации:
При исследовании на выходе функции проверки авторизации (заголовок «Authorization»), где сравниваются пароли (переданный с установленным) был обнаружен код проверки пароля:
ld r1, [sp:user_response+10ch]; проверяемый пароль → в регистр r1 (второй аргумент strncmp)
mov r0, r13 ; АМТ-пароль → в регистр r0 (первый аргумент strncmp)
ld r2, [sp:a4h] ; длина проверяемого пароля → в регистр r2 (третий аргумент strncmp)
bl strncmp ; call strncmp()
В результате получается, что в третий аргумент для функции strncmp() — количество сравниваемых символов, загружается длина из нашего ответа, а значит, при нулевом значении strncmp всегда будет давать true.
Понятно, что это ошибка разработчика, который должен был указать в качестве проверяемой длины пароля не длину передаваемого авторизующимся юзером (который можно сделать любым, в т.ч. передать значение нулевой длины), а установленного (админского) пароля.
Практическая проверка уязвимости AMT-систем
В документе от Embedi был описан простой вариант с локальным доступом при сконфигурированном AMT без использования TLS — когда используется AMT-порт 16992. Чтобы не повторяться, будет приведён другой случай — доступ к расположенному в локальной сети компьютеру с поддержкой AMT, сконфигурированному на использование TLS (т.е. через AMT-порт 16993).
Подключаемся к системе с поддержкой AMT (т.к. при подключении по TLS будет проверяться имя сервера, то используется FQDN, а не IP):
Залогиниться со стандартным логином admin и оставив поле пароля пустым не получится (что понятно):
Теперь произведём манипуляцию с HTTP-заголовками, для этого используем расширение для Firefox HttpRequester.
Делаем пробный запрос (данные не важны), чтобы просто узнать realm из ответа (в ошибке в заголовке WWW-Authenticate будет нужный для составления дальнейшего запроса параметр:
Теперь добавляем вручную заголовок «Authorization»:
А в качестве значения указываем полученный ранее realm и следующие параметры:
Digest username=«admin», realm=«Digest:EB580000000000000000000000000000», uri="/index.htm", qop=auth, nc=, cnonce="", opaque=""
После чего жмём Add и отправляем запрос.
Нас интересует параметр nonce, который уникален для каждой сессии. Добавляем его в заголовок (для этого придётся удалить старый и добавить новый), должно получиться что-то типа:
Digest username=«admin», realm=«Digest:EB580000000000000000000000000000», nonce=«dh8jcw1CAQCTmvMOLG5UghjzJper6NvS», uri="/index.htm", qop=auth, nc=, cnonce="", response="", opaque=""
С поправкой на каждый раз разный nonce и свой realm.
Сама уязвимость выделена жирным — пустое значение пароля, чтобы после была проверка по его нулевой длине.
Отправляем составленный таким образом (но достаточно быстро — пока не истекла сессиия):
Есть логин, теперь можно открыть страницу в Firefox:
Никаких при этом запросов на пароль не было.
Защита действующих AMT-систем (с ошибкой CVE-2017-5689 в firmware) с помощью настройки аутентификации по сертификату (mutual auth)
Рекомендации Intel по защите от CVE-2017-5689 в основном заключаются в отключении AMT на поддерживающих её системах. Но, во-первых, многие (например, я) с удовольствием пользуются и хотят пользоваться впредь этой реально удобной технологией удалённого администрирования (особенно освоив её работу через интернет) и потому нет никакого желания отказываться от этого, банально выключая AMT в BIOS. Во-вторых, по опыту прошлых проблем различных вендоров с отключением AMT в BIOS, несложно предположить аналогичные и в будущем — когда отключённая в BIOS технология Intel AMT почему-то работала или могла быть активирована (несмотря на «Disabled» в BIOS Setup). Зная это, всегда наиболее правильной рекомендацией является проинициализовать и правильно настроить AMT — как раз для защиты систем с поддержкой Intel AMT (в противоположность «отключить и/или расконфигурировать»). В правильную настройку в том числе входит использование сертификатов для аутентификации (в дополнение к парольной) — сколько уж говорилось про ненадёжность парольной защиты, глупо повторяться.
Для этого можно использовать различные утилиты, например, официальный Manageability Commander от Intel (или другой удобной, я предпочитаю MeshCommander).
(На «Invalid TLS» обращать внимания не стоит, т.к. используется самоподписанный сертификат)
Закрываем доступ для не-TLS соединений и включаем клиентскую аутентификацию и для локального (через LMS) и для удалённого доступа (по сети и интернету), предварительно создав и загрузив нужные сертификаты.
Теперь при попытке зайти сначала (до парольной уязвимости) будет запрос на сертификат:
И только предоставив корректный сертификат, хэш рута которого был предварительно добавлен в хранилище сертификатов AMT данного компьютера и DNS которого был прописан в списке разрешённых — будет получен доступ к системе. Где уже дальше будет запрос на пароль (подвержённый уязвимости).
Таким образом AMT-система будет защищена и её можно привычно пользоваться, даже если обновление прошивки с исправлением уязвимости CVE-2017-5689 так и не будет выпущено производителем вашей системы.
Ссылки:
- security-center.intel.com/advisory.aspx?intelid=INTEL-SA-00075&languageid=en-fr
- downloadmirror.intel.com/26754/eng/INTEL-SA-00075%20Mitigation%20Guide-Rev%201.1.pdf
- www.embedi.com/files/white-papers/Silent-Bob-is-Silent.pdf
- downloadcenter.intel.com/download/26375/Intel-Manageability-Commander
Автор: apple_rom