
CVE-2022-0847 (Dirty Pipe) का उपयोग करके कंटेनर एस्केप प्राप्त करना
CVE-2022-0847 का उपयोग कंटेनर escape प्राप्त करने के लिए किया जाता है (होस्ट पर किसी भी केवल-पढ़ने योग्य फ़ाइलों को अधिलेखित करना)
अंग्रेज़ी में स्लाइड्स यहाँ उपलब्ध हैं
利用CVE-2022-0847 (Dirty Pipe) 实现容器逃逸(效果为覆写宿主机上任意只读文件)
中文汇报PPT在这里
यदि कर्नेल CVE-2022-0847 के लिए असुरक्षित है, तो हमलावर केवल-पढ़ने योग्य फ़ाइलों को अधिलेखित कर सकता है (गैर-स्थायी! अधिक जानकारी के लिए https://dirtypipe.cm4all.com/ देखें)। हालांकि, कंटेनर केवल कंटेनर के अंदर की फ़ाइलों तक ही पहुंच सकता है। सौभाग्य से, जब CAP_DAC_READ_SEARCH प्रदान किया जाता है, तो हमलावर होस्ट पर फ़ाइलों को अधिलेखित कर सकता है!
जैसा कि https://dirtypipe.cm4all.com/ बताता है, किसी केवल-पढ़ने योग्य फ़ाइल को अधिलेखित करने के लिए, हमें इसे splice() के माध्यम से पाइप में भेजना होगा। splice() का उपयोग करने के लिए, हमें पहले लक्ष्य फ़ाइल को O_RDONLY फ़्लैग के साथ खोलना होगा ताकि एक फ़ाइल डिस्क्रिप्टर प्राप्त हो सके।
तब मेरे दिमाग में CAP_DAC_READ_SEARCH आया। Linux मैनुअल के अनुसार, जब CAP_DAC_READ_SEARCH प्रदान किया जाता है, तो कंटेनर के अंदर का हमलावर यह कर सकता है:
open_by_handle_at(2) को आह्वान करनाक्षमता CAP_DAC_READ_SEARCH के साथ, हम होस्ट फ़ाइलसिस्टम को खोज सकते हैं और open_by_handle_at(2) का उपयोग करके कंटेनर से होस्ट पर किसी भी फ़ाइल को केवल-पढ़ने के लिए खोल सकते हैं, जिससे उसका फ़ाइल डिस्क्रिप्टर प्राप्त होता है (अधिक जानकारी के लिए http://stealth.openwall.net/xSports/shocker.c देखें)।
अब जब हमारे पास होस्ट पर लक्ष्य फ़ाइल का फ़ाइल डिस्क्रिप्टर है, तो हम निश्चित रूप से splice() का उपयोग करके लक्ष्य फ़ाइल की सामग्री को पाइप में भेज सकते हैं, और फिर उसे अधिलेखित कर सकते हैं!
cp /etc/password . # back up /etc/password
gcc dp.c -o dp
docker run --rm -it -v $(pwd):/exp --cap-add=CAP_DAC_READ_SEARCH ubuntu
/exp/dp /etc/passwd 1 ootz: # overwrite /etc/password on host from offset 1
/etc/dp /etc/passwd # dump /etc/passwd on host
सबसे पहले, होस्ट पर रूट उपयोगकर्ता द्वारा एक केवल-पढ़ने योग्य फ़ाइल /home/vagrant/flag.txt बनाएं, जिसकी सामग्री hello world है:

फिर, क्षमता CAP_DAC_READ_SEARCH के साथ एक कंटेनर शुरू करें, पहले होस्ट पर /home/vagrant/flag.txt को डंप करने का प्रयास करें, हमें hello world मिलता है:

फिर लक्ष्य फ़ाइल को ऑफ़सेट 1 से abcdefghij सामग्री के साथ अधिलेखित करने का प्रयास करें:

लक्ष्य फ़ाइल को फिर से डंप करें, अब सामग्री habcdefghij है! कंटेनर से बाहर निकलें और होस्ट पर /home/vagrant/flag.txt की जाँच करें, इसकी सामग्री habcdefghij है।

हाँ, हमने कंटेनर से होस्ट पर एक फ़ाइल को अधिलेखित कर दिया!