
PoC em Python e laboratório Docker para CVE-2026-61500: recupera o estado do PRNG do Rejetto HFS V8 para forjar um cookie de sessão de administrador e obter RCE via server_code.
CVE-2026-61500 é uma vulnerabilidade de falsificação de sessão não autenticada no Rejetto
HFS 3.0.0 até 3.2.0. O HFS gerava sua chave de assinatura do cookie de sessão do Koa com
o Math.random() do JavaScript e expunha saídas do mesmo PRNG do V8 no handshake de login
SRP não autenticado. Um atacante pode reconstruir o estado do PRNG, recuperar a chave de
assinatura, forjar uma sessão de administrador e usar o recurso documentado de configuração
server_code para executar JavaScript no lado do servidor.
Este repositório contém uma prova de conceito em Python e uma comparação descartável em Docker usando as imagens oficiais do HFS 3.2.0 e 3.2.1. A build de publicação é intencionalmente restrita a alvos HTTP na interface de loopback local.
| Declaração | Status |
|---|---|
| Recuperar o estado xorshift128+ do V8 a partir de respostas de login não autenticadas | Confirmado |
| Recuperar a chave de assinatura de cookie ativa do HFS | Confirmado |
| Forjar uma sessão aceita como administrador do HFS | Confirmado |
Executar um marcador server_code benigno no HFS 3.2.0 oficial | Confirmado |
| Receber um reverse shell como root dentro da rede Compose isolada | Confirmado |
| Parar antes da falsificação de sessão no HFS 3.2.1 oficial | Confirmado |
| Direcionamento ou persistência em toda a internet | Não fornecido nem alegado |
loginSrp1 para a conta admin
conhecida. Cada resposta vulnerável coloca um loggingIn.sid numérico e seu
cookie de sessão assinado nos cabeçalhos Set-Cookie.randomId(30) do HFS. O PoC
considera o arredondamento da string mais curta do V8 e verifica os candidatos
contra um HMAC hfs_http.sig observado, o que também identifica o deslocamento
de inicialização.username: admin, depois chame
get_config para provar que o cookie forjado tem acesso de administrador.set_config com um pequeno módulo server_code. O payload padrão
grava um marcador benigno em /data; está disponível apenas para
o laboratório Docker em loopback.Esta é uma cadeia HTTP de caixa preta: o PoC não lê arquivos, memória, variáveis de ambiente ou estado de processo do alvo. O conhecimento do código-fonte é usado para modelar o algoritmo vulnerável.
59472e534bf7e056d708382d02935c2eaf956927.A correção substitui a chave de assinatura por 32 bytes do randomBytes() do Node.js e
substitui o identificador numérico de login exposto por randomUUID(). Fornecer um valor
explícito e forte de COOKIE_SIGN_KEYS mitiga a previsão da chave de assinatura, mas
atualizar continua sendo a remediação recomendada.
rejetto/hfs:v3.2.0, digest
sha256:d6765e93b68de222583be7788afad699695fd08aa2f56377337f5139779e0746.rejetto/hfs:v3.2.1, digest
sha256:61db4da1f494df254aa7f48889c676b424b413e45b7b92cf4276f4b8e632aaec.python:3.13-alpine, digest
sha256:1a63a53928ce53d2b0baf08092a703f4840ac5dfbd61fd48802dbf48e08c801e.Ambos os serviços HFS se vinculam apenas ao loopback do host; o callback não publica nenhuma porta.
O laboratório cria um administrador sintético porque loginSrp1 deve ser invocado para um
nome de usuário existente; a senha não é conhecida nem usada pelo exploit.
Os requisitos são Docker com Compose, Python 3.10 ou mais recente e curl.
./verify.sh
O verificador remove apenas lab/runtime/vulnerable e lab/runtime/fixed,
inicia ambas as imagens fixadas por digest, executa os controles positivo e negativo e
para os contêineres por padrão. Use KEEP_LAB=1 ./verify.sh para deixar o laboratório
em execução para inspeção.
Com o laboratório mantido, a invocação direta do marcador benigno é:
python3 cve-2026-61500-poc.py \
--target http://127.0.0.1:28182 \
--marker cve-2026-61500-rce-marker.txt
Para demonstrar a execução de comandos dentro do contêiner de laboratório controlado:
python3 cve-2026-61500-poc.py \
--target http://127.0.0.1:28182 \
--command 'id > /data/cve-command-output.txt'
Qualquer hostname que não seja loopback, alvo HTTPS ou IP remoto é rejeitado pela validação
de argumentos. O exploit modifica o server_code do HFS; use apenas o laboratório descartável
ou um sistema para o qual você tenha autorização explícita.
A demo gravada vai um passo além: demo.sh inicia o serviço callback não exposto
na rede Compose e usa --command para conectar um reverse shell Bash a ele. O callback
envia apenas id, uname -a, pwd e exit, registra a transcrição em lab/runtime/
(ignorado) e encerra. Nenhuma porta de callback é vinculada ao host.
A execução real de 2026-09-26 recuperou um estado do PRNG e sua chave de assinatura, recebeu
HTTP 200 para um get_config administrativo forjado, instalou o payload de marcador
e observou CVE_2026_61500_RCE_CONFIRMED no contêiner vulnerável. Um controle separado
--command 'id > /data/cve-command-output.txt' produziu
uid=0(root) gid=0(root) groups=0(root) dentro desse contêiner oficial. O reverse shell
gravado, apenas em Docker, retornou independentemente a mesma identidade root
e o diretório de trabalho /data. Contra
3.2.1, a primeira resposta de login continha um UUID opaco e o PoC saiu com
status 3 antes de tentar a falsificação de sessão. Veja
docs/example-output.txt e
docs/e2e-results.json.
Em 2026-09-26, buscas exatas por CVE e por exploit/PoC foram executadas no SearchSploit (índice local do Exploit-DB), resultados web indexados pelo GitHub, Packet Storm, Exploit-DB e na web em geral. Nenhum exploit público funcional foi identificado nesse momento; os resultados encontraram apenas metadados de CVE/aviso e páginas de rastreamento de exploits. Este é um resultado datado e de melhor esforço, não uma afirmação de que nenhum exploit possa existir em outro lugar ou aparecer depois.
<[email protected]>
(Twitter: @aramosf).Apenas para pesquisa de segurança autorizada, validação defensiva e educação. Você é responsável por obter permissão e cumprir a legislação aplicável.
--command