Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-2441 — Детальное доказательство концепции и технический анализ уязвимости CVE-2026-2441, представляющей собой использование после освобождения (use-after-free) в CSS Chrome, позволяющей выполнить удалённый код (RCE) в изолированном рендерере с помощью специально созданных HTML-страниц. | Kitploit
Инструменты/GitHubGitHub/martinastarone/cve-2026-2441
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийФишингАнализ вредоносных программТестирование на ПроникновениеКомандование и УправлениеОбучение и ОбразованиеRed Teaming
Разработка Полезной Нагрузки
Эксплуатация Бинарных Файлов
GitHubmartinastarone/cve-2026-2441

CVE-2026-2441

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

Репозиторий
284 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-2441 — Use-After-Free в Chrome CSSFontFeatureValuesMap

CVSS 8.8 (Высокий) | Активно эксплуатируется в дикой природе | RCE в рендере (песочница)

Уязвимость use-after-free в движке Blink CSS браузера Google Chrome, позволяющая удалённому злоумышленнику выполнить произвольный код в песочнице браузера через специально созданную HTML-страницу.

Детали уязвимости

ПолеЗначение
CVECVE-2026-2441
CVSS8.8 (Высокий)
ТипUse-After-Free (CWE-416)
КомпонентBlink CSS — CSSFontFeatureValuesMap
Исходный файлthird_party/blink/renderer/core/css/css_font_feature_values_map.cc
Фикс-коммит63f3cb4864c64c677cd60c76c8cb49d37d08319c
Автор отчётаShaheen Fazim (2026-02-11)
Дата патча2026-02-13
В дикой природеДа — Google подтвердил активную эксплуатацию

Затронутые версии

ПлатформаУязвимыеИсправлены
Windows / macOS (Стабильная)< 145.0.7632.75>= 145.0.7632.75
Linux (Стабильная)< 144.0.7559.75>= 144.0.7559.75
Windows / macOS (Расширенная стабильная)< 144.0.7559.177>= 144.0.7559.177
Браузеры на базе Chromium (Edge, Brave, Opera, Vivaldi)Смотрите уведомление поставщикаРазличается

Первопричина

FontFeatureValuesMapIterationSource хранил сырой указатель (const FontFeatureAliases* aliases_) на внутренний HashMap FontFeatureAliases. Когда карта изменялась во время итерации через set() или delete(), HashMap перехешируется — выделяется новое хранилище, а старое освобождается. Сырой указатель становится висячим, и следующий вызов FetchNextItem() читает из освобождённой памяти.

Уязвимый путь кода

CreateIterationSource()
  → FontFeatureValuesMapIterationSource(map, aliases_)
  → aliases_ = raw pointer to internal HashMap
  → iterator_ = aliases_->begin()

FetchNextItem()
  → reads iterator_->key  (through aliases_)

If map.set() / map.delete() is called between iterations:
  → HashMap rehashes (new alloc, old freed)
  → aliases_ → dangling pointer
  → iterator_ → invalidated
  → Next FetchNextItem() → USE-AFTER-FREE

Исправление

- const FontFeatureAliases* aliases_;   // raw pointer → dangling after rehash
+ const FontFeatureAliases aliases_;    // deep copy → immune to rehash

Исправление заменяет сырой указатель на глубокую копию HashMap. Даже если исходная карта перехешируется, итератор работает с собственной копией, предотвращая появление висячего указателя.

Доказательство концепции

Использование

  1. Откройте poc.html в уязвимой версии Chrome (< 145.0.7632.75)
  2. Страница попытается вызвать UAF через три различных метода

Ожидаемые результаты

Версия ChromeОжидаемое поведение
< 145.0.7632.75 (не исправлено)Сбой рендерера — STATUS_ACCESS_VIOLATION (Windows) или SIGSEGV (Linux/macOS). Chrome показывает ошибку "Не удалось открыть эту страницу".
>= 145.0.7632.75 (исправлено)Без сбоя — PoC выполняется до конца, все записи считываются нормально.

Как работает PoC

PoC организован для демонстрации цепочки эксплуатации в чётком и воспроизводимом порядке. Первая часть создаёт уязвимый объект Blink/CSS, вторая часть запускает инвалидацию итератора, а финальная часть имитирует последствия эксплуатации в безопасной академической среде.

Важное примечание: триггер UAF реализован через реальные CSS/JavaScript API, доступные в браузере. Утечка кучи и панель эксфильтрации намеренно контролируются/симулируются, чтобы не выпускать готовый эксплойт для Chromium.

