
CVE-2024-21626 के लिए प्रूफ-ऑफ-कॉन्सेप्ट, एक runc कंटेनर एस्केप भेद्यता। इसमें सत्यापन स्क्रिप्ट, दो शोषण विधियाँ (cron रिवर्स शेल और कमांड प्रतिस्थापन), और मूल कारण और पैच का विश्लेषण शामिल है।
| भेद्यता का नाम | docker runc एस्केप भेद्यता |
|---|---|
| भेद्यता संख्या | CVE-2024-21626 |
| प्रकटीकरण तिथि | 2024-01-31 |
| विशेषता | / |
| प्रभावित संस्करण | runc @ [v1.0.0-rc93,1.1.11] |
उपयोग की शर्तें थोड़ी कठोर हैं, पीड़ित के इंटरैक्शन की आवश्यकता है, व्यक्तिगत रूप से मुझे लगता है कि यह थोड़ा बेकार है:
भेद्यता अस्तित्व सत्यापन और डिस्क्रिप्टर प्राप्त करना:
git clone https://github.com/V0WKeep3r/CVE-2024-21626-runcPOC.git
cd CVE-2024-21626-runcPOC
bash verify.sh
जैसा कि नीचे चित्र में दिखाया गया है, भेद्यता मौजूद है, और फ़ाइल डिस्क्रिप्टर /proc/self/fd8 है
verify.sh वर्तमान मशीन वातावरण में संबंधित fd का विशिष्ट मान खोज सकता है। यदि fd 8 नहीं है, तो Dockerfile में WORKDIR को संबंधित मान में संशोधित करें या docker run में -w का उपयोग करें।
एस्केप/एलिवेशन सत्यापन: मैं यहाँ अधिक व्यावहारिक हूँ, poc.sh टाइमर टास्क (cron job) का उपयोग करके रिवर्स शेल प्राप्त करता है। poc2.sh कमांड प्रतिस्थापन विधि का उपयोग करता है (ध्यान दें, इस विधि का उपयोग करने से पहले फ़ाइलों का बैकअप लें ताकि बाद में फ़ाइलों को पुनर्स्थापित करना मुश्किल न हो)।
# 需要确认定时任务文件存在,不存在可以创建写,但是那样不能触发定时任务
# 只有crontab -e创建的,在crontab组的文件才会被定时执行。
docker build . -t poc1
docker run -it --rm poc1 bash /poc.sh

POC2:
docker build . -t poc2
docker run -it --rm poc2 bash /poc.sh
# 另起一个terminal
/bin/bash.copy

पूरी तरह से समझ में नहीं आया, लेकिन पैच के साथ मिलाकर मोटा-मोटा समझ आ सकता है।
docker exec या docker run की प्रक्रिया के दौरान runc का execve फ़ंक्शन कॉल किया जाता है, लेकिन runc exec के दौरान, fd फ़ाइल डिस्क्रिप्टर को बंद नहीं किया जाता है, जिससे होस्ट मशीन के फ़ाइल डिस्क्रिप्टर एक साथ कंटेनर वातावरण में लीक हो जाते हैं। उपयोगकर्ता इस फ़ाइल डिस्क्रिप्टर के माध्यम से होस्ट मशीन की फ़ाइलों को पढ़ और लिख सकता है, जिससे कंटेनर एस्केप पूरा होता है।
सुधार योजना runc को 1.12 या उससे ऊपर के संस्करण में अपग्रेड करें। runc आधिकारिक लिंक: https://github.com/opencontainers/runc/releases
पैच विश्लेषण
diff कमिट: https://github.com/opencontainers/runc/commit/2a4ed3e75b9e80d93d1836a9c4c1ebfa2b78870e
execve से पहले आंतरिक fds को तुरंत बंद करें
init_linux.go, chdir के बाद सत्यापित करें कि cwd (वर्तमान कार्य निर्देशिका) कंटेनर के अंदर है या नहीं
