Содержание статьи
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Уязвимость относится к use after free (UAF). Участок памяти освобождается, но указатель на него сохранен и может быть повторно использован. В крайнем случае злоумышленник получит полноценную RCE, подложив в память фейковый объект нужного размера с собственными функциями. Останется добиться, чтобы аллокатор снова выделил этот участок памяти. Приложение пытается вызвать легитимную функцию или метод, но выполняется то, что хакер подложил.
Уязвимость CVE-2026-2441 обнаружилась в подсистеме CSS движка Blink. Движок занимается преобразованием HTML, CSS и JS в полноценные веб‑страницы: код HTML конвертирует в DOM, а код CSS — в CSSOM. Внутри CSSOM создаются структуры, представляющие правила. Уязвимость — в обработке правила @font-feature-values. Изменяя элементы этого правила в JS-коде, злоумышленник может атаковать браузер.
Правило @font-feature-values помогает веб‑разработчикам сделать код CSS более читаемым и управляемым. Внутри помещается набор именованных значений. В статье я буду использовать @styleset, но имя может быть любым. В наборе человекочитаемым названиям присваиваются числовые значения OpenType. Пример использования:
@font-feature-values CoolFont { @styleset { fancy: 1; flowing: 2; }}/* Теперь можно спокойно использовать в CSS вместо непонятных цифр */.special-text { font-family: CoolFont; font-variant-alternates: swash(fancy);}Blink при работе создает для блока @styleset внутреннюю хеш‑таблицу на основе WTF::. Доступ к этой структуре из JavaScript происходит через объект CSSFontFeatureValuesMap. Это обертка над внутренним контейнером движка.
Проблема возникает при использовании итераторов. При вызове в JavaScript map. Blink создает в табе объект‑итератор FontFeatureValuesMapIterationSource. В уязвимой версии итератор хранил сырой указатель на внутренний контейнер FontFeatureAliases.
const FontFeatureAliases* aliases_;Контейнер FontFeatureAliases — это алиас WTF::, объявленный через using. Информацию можно найти в исходниках Chromium:
using FontFeatureAliases = HashMap<AtomicString, FeatureIndicesWithPriority>;Если во время итерации происходит мутация, например set( или delete(, контейнер может выполнить рехеш — перераспределить память, перенести элементы в новый буфер и освободить старый. Но указатель внутри итератора остается прежним. Он указывает на освобожденный участок памяти. Это UAF в чистом виде.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