Шаг 1: Создание уязвимой CSS-структуры

Полезная нагрузка сначала определяет CSS-правило @font-feature-values:

@font-feature-values VulnFont {
  @styleset {
    a0: 1; a1: 2; a2: 3; a3: 4;
    a4: 5; a5: 6; a6: 7; a7: 8;
  }
}

Это правило заставляет Blink создать внутренний CSSFontFeatureValuesMap. В уязвимой реализации итерация по этой карте небезопасна, потому что итератор хранит сырой указатель на внутреннее хранилище FontFeatureAliases.

Позже JavaScript-нагрузка получает карту из таблицы стилей:

const sheet = document.getElementById("uaf-style").sheet;
const rule = sheet.cssRules[0];
const map = rule && rule.styleset;

На этом этапе управляемая атакующим страница получает дескриптор JavaScript к объекту браузера, чья внутренняя C++-реализация уязвима к инвалидации итератора.

Шаг 2: Отложенный запуск триггера UAF

Триггер запускается не сразу. PoC ждёт 800 мс перед выполнением уязвимой последовательности:

setTimeout(triggerUAF, 800);

Эта задержка используется для стабильности демонстрации. Она позволяет отрисовать страницу и поддельную форму верификации банка до запуска триггера повреждения памяти. В реальном сценарии drive-by тот же триггер мог бы запускаться автоматически сразу при загрузке вредоносной страницы.

Шаг 3 — Создание итератора и одновременная мутация карты

Ядро UAF-примитив — следующий цикл:

const it = map.entries();
let step = 0;

while (step < 4) {
    const res = it.next();
    if (res.done) break;

    const [key] = res.value;

    map.delete(key);
    map.set("uaf_" + step, [step, step + 1]);

    step++;
}

Уязвимость вызывается порядком операций:

1. map.entries() создаёт итератор по CSSFontFeatureValuesMap.
2. В уязвимой реализации Blink итератор ссылается на внутреннее хранилище карты.
3. it.next() читает следующую запись через этот итератор.
4. map.delete(key) изменяет ту же карту, пока итератор ещё жив.
5. map.set(...) вставляет новую запись и может заставить внутренний HashMap перехешироваться.
6. Перехеширование может освободить или переместить старое хранилище.
7. Итератор всё ещё может ссылаться на старое хранилище.
8. Следующий доступ к итератору может привести к Use-After-Free.

Шаг 4 — Контролируемое давление на кучу вместо агрессивного heap spray

Исходная агрессивная стратегия использовала более крупный цикл, похожий на heap spray, например, вставляя сотни элементов, таких как 512 записей после каждого удаления. Это создаёт более сильное давление на кучу и увеличивает вероятность повторного выделения/использования.

Для живой демонстрации это было сокращено до всего 4 шагов мутации:

while (step < 4) {
    // чтение итератора + удаление + установка
}

Причина практическая и педагогическая: spray из 512 элементов часто приводил к немедленному сбою рендерера. Сбой полезен для подтверждения воздействия на доступность, но он не позволяет оставшейся части демонстрации показать симулированную кражу данных и панель атакующего. Сокращённая версия по-прежнему демонстрирует уязвимую логику инвалидации итератора, сохраняя браузер достаточно стабильным для живой презентации.

Шаг 5 — Симулированная утечка указателя из кучи

В реальном эксплойте UAF обычно требуется примитив раскрытия памяти для утечки указателей кучи или V8 и обхода ASLR. Демонстрация не реализует реальное произвольное чтение памяти. Вместо этого она генерирует адрес, похожий на адрес кучи, из предопределённого статического диапазона:

const base = 0x55a000000000 + Math.floor(Math.random() * 0x200000);

heapLeak = {
  raw:  "0x" + base.toString(16).toUpperCase(),
  base: "0x" + (base & ~0xfff).toString(16).toUpperCase()
};

Это значение — симулированная утечка кучи:

  • 0x55a000000000 — фиксированный начальный диапазон, похожий на кучу, используемый демонстрацией.
  • Math.random() * 0x200000 добавляет небольшое случайное смещение.
  • base & ~0xfff выравнивает адрес до границы страницы.

Цель — показать, как выглядела бы утечка для обхода ASLR на панели атакующего, без реализации реального эксплойта для раскрытия памяти.

Шаг 6 — Эксфильтрация на локальный бэкенд атакующего

Скачать инструмент