Назад к блогу

Переполнение в PXE-драйвере EDK2: 16 лет в коде сетевой загрузки

Переполнение в PXE-драйвере EDK2: 16 лет в коде сетевой загрузки

В драйвере PXE-Base Code из состава EDK2 обнаружили критическое переполнение буфера, которое оставалось незамеченным 16 лет и позволяет исполнять код на самом привилегированном уровне процессора. Поскольку этот эталонный код лежит в основе прошивок множества производителей, устранение ошибки на миллионах устройств растянется надолго, а публично доступный патч упрощает создание эксплойтов.

В драйвере PXE-Base Code из состава TianoCore EDK II нашли переполнение буфера — CVE-2026-97631 с оценкой серьёзности 9.5 из 10. Ошибка живёт в коде 16 лет и срабатывает при обработке ICMP-сообщений об ошибках во время сетевой загрузки: сообщение длиннее 504 байт записывает данные за пределы поля в приватной структуре контекста драйвера. Последствия — от зависания загрузки до исполнения кода в ring 0 — самом привилегированном уровне CPU.

Что именно изменилось

Драйвер NetworkPkg/UefiPxeBcDxe, отвечающий за загрузку по сети, держит открытым запрос на приём ICMP-сообщений об ошибках и копирует каждое принятое сообщение в фиксированное поле Mode.IcmpError размером 504 байта. Границы в цикле копирования проверяются неверно в обоих обработчиках — для IPv4 и для IPv6: для сообщения длиннее 504 байт байты всё равно копируются в поле, а указатель назначения сдвигается на накопленную длину, а не на длину отдельного фрагмента. В результате слишком длинное сообщение пишет управляемые атакующим байты за границей поля. Ничто раньше на пути приёма длину сообщения не ограничивает.

Обработчиков два, потому что драйвер принимает сообщения об ошибках в двух вариантах сетевого протокола — IPv4 и IPv6; каждый из них разбирает своё сообщение и копирует его в то же поле. Обработчик — это процедура отложенной обработки (DPC, deferred procedure call): она вызывается не в момент прихода пакета, а позже, когда драйвер доходит до разбора накопленных сообщений, и именно в ней выполняется копирование.

Доставить вредоносную ошибку можно простым unicast-пакетом с любого сетевого расстояния на IP-адрес целевого устройства — при условии, что пакет пришёл во время последовательности PXE-загрузки. Атакующий может подвесить загрузку, вызвав отказ в обслуживании, а зная сборку прошивки — внедрить «поддельное событие», исполняющее код на CPU в среде UEFI в ring 0. «Поддельное событие» — это сконструированное атакующим содержимое, которое прошивка принимает за собственное событие и передаёт на исполнение процессору; поскольку код при этом выполняется в среде UEFI-прошивки, он получает ring 0 — самый привилегированный уровень CPU.

Предыстория

Уязвимость пополняет длинный список ранее найденных дыр в UEFI или тесно связанном с ним коде — отсюда формулировка yet another forever day. По словам HD Moore, из-за повсеместности CVE-2026-97631 это, вероятно, «вечная» ошибка, которая останется жить в системах, снятых с поддержки.

Раскрытие вышло внеплановым. AMI опубликовала pull request с описанием уязвимости и кодом исправления, после чего участники TianoCore Project выпустили публичный advisory. Изначально раскрытие планировалось на январь в рамках скоординированного раскрытия.

Почему это сделали и почему это важно

Критичность определяется расположением ошибки: TianoCore EDK II — открытая кодовая база, из которой производители оборудования и облачные провайдеры собирают UEFI-прошивку. Почти все поставщики UEFI, включая AMI, Insyde и Phoenix, широко используют этот эталонный код; форк Microsoft Project Mu тоже содержал уязвимый компонент.

Публично доступный код исправления упрощает задачу: продвинутым хакерам станет тривиально понять, как срабатывает уязвимость, и построить рабочие эксплойты. При этом патчинг UEFI на миллионах конечных устройств, проданных тысячами производителей и облачных провайдеров, громоздок и долог.

Moore указывает на дополнительный риск: атакующий может перехватить поток выполнения в момент, когда загрузка ещё имеет доступ к TPM, что позволяет сломать шифрование диска при кратковременном сетевом доступе или при краже устройства. Эксплойты обходят процессы аттестации, криптографически подтверждающие удалённым серверам безопасность оборудования.

Что это меняет на практике

Исправление — базовое изменение кода, которое затем разворачивается как обновление BIOS/UEFI. В отличие от обходов Secure Boot в загрузчике, здесь не нужны отзыв ключей и обновление управления ключами pk/kek/db/dbx. Простоя можно избежать: исправление настраивает капсульное обновление прошивки при перезагрузке, а саму перезагрузку можно отложить до ближайшей штатной.

Эксплойт не универсален: атакующему нужно угадывать конкретные адреса в целевой системе, поэтому его приходится настраивать под каждую модель, версию и конфигурацию — адреса меняются вместе с ними.

Пострадавшим советуют обратиться к производителю прошивки за указаниями и по возможности временно отключить сетевую загрузку. Включать TPM и Secure Boot и следить за журналами на признаки попыток эксплуатации стоит всегда, хотя от этой угрозы перечисленные средства не защищают.

Ограничения и открытые вопросы

Уязвимость не затрагивает домашних и малых офисных пользователей и всех, кто загружается только с дисков. Она применима лишь к организациям, чьи машины загружаются из локальных сетей или из интернет-ресурсов, и только если прошивка опирается на EDK2, а не на другую эталонную реализацию, и использует PXE — включённый по умолчанию.

Для эксплуатации нужен некоторый контроль над локальной сетью: это «a prerequisite», что ограничивает круг атакующих инсайдерами, государствами или операторами программ-вымогателей, получившими низкоуровневый доступ внутрь сети для повышения прав. Свидетельств, что CVE-2026-97631 даёт первоначальную точку входа в сеть, пока нет.

Кроме того, атакующий должен попасть в окно в несколько секунд, когда компьютер слушает сетевой адаптер в ожидании PXE-трафика, и достучаться до него ICMP-трафиком в это окно. Для ресурсов за фронтендами вроде CloudFlare или балансировщиков это затруднено: на ICMP отвечает фронтенд, не передавая сообщения бэкенду.

Arm заявила, что CVE-2026-97631 напрямую не применима к её продуктовому портфелю. При этом прошивка Arm, как и у Intel, во многом заимствует из EDK2, и TianoCore документировала эту зависимость. Некоторые платформы могут быть свободны от кода EDK2, но пользователям всех серверов разумно проверить, затрагивает ли их уязвимость. AMD, Phoenix Technologies, AMI, Microsoft и Amazon на вопросы не ответили на момент публикации; представители TianoCore Project тоже. Без конкретных ответов о том, используют ли эти организации EDK2, невозможно сказать, какие устройства затронуты и что делать.

Источники

Похожее