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

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

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

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

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

Категории

Все категории
Loading categories
msquic-compat-vn-key-poison — Proof-of-concept и лабораторная работа, демонстрирующая DoS-атаку на рукопожатие QUIC с совместимым согласованием версии и отравлением ключа в MsQuic v2.6.1, с подтверждением UDP-инъекции и анализом исправления. | Kitploit
Инструменты/GitHubGitHub/abraxas/msquic-compat-vn-key-poison
Сниффинг и анализ пакетовАнализ уязвимостейЭксплуатацияФаззингСетевая безопасностьСтатьи и Исследования
GitHubabraxas/msquic-compat-vn-key-poison

msquic-compat-vn-key-poison

Proof-of-concept и лабораторная работа, демонстрирующая DoS-атаку на рукопожатие QUIC с совместимым согласованием версии и отравлением ключа в MsQuic v2.6.1, с подтверждением UDP-инъекции и анализом исправления.

Репозиторий
116 дней назадЕщё не проверено

Популярное

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

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

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

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

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

Abraxas Labs - msquic-compat-vn-key-poison

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  msquic-compat-vn-key-poison

msquic-compat-vn-key-poison

MsQuic v2.6.1 (a01333cf) — Microsoft

Согласование совместимых версий должно ждать, пока клиент действительно сможет обработать пакет новой версии. В этом дереве версия фиксируется и ключи Initial пересоздаются в тот момент, когда длинный заголовок выглядит совместимым, после чего обработка продолжается. «Откат» при ошибке расшифровки восстанавливает номер версии и оставляет ключи на v2. Пакет типа Handshake или усечённый пакет вообще не доходит до этого отката.

Одна UDP-датаграмма от четвёрки сервера останавливает рукопожатие клиента по умолчанию. Процесс продолжает работать. Без RCE.

IDCVE пока нет
CWECWE-345, CWE-347, CWE-670
CVSSHigh: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
ПродуктMsQuic
Затронутоv2.6.1 (a01333cf); на момент проверки всё ещё присутствует в main
Аутентификациянеаутентифицированный UDP, источник должен быть четвёркой сервера (on-path, либо IP-спуфинг сервера вместе с портом клиента)
ЛицензияGNU Affero GPL v3.0
Лабораториятолько 127.0.0.1

Что может сделать атакующий

Во время рукопожатия QUIC v1 отправить одну датаграмму с длинным заголовком, исходящую с адреса и порта сервера. Версия — QUIC v2 (RFC 9369, на проводе 6b 33 43 cf). DestCidLength равен 0. Клиенты по умолчанию используют эксклюзивный подключённый UDP-сокет, поэтому принимают DCID нулевой длины. Библиотека трактует это как согласование совместимой версии до AEAD, выводит новые ключи Initial, а затем либо никогда не доходит до отката при ошибке расшифровки (тип Handshake откладывается; усечённый Initial сначала возвращает FALSE), либо откатывает Stats.QuicVersion и оставляет ключи на v2.

Настоящий сервер продолжает говорить на v1. Клиент выполняет повторную передачу с солями v2. Эта попытка никогда не достигает состояния Connected. Другие соединения в том же процессе не затрагиваются. Это DoS рукопожатия, а не RCE.

Для off-path требуется IP-спуфинг сервера вместе с эфемерным UDP-портом клиента. On-path достаточно. Эксклюзивное связывание означает, что атакующему не нужен CID.

Как я это нашёл

Сначала я прочитал волну GHSA 2026 года по microsoft/msquic: MITM имени хоста (GHSA-w5f4-fx9m-m4q7, этот тег — cherry-pick), path-UAF RCE (GHSA-92f5-vc22-8j33), underflow ACK (GHSA-gvvw-8j96-8g5r). Эти точки входа закрыты в v2.6.1.

Затем — заголовки пакетов, CID, согласование версий, retry, stateless reset, CIBIR. Совместимое VN по RFC 9368 — это то, что осталось. QuicConnRecvHeader видит несовпадение версий, спрашивает, совместима ли она, записывает OriginalQuicVersion, устанавливает CompatibleVerNegotiationAttempted, присваивает Stats.QuicVersion, вызывает QuicCryptoOnVersionChange и продолжает. В комментарии сказано, что транспортные параметры позже проверят ChosenVersion. Эти TP никогда не придут, если рукопожатие так и не расшифруется.

Ошибка расшифровки выглядит как исправление, пока не прочитаешь её:

Connection->Stats.QuicVersion = Connection->OriginalQuicVersion;
Connection->State.CompatibleVerNegotiationAttempted = FALSE;

Второго вызова QuicCryptoOnVersionChange нет. Метки HKDF остаются на v2. Пакеты типа Handshake откладываются (HANDSHAKE > ReadKey=INITIAL), и RecvHeader возвращает FALSE, поэтому этот откат никогда не выполняется.

Мне не понадобился src/tools/attack. Семи байт достаточно.

Уже зафиксированные неверные пути: инъекция на порту прослушивания сервера (клиент эксклюзивно подключён, он этого не увидит); пересылка Initial до отравления на loopback (рукопожатие завершается первым, отравление приходит поздно); getchar() в качестве ожидания в примере сервера (Docker — это не клавиатура); поверхностный клон с пустым сабмодулем openssl (образ должен получить v2.6.1 и инициализировать openssl); любой мусорный длинный заголовок в качестве доказательства (несовместимый 11223344 всё равно даёт Connected — интересна именно совместимая v2). Театр: полезная нагрузка CRYPTO, reverse shell, RCE. Свидетель — исход рукопожатия.

Лаборатория

cd lab
./run.sh

UDP-прокси 127.0.0.1:18150 — это адрес, к которому подключается клиент. Настоящий сервер quicsample — 127.0.0.1:18151. На первой датаграмме клиента PoC отправляет усечённый v2 Handshake f06b3343cf0000 из сокета прокси, затем пересылает. Привяжите его к loopback.

control_connected=1
inject_connected=0
negative_connected=1
inject_hex=f06b3343cf0000
SUCCESS MSQUIC-COMPAT-VN-KEY-POISON-WITNESS

CONTROL работает только на пересылку и должен дать Connected. NEGATIVE сначала инжектирует f0112233440000 и всё равно должен дать Connected. INJECT — единственная фаза, которая умирает.

Исправление

Не вызывайте QuicCryptoOnVersionChange, пока вызвавший его пакет не расшифруется. При любом сбое после фиксации (RecvHeader FALSE и ошибка расшифровки) восстанавливайте версию и выводите ключи обратно к OriginalQuicVersion. Игнорируйте Handshake / 0-RTT как триггеры совместимого VN. Переключаться должен только расшифровываемый Initial новой версии.

Ссылки

  • github.com/microsoft/msquic тег v2.6.1
  • connection.c · crypto.c · binding.c · version_neg.c
  • Рядом исправлено: GHSA-w5f4-fx9m-m4q7 · GHSA-92f5-vc22-8j33 · GHSA-gvvw-8j96-8g5r
  • RFC 9368 · RFC 9369
Скачать инструмент