Ты прос­то откры­ваешь сайт, а вре­донос­ный код уже выпол­няет­ся в бра­узе­ре. Даль­ше он пыта­ется выб­рать­ся из песоч­ницы и зах­ватить комп. К таким пос­ледс­тви­ям может при­вес­ти уяз­вимость use after free в движ­ке CSS Chrome (CVE-2026-2441). Пока ты чита­ешь статью, тысячи поль­зовате­лей про­дол­жают сидеть на уяз­вимой вер­сии бра­узе­ра.

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::HashMap. Дос­туп к этой струк­туре из JavaScript про­исхо­дит через объ­ект CSSFontFeatureValuesMap. Это обер­тка над внут­ренним кон­тей­нером движ­ка.

Проб­лема воз­ника­ет при исполь­зовании ите­рато­ров. При вызове в JavaScript map.entries() Blink соз­дает в табе объ­ект‑ите­ратор FontFeatureValuesMapIterationSource. В уяз­вимой вер­сии ите­ратор хра­нил сырой ука­затель на внут­ренний кон­тей­нер FontFeatureAliases.

const FontFeatureAliases* aliases_;

Кон­тей­нер FontFeatureAliases — это али­ас WTF::HashMap, объ­явленный через using. Информа­цию мож­но най­ти в ис­ходни­ках Chromium:

using FontFeatureAliases = HashMap<AtomicString, FeatureIndicesWithPriority>;

Ес­ли во вре­мя ите­рации про­исхо­дит мутация, нап­ример set() или delete(), кон­тей­нер может выпол­нить рехеш — перерас­пре­делить память, перенес­ти эле­мен­ты в новый буфер и осво­бодить ста­рый. Но ука­затель внут­ри ите­рато­ра оста­ется преж­ним. Он ука­зыва­ет на осво­бож­денный учас­ток памяти. Это UAF в чис­том виде.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии