
Go CLI, который инвентаризирует HTTPS-конечные точки, согласующие HTTP/2 через ALPN, для выявления систем, требующих проверки мер по смягчению последствий CVE-2023-44487. Проверки TLS без эксплуатации, с верификацией сертификатов и безопасными настройками по умолчанию.
rapid-reset-check — это небольшая Go-утилита командной строки для быстрой инвентаризации HTTPS-эндпоинтов, которые поддерживают HTTP/2 и поэтому требуют проверки мер по смягчению CVE-2023-44487.
Сканер заведомо не наносит вреда. Он разрешает каждый целевой адрес, устанавливает TLS-соединение с проверкой сертификата, предлагает h2 и http/1.1 через ALPN, фиксирует выбор пира и закрывает соединение. Он не отправляет ни HTTP-запроса, ни предисловия HTTP/2, ни потоков, ни кадров RST_STREAM, ни флуд-трафика.
[!IMPORTANT] Согласование
h2— это наблюдаемый факт подверженности, а не доказательство того, что сервис уязвим или не пропатчен. Удалённое рукопожатие не может проверить ограничения Rapid Reset в реализации HTTP/2, уровень патчей, вышестоящий источник или средства защиты от DDoS.
CVE-2023-44487 — это техника отказа в обслуживании, которая злоупотребляет быстрым созданием и отменой потоков HTTP/2. Попытка доказать наличие условия против живого сервиса сама потребовала бы потенциально разрушительного трафика. Вместо этого данный инструмент отвечает на безопасный первый вопрос:
HTTP/2 через TLS объявляется с использованием ALPN-идентификатора h2, определённого в RFC 9113. Google рекомендует проверять или пропатчивать каждый сервер, прокси и балансировщик нагрузки с поддержкой HTTP/2 на пути запроса; см. рекомендации Google по CVE-2023-44487.
Для запуска инструмента Go не требуется. Скачайте архив для вашей платформы из последнего релиза GitHub:
| Платформа | Файл релиза |
|---|---|
| Linux x86-64 | rapid-reset-check_<version>_linux_amd64.tar.gz |
| Linux ARM64 | rapid-reset-check_<version>_linux_arm64.tar.gz |
| macOS Intel | rapid-reset-check_<version>_darwin_amd64.tar.gz |
| macOS Apple silicon | rapid-reset-check_<version>_darwin_arm64.tar.gz |
| Windows x86-64 | rapid-reset-check_<version>_windows_amd64.zip |
| Windows ARM64 | rapid-reset-check_<version>_windows_arm64.zip |
Распакуйте архив, затем выполните rapid-reset-check --version. В Windows исполняемый файл называется rapid-reset-check.exe.
Каждый релиз включает SHA256SUMS. В Linux проверьте скачанный архив из той же директории с помощью:
sha256sum --ignore-missing --check SHA256SUMS
В macOS сравните shasum -a 256 <archive> с соответствующей строкой в SHA256SUMS. Опубликованные архивы публичных релизов также получают артефактную аттестацию GitHub, которую можно проверить с помощью GitHub CLI:
gh attestation verify <archive> --repo ramonzx6/http-script-json
Установка Node.js, cURL, nghttp2 или WHOIS не требуется.
go test ./...
go build -o rapid-reset-check ./cmd/rapid-reset-check
Сборки из исходников сообщают dev в --version; релизные сборки получают свою версию из тега релиза.
Сканируйте только те эндпоинты, которыми вы владеете или на проверку которых у вас есть разрешение.
Сканирование одного или нескольких публичных эндпоинтов:
./rapid-reset-check example.com api.example.com:8443
Голые имена хостов нормализуются до HTTPS на порту 443. URL-адреса, содержащие только authority в схеме HTTPS, также принимаются:
./rapid-reset-check https://example.com https://api.example.com:8443
Сканирование JSON-списка целей из репозитория:
./rapid-reset-check --input json/urls.json
Использование стандартного ввода для автоматизации:
printf '["example.com", "api.example.com"]' | ./rapid-reset-check --input -
Выполните ./rapid-reset-check --help, чтобы увидеть все ограничения и параметры вывода.
--input принимает исходный формат JSON-массива:
[
"example.com",
"api.example.com:8443",
"https://www.example.net"
]
Объектные формы {"urls": [...]} и {"targets": [...]} также поддерживаются. Позиционные цели и --input намеренно взаимоисключающие. Дублирующиеся нормализованные эндпоинты сканируются один раз, а каждый запуск ограничен 4 096 входными целями.
В рамках сканирования только HTTPS-эндпоинты. Учётные данные, пути, не являющиеся корневыми, запросы, фрагменты, неподдерживаемые схемы, некорректные порты и неоднозначные имена хостов отклоняются, а не тихо переписываются.
| Оценка | Значение |
|---|---|
h2_observed_review_required | По крайней мере один проверенный TLS-пир выбрал h2. Проверьте каждый компонент HTTP/2 на этом пути; это не вердикт об уязвимости. |
h2_not_observed_on_tested_path | Каждый выбранный адрес завершил проверенное рукопожатие без выбора h2. Это наблюдение пути на конкретный момент времени, а не гарантия безопасности. |
indeterminate | Проблема с DNS, соединением, таймаутом, TLS, сертификатом или лимитом адресов помешала полному наблюдению. |
not_scanned_policy | Разрешённые адреса были исключены политикой сетевой безопасности сканера. |
invalid_target | Ввод был некорректным или выходил за пределы поддерживаемой области HTTPS-authority. |
Отчёт включает каждый испытанный разрешённый адрес, согласованный ALPN, версию и шифр TLS, ограниченные данные об идентичности/сроке действия сертификата, время, решения политики, количество пропущенных адресов, явный флаг полноты и сводку. Он не собирает тела ответов, заголовки ответов, cookie или необработанные сертификаты.
--ca-file, чтобы добавить частный центр сертификации; режима небезопасной проверки не существует.--allow-private только для внутренних эндпоинтов, которые вы уполномочены проверять.Пример параметров:
./rapid-reset-check \
--format json \
--timeout 5s \
--concurrency 4 \
--max-addresses 8 \
example.com > report.json
Для авторизованного эндпоинта с частным PKI:
./rapid-reset-check \
--allow-private \
--ca-file ./internal-root-ca.pem \
service.internal:8443
Код возврата 0 означает, что каждая цель дала полное наблюдение ALPN. Код возврата 1 означает, что по крайней мере одна цель была некорректной, заблокированной политикой или неопределённой; отчёт при этом всё равно записывается. Ошибки использования CLI и конфигурации возвращают 2. Наблюдение h2 само по себе не меняет код возврата, поскольку это сигнал инвентаризации, а не вердикт об уязвимости.
Для каждого результата h2_observed_review_required:
Результаты относятся к конкретному имени хоста, ответам DNS, сетевому пути, TLS-эндпоинту и времени сканирования. CDN, anycast, split-horizon DNS, балансировка нагрузки, альтернативные порты и непротестированные адреса могут дать другие результаты. Сканер не:
h2c), QUIC/HTTP/3, редиректы, исходные серверы, скрытые за пограничным узлом, или сервисы, не работающие по HTTPS;Server или CDN-отпечатков;gofmt -w ./cmd ./internal
go vet ./...
go test ./...
go test -race ./...
go build ./...
Тестовый набор использует локальные TLS-фикстуры и не сканирует публичные сервисы.
Release Please управляет версиями релизов и тегами vX.Y.Z на основе сообщений Conventional Commit. Обычная разработка не требует создания или отправки тегов:
main, приводят к тому, что Release Please открывает или обновляет release-PR, содержащий изменения версии и журнала изменений.Используйте fix: для патч-изменений, feat: для минорных изменений и маркер разрушающего изменения (!) или footer BREAKING CHANGE: для мажорных изменений. Мейнтейнеры должны один раз включить Settings > Actions > General > Workflow permissions > Allow GitHub Actions to create and approve pull requests, чтобы Release Please мог управлять своим PR.
Если после создания тега Release Please публикация артефактов не удалась, релиз остаётся черновиком. Повторно запустите рабочий процесс Release вручную с этим существующим тегом vX.Y.Z после исправления проблемы. Не создавайте и не отправляйте заменяющий тег.