
Проверяет локальные сборки curl/libcurl на подверженность use-after-free при загрузке по HTTP/2 (CVE-2026-92392), с пассивной инвентаризацией, сканированием смонтированных образов и ограниченной проверкой PoC через loopback.
cve_2026_92392_check.py оценивает локальные артефакты curl и libcurl на предмет
CVE-2026-92392 — use-after-free при загрузке
по HTTP/2 в curl/libcurl.
Инструмент поддерживает пассивную локальную инвентаризацию, оценку по предоставленным баннерам, сканирование смонтированных образов без их выполнения и ограниченную проверку протокола HTTP/2 через loopback. Проверка носит защитный характер и не является оружием. В ней нет командной полезной нагрузки, шелл-кода, манипуляций с адресами памяти, логики утечки информации или RCE-полезной нагрузки.
Активная проверка привязывается только к 127.0.0.1, не принимает удалённый целевой URL или хост и выполняет только выбранный локальный бинарный файл curl.
Проверка разделяет четыре разных уровня доказательств:
| Уровень доказательства | Что он устанавливает | Что он не устанавливает |
|---|---|---|
| Классификация сборки | Находится ли артефакт curl/libcurl с квалифицированной версией вне затронутого upstream-диапазона, затронут upstream с неизвестным состоянием патча вендора или подтверждённо затронут на основе предоставленных данных о состоянии патча | Использует ли приложение фактически затронутый путь загрузки по HTTP/2 |
| Контекст экспозиции во время выполнения | Указывают ли предоставленные факты о приложении на то, что загрузки по HTTP/2 могут достичь контролируемой злоумышленником конечной точки | Была ли уязвимость вызвана |
| Стимуляция протокола | Доставил ли локальный loopback-стенд оба документированных варианта сброса при двух загрузках в одном соединении HTTP/2 | Use-after-free, причину сбоя или выполнение кода |
| Результат санитайзера с атрибуцией к CVE | Наблюдались ли одновременно последовательность-кандидат, heap-use-after-free от AddressSanitizer, идентичность затронутого upstream-артефакта и совпадающий стек HTTP/2 | Надёжность или практическую эксплуатируемость на другой системе |
Чистый прогон, неполный прогон протокола или прогон санитайзера без сбоя не доказывают, что сборка безопасна.
CVE-2026-92392 затрагивает обработку загрузки по HTTP/2 в curl/libcurl. Во время загрузки затронутая сборка может обработать HTTP/2 RST_STREAM, несущий либо REFUSED_STREAM, либо HTTP_1_1_REQUIRED. После этого буферизованные данные загрузки могут быть разобраны как новый запрос после того, как состояние HTTP/2 исходной передачи было отсоединено. Последующий обратный вызов HTTP/2 может разыменовать устаревший указатель Curl_easy.
Сравнение REA, использованное для пересмотра этой проверки, подтвердило соответствующее различие в порядке очистки:
Curl_conn_ev_data_done, обрабатывает ожидающие
дескрипторы и только затем вызывает Curl_req_done.Curl_req_done достигает req_flush, тогда как путь data-done HTTP/2 уже
очистил контекст потока.Curl_req_done до
Curl_conn_ev_data_done, устраняя этот устаревший порядок.Это доказательство реализации, поддерживающее модель доказательства проверки. Состояние патча вендора по-прежнему требует независимой проверки.
Upstream-рекомендация определяет уязвимую реализацию как введённую в curl 8.12.0. Проверка классифицирует upstream-релизы следующим образом:
| Условие релиза | Классификация |
|---|---|
| Раньше 8.12.0 | NOT AFFECTED |
| С 8.12.0 по 8.22.0, исключая исправленные бэкпорты | Затронут upstream |
| Ветка 8.14 начиная с 8.14.3 | Исправленный бэкпорт |
| Ветка 8.16 начиная с 8.16.2 | Исправленный бэкпорт |
| Ветка 8.20 начиная с 8.20.2 | Исправленный бэкпорт |
| 8.23.0 или позже | NOT AFFECTED |
| Development, snapshot, nightly или неоднозначная версия | INDETERMINATE |
Вендор может выполнить бэкпорт исправления, не меняя строку upstream-версии curl. Поэтому затронутая upstream-версия является инвентаризационным доказательством, а не окончательным доказательством того, что сборка вендора не пропатчена.
Используйте --patch-state только тогда, когда состояние семантического исправления в downstream было проверено через рекомендации вендора, журналы изменений пакетов, сравнение исходного кода или другой надёжный метод на уровне артефакта.
Значение --patch-state | Значение |
|---|---|
unknown | По умолчанию. Уязвимая версия upstream выдаёт UPSTREAM-AFFECTED VERSION. |
absent | Оператор независимо подтвердил отсутствие исправления в downstream. Уязвимая сборка с поддержкой HTTP/2 выдаёт AFFECTED BUILD. |
present | Оператор независимо подтвердил наличие семантического исправления в downstream. Это утверждение оператора, а не автоматическое доказательство бинарной эквивалентности исправлению в upstream curl. |
--poc.--poc-proof asan.openssl только при использовании --tls.Режим активного PoC отклоняет скрипты, обёртки, неопознанные собственные исполняемые файлы и бинарные файлы PE/Windows. Пассивная оценка остаётся доступной для баннеров и смонтированных файловых систем.
Проверьте бинарный файл curl, найденный в PATH:
python3 cve_2026_92392_check.py
Emit JSON:
python3 cve_2026_92392_check.py --json
Запустите внутренние самотесты:
python3 cve_2026_92392_check.py --self-test
python3 -O cve_2026_92392_check.py --self-test
Проверьте выбранный исполняемый файл curl и общую библиотеку libcurl:
python3 cve_2026_92392_check.py \
--curl-binary /opt/curl/bin/curl \
--libcurl-path /opt/curl/lib/libcurl.so \
--json
Оцените доверенный баннер curl без выполнения бинарного файла:
python3 cve_2026_92392_check.py \
--version-string 'curl 8.12.0 libcurl/8.12.0 nghttp2/1.61.0' \
--json
Простая версия, такая как 8.12.0, не принимается в качестве подтверждённого свидетельства идентичности curl/libcurl.
Проверяющий намеренно не обращается к удалённым хостам. Получите баннер через авторизованный административный канал, сохраните его локально, а затем оцените его локально:
ssh [email protected] 'curl --version' > host-curl-version.txt
python3 cve_2026_92392_check.py \
--version-file host-curl-version.txt \
--http2-use unknown \
--untrusted-upload unknown \
--https-certificate unknown \
--json
Если проверка приложения или доверенная трассировка устанавливает, что загрузки используют HTTP/2, могут достичь контролируемой злоумышленником конечной точки и принимают её HTTPS-сертификат, укажите эти факты явно:
python3 cve_2026_92392_check.py \
--version-file host-curl-version.txt \
--http2-use yes \
--untrusted-upload yes \
--https-certificate yes \
--patch-state unknown \
--json
Для cleartext h2c используйте --https-certificate not-applicable.
--http2-use yes указывает на использование HTTP/2 во время выполнения. Это не доказывает, что артефакт был скомпилирован с поддержкой HTTP/2. Аналогично, --untrusted-upload yes описывает поток данных приложения, тогда как --https-certificate yes фиксирует отдельное условие доверия HTTPS.
Используйте --root для сканирования смонтированного образа контейнера, образа виртуальной машины или извлечённой файловой системы без выполнения обнаруженных файлов:
python3 cve_2026_92392_check.py \
--root /mnt/rootfs \
--json