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

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

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

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

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

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/h3raklez/cve-2025-14321
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийCTFСтатьи и ИсследованияОбучение и ОбразованиеЭксплуатация Бинарных Файлов
GitHubh3raklez/cve-2025-14321

CVE-2025-14321

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

Популярное

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

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

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

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

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

CVE-2025-14321 Доказательство концепции

Описание

PoC для уязвимости Use-After-Free (UAF) в компоненте RTCEncodedFrameBase браузера Firefox, эксплуатируемой через API WebRTC Encoded Transforms.

CVE-2025-14321: Деструктор RTCEncodedFrameBase не вызывает DetachArrayBuffer() при освобождении нативной памяти кадра. В результате JavaScript-ArrayBuffers сохраняют указатели на уже освобожденную память (dangling pointers), что позволяет произвольное чтение и запись в heap content-процесса Firefox.

Этот PoC протестирован в Mozilla Firefox 145.0.1 и Windows 10.

Корневая причина

Firefox предоставляет закодированные видео/аудио кадры в виде JavaScript-ArrayBuffers через NewArrayBufferWithUserOwnedContents(). Когда нативный кадр (C++) уничтожается, резервная память ArrayBuffer освобождается, но ArrayBuffer в JavaScript не отсоединяется (detach). Это нарушает инвариант владения (ownership) и создает dangling pointer.

Уязвимый код (dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp):

root@kitploit:~
// ❌ Destructor no desvincula el ArrayBuffer
RTCEncodedFrameBase::~RTCEncodedFrameBase() = default;

Исправленный код:

root@kitploit:~
// ✅ Desvincula el ArrayBuffer antes de liberar memoria nativa
RTCEncodedFrameBase::~RTCEncodedFrameBase() {
  DetachData();
}

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

  • Firefox < 146
  • Firefox ESR < 140.6

Получаемые примитивы

  • READ: new Uint8Array(buf) читает данные из памяти, перераспределённой для других объектов в heap
  • WRITE: new Uint8Array(buf).fill(0x41) повреждает соседние объекты в heap (vtables, DOM-структуры и т.д.)

Этих примитивов достаточно для демонстрации уязвимости. С дополнительным heap shaping их можно расширить до удалённого выполнения кода (RCE).

Предварительные требования

Настройка Firefox (about:config)

root@kitploit:~
media.peerconnection.scripttransform.enabled = true
media.peerconnection.ice.loopback             = true
media.peerconnection.ice.no_host              = false
media.peerconnection.ice.relay_only           = false
media.peerconnection.ice.proxy_only           = false

⚠ Перезапустите Firefox после изменения предпочтений.

Разрешение на камеру (необязательно)

PoC пытается запросить доступ к камере через getUserMedia(). Это не обязательно, если настройки ICE сконфигурированы правильно. Его задача — перевести Firefox в RFC IP handling mode 1, который гарантирует генерацию ICE host-кандидатов в сценариях, где одних только настроек недостаточно.

На практике:

  • ВМ без камеры: getUserMedia() молча завершается с ошибкой (NotFoundError) без показа диалога. ICE всё равно подключается благодаря media.peerconnection.ice.loopback = true.
  • Система с камерой: Firefox показывает запрос разрешения. Его принятие обеспечивает ICE mode 1.
  • Камера отклонена: PoC использует canvas в качестве запасного варианта. ICE может подключиться, если настройки заданы верно.

HTTP-сервер

Web Workers не работают через file://. Обслуживайте по HTTP:

root@kitploit:~
python3 -m http.server 8080

Откройте в уязвимом Firefox: http://localhost:8080/poc-cve-2025-14321.html

Ход эксплуатации

1. getUserMedia → ICE mode 1 (best-effort)

PoC пытается запросить доступ к камере. Если камера доступна и пользователь соглашается, Firefox переводит сессию в RFC IP handling mode 1. Если getUserMedia() не срабатывает (ВМ без камеры, отказ в разрешении), PoC продолжает работу с canvas в качестве источника кадров — ICE всё равно подключается, если активно media.peerconnection.ice.loopback = true.

2. Анимированный canvas как источник кадров

Создаётся <canvas> размером 320×240 с анимацией 30fps через captureStream(30). Это генерирует предсказуемо закодированные видеокадры. После того как ICE подключается и камера была использована, PoC заменяет camera track на canvas через replaceTrack() и освобождает камеру.

3. WebRTC loopback-подключение

Создаются два локальных RTCPeerConnection (pc1 ↔ pc2) со стандартной SDP-негодиацией и trickle ICE. Кандидаты обмениваются напрямую между пирами (peers).

4. Transform Worker (RTCRtpScriptTransform)

RTCRtpScriptTransform назначается sender'у pc1 до SDP-негодиации. Worker перехватывает каждый закодированный кадр из отправляющего конвейера.

5. Удержание ArrayBuffers (200 кадров)

Для каждого из первых 200 кадров worker:

  1. Извлекает frame.data (ArrayBuffer, указывающий на нативную память)
  2. Сохраняет ссылку в массив (leaks[])
  3. Записывает известный паттерн: new Uint8Array(buf).fill(0x41)
  4. НЕ пересылает кадр → нативный wrapper уничтожается → память освобождается

Из-за отсутствия пересылки GC уничтожает C++ wrapper и освобождает нативную память. Но JavaScript-ArrayBuffer сохраняет указатель — создан dangling pointer.

6. Обнаружение UAF

Начиная с кадра 201, каждые 3 кадра worker:

  1. Читает первые 16 байт каждого удержанного буфера
  2. Если какой-либо байт отличается от 0x41, аллокатор переиспользовал эту память → UAF подтверждён
  3. Перезаписывает буфер значением 0x41 (write-примитив по чужому heap)

Этот цикл чтения/записи по освобождённой памяти вызывает прогрессирующее повреждение heap до тех пор, пока Firefox не крашит вкладку (эквивалент SIGSEGV, указанного в advisory).

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

Уязвимая версия (Firefox < 146)

root@kitploit:~
[0.4s] ✓ Track inicial: canvas (fallback)
[0.4s] ✓ ¡CONEXIÓN ICE ESTABLECIDA!
[0.5s] ▶▶▶ ¡PRIMER FRAME ENCODED RECIBIDO! ◀◀◀
[0.5s] Leak #0: 1219B → 41414141414141414141414141414141
[2.7s] Leak #49: 1497B → 41414141414141414141414141414141
[9.8s] Leak #199: 1870B → 41414141414141414141414141414141
[9.9s] 200 ArrayBuffers retenidos → memoria nativa YA liberada
[9.9s] → Dangling pointers activos, esperando reuso…
       [ CRASH DE PESTAÑA — heap corruption]

Примечание: Если камера доступна и разрешение предоставлено, в логе отобразится ✓ getUserMedia concedido — ICE modo 1 activo, а затем ✓ Track reemplazado: cámara → canvas после установки ICE-подключения. На ВМ без камеры PoC использует canvas напрямую без запроса.

Краш вкладки подтверждает повреждение heap: запись 0x41 в память, перераспределённую для других объектов (vtables, DOM-узлов), вызывает недопустимый доступ к памяти в content-процессе.

Исправленная версия (Firefox ≥ 146)

root@kitploit:~
✓ Buffer[0] detached correctamente — fix activo
ArrayBuffer detached — versión parcheada ✓

DetachData() в деструкторе делает ArrayBuffer недействительным перед освобождением нативной памяти, устраняя dangling pointer.

Структура проекта

root@kitploit:~
├── poc-cve-2025-14321.html            # PoC funcional (código fuente legible)
└── README.md                          # Este archivo

Патч

Mozilla исправила уязвимость в Firefox 146, добавив DetachData() во все деструкторы и пути очистки (teardown paths) RTCEncodedFrameBase.

Коммит: https://hg-edge.mozilla.org/mozilla-central/rev/1051067f6e83

Митигация

  • Обновите Firefox до версии 146 или выше
  • Обновите Firefox ESR до версии 140.6 или выше

Дисклеймер

⚠ ТОЛЬКО ДЛЯ ОБРАЗОВАТЕЛЬНЫХ И ИССЛЕДОВАТЕЛЬСКИХ ЦЕЛЕЙ

Этот PoC демонстрирует существование уязвимости вплоть до повреждения heap (краш). Он не реализует heap shaping, обход ASLR или техники hijack, необходимые для выполнения кода. Его цель — исключительно проверка и понимание CVE в контролируемых средах.

Ссылки

  • CVE: CVE-2025-14321
  • Пост в блоге: https://aisle.com/blog/firefox-webrtc-encoded-transforms-uaf-via-undetached-arraybuffer-cve-2025-14321
  • Advisory: MFSA 2025-92 · Bug 1992760
  • Коммит Mozilla: https://hg-edge.mozilla.org/mozilla-central/rev/1051067f6e83

Авторы

  • Обнаружено: Igor Morgernstern, AISLE Research Team
  • Дата сообщения: 2025-10-06
  • Дата патча: 2025-11-19
  • Дата публикации: 2025-12-09
Скачать инструмент