9.9 KiB
IPC Namespace
{{#include ../../../../banners/hacktricks-training.md}}
Basic Information
IPC (Inter-Process Communication) namespace एक Linux kernel विशेषता है जो system V IPC वस्तुओं जैसे संदेश कतारें, साझा मेमोरी खंड, और सेमाफोर का अलगाव प्रदान करती है। यह अलगाव सुनिश्चित करता है कि विभिन्न IPC namespaces में प्रक्रियाएँ एक-दूसरे की IPC वस्तुओं को सीधे एक्सेस या संशोधित नहीं कर सकतीं, जो प्रक्रिया समूहों के बीच सुरक्षा और गोपनीयता की एक अतिरिक्त परत प्रदान करता है।
How it works:
- जब एक नया IPC namespace बनाया जाता है, तो यह system V IPC वस्तुओं का पूरी तरह से अलग सेट के साथ शुरू होता है। इसका मतलब है कि नए IPC namespace में चल रही प्रक्रियाएँ डिफ़ॉल्ट रूप से अन्य namespaces या होस्ट सिस्टम में IPC वस्तुओं को एक्सेस या हस्तक्षेप नहीं कर सकतीं।
- एक namespace के भीतर बनाई गई IPC वस्तुएँ केवल उस namespace के भीतर की प्रक्रियाओं के लिए दृश्य और सुलभ होती हैं। प्रत्येक IPC वस्तु को अपने namespace के भीतर एक अद्वितीय कुंजी द्वारा पहचाना जाता है। हालांकि कुंजी विभिन्न namespaces में समान हो सकती है, वस्तुएँ स्वयं अलग हैं और namespaces के बीच एक्सेस नहीं की जा सकतीं।
- प्रक्रियाएँ
setns()सिस्टम कॉल का उपयोग करके namespaces के बीच स्थानांतरित हो सकती हैं याunshare()याclone()सिस्टम कॉल का उपयोग करके नए namespaces बना सकती हैं जिसमेंCLONE_NEWIPCफ्लैग होता है। जब एक प्रक्रिया एक नए namespace में जाती है या एक बनाती है, तो यह उस namespace से संबंधित IPC वस्तुओं का उपयोग करना शुरू कर देगी।
Lab:
Create different Namespaces
CLI
sudo unshare -i [--mount-proc] /bin/bash
एक नए /proc फ़ाइल सिस्टम के उदाहरण को माउंट करके, यदि आप पैरामीटर --mount-proc का उपयोग करते हैं, तो आप सुनिश्चित करते हैं कि नया माउंट नामस्थान उस नामस्थान के लिए विशिष्ट प्रक्रिया जानकारी का सटीक और अलग दृश्य रखता है।
त्रुटि: bash: fork: मेमोरी आवंटित नहीं कर सकता
जब unshare को -f विकल्प के बिना निष्पादित किया जाता है, तो लिनक्स नए PID (प्रक्रिया आईडी) नामस्थान को संभालने के तरीके के कारण एक त्रुटि उत्पन्न होती है। मुख्य विवरण और समाधान नीचे दिए गए हैं:
- समस्या का विवरण:
- लिनक्स कर्नेल एक प्रक्रिया को
unshareसिस्टम कॉल का उपयोग करके नए नामस्थान बनाने की अनुमति देता है। हालाँकि, नई PID नामस्थान बनाने की प्रक्रिया (जिसे "unshare" प्रक्रिया कहा जाता है) नए नामस्थान में प्रवेश नहीं करती है; केवल इसकी बाल प्रक्रियाएँ करती हैं। %unshare -p /bin/bash%चलाने से/bin/bashउसी प्रक्रिया में शुरू होता है जैसेunshare। परिणामस्वरूप,/bin/bashऔर इसकी बाल प्रक्रियाएँ मूल PID नामस्थान में होती हैं।- नए नामस्थान में
/bin/bashकी पहली बाल प्रक्रिया PID 1 बन जाती है। जब यह प्रक्रिया समाप्त होती है, तो यह नामस्थान की सफाई को ट्रिगर करती है यदि कोई अन्य प्रक्रियाएँ नहीं हैं, क्योंकि PID 1 का अनाथ प्रक्रियाओं को अपनाने की विशेष भूमिका होती है। लिनक्स कर्नेल तब उस नामस्थान में PID आवंटन को अक्षम कर देगा।
- परिणाम:
- नए नामस्थान में PID 1 का समाप्त होना
PIDNS_HASH_ADDINGध्वज की सफाई की ओर ले जाता है। इसका परिणाम यह होता है कि नए प्रक्रिया बनाने के समयalloc_pidफ़ंक्शन नए PID को आवंटित करने में विफल रहता है, जिससे "Cannot allocate memory" त्रुटि उत्पन्न होती है।
- समाधान:
- समस्या को
unshareके साथ-fविकल्प का उपयोग करके हल किया जा सकता है। यह विकल्पunshareको नए PID नामस्थान बनाने के बाद एक नई प्रक्रिया बनाने के लिए मजबूर करता है। %unshare -fp /bin/bash%निष्पादित करने से यह सुनिश्चित होता है किunshareकमांड स्वयं नए नामस्थान में PID 1 बन जाता है।/bin/bashऔर इसकी बाल प्रक्रियाएँ फिर इस नए नामस्थान में सुरक्षित रूप से समाहित होती हैं, PID 1 के पूर्व समय में समाप्त होने को रोकती हैं और सामान्य PID आवंटन की अनुमति देती हैं।
यह सुनिश्चित करके कि unshare -f ध्वज के साथ चलता है, नया PID नामस्थान सही ढंग से बनाए रखा जाता है, जिससे /bin/bash और इसकी उप-प्रक्रियाएँ बिना मेमोरी आवंटन त्रुटि का सामना किए कार्य कर सकती हैं।
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
जांचें कि आपका प्रोसेस किस नेमस्पेस में है
ls -l /proc/self/ns/ipc
lrwxrwxrwx 1 root root 0 Apr 4 20:37 /proc/self/ns/ipc -> 'ipc:[4026531839]'
सभी IPC नामस्थान खोजें
sudo find /proc -maxdepth 3 -type l -name ipc -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name ipc -exec ls -l {} \; 2>/dev/null | grep <ns-number>
IPC नामस्थान के अंदर प्रवेश करें
nsenter -i TARGET_PID --pid /bin/bash
आप केवल दूसरे प्रक्रिया नामस्थान में प्रवेश कर सकते हैं यदि आप रूट हैं। और आप दूसरे नामस्थान में प्रवेश नहीं कर सकते बिना एक वर्णनकर्ता जो इसे इंगित करता है (जैसे /proc/self/ns/net)।
IPC ऑब्जेक्ट बनाएं
# Container
sudo unshare -i /bin/bash
ipcmk -M 100
Shared memory id: 0
ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x2fba9021 0 root 644 100 0
# From the host
ipcs -m # Nothing is seen
संदर्भ
{{#include ../../../../banners/hacktricks-training.md}}