
CVE-2022-0847 का शोषण - लेखक: एंटोनियस (w1sdom)
डर्टी पाइप (CVE-2022-0847) लिनक्स कर्नेल 5.8 – 5.15.24 में सबसे महत्वपूर्ण सुरक्षा कमजोरियों में से एक है, जिसे 2022 में मैक्स केलरमैन ने खोजा था। यह कमजोरी सामान्य उपयोगकर्ताओं (बिना विशेष विशेषाधिकारों के) को उन फाइलों में डेटा को अधिलेखित करने की अनुमति देती है जो केवल-पढ़ने योग्य होनी चाहिए। मुख्य अवधारणाओं को समझना
डर्टी पाइप पर विस्तार से चर्चा करने से पहले, यहाँ कुछ लिनक्स कर्नेल आंतरिक अवधारणाएँ हैं जिन्हें समझने की आवश्यकता है:
1. पेजिंग
पेजिंग लिनक्स कर्नेल में एक मेमोरी प्रबंधन तंत्र है जहाँ मेमोरी सिस्टम भौतिक मेमोरी को पेज फ्रेम नामक निश्चित आकार के छोटे ब्लॉकों में विभाजित करता है, और वर्चुअल मेमोरी को समान आकार के ब्लॉकों में विभाजित किया जाता है जिन्हें पेज कहा जाता है।
यह तंत्र कर्नेल को प्रक्रियाओं के वर्चुअल एड्रेस स्पेस को भौतिक मेमोरी में एक गैर-अनुक्रमिक तरीके से मैप करने की अनुमति देता है, जो आधुनिक सिस्टम में दक्षता और सुरक्षा के लिए महत्वपूर्ण है।
2. पेज (वर्चुअल मेमोरी)
लिनक्स में, एक पेज कर्नेल द्वारा प्रबंधित भौतिक मेमोरी की सबसे छोटी इकाई है।
सादृश्य: RAM एक विशाल पुस्तक की तरह है। एक पेज उस पुस्तक में कागज की एक शीट है। कर्नेल डेटा को बिट दर बिट नहीं हिलाता है, बल्कि शीट दर शीट (पेज दर पेज) हिलाता है।
आम तौर पर, आधुनिक सिस्टम आर्किटेक्चर (जैसे x86_64) पर, एक पेज का मानक आकार 4 KB (4096 बाइट्स) होता है।
3. पेज कैशे
यह एक महत्वपूर्ण भाग है। Linux हर बार डिस्क से सीधे फ़ाइलें नहीं पढ़ता क्योंकि यह धीमा है। कर्नेल फ़ाइल सामग्री को RAM में कॉपी करता है जिसे पेज कैशे कहा जाता है।
4. पाइप बफर
पाइप एक इंटर-प्रोसेस कम्युनिकेशन (IPC) तंत्र है। आंतरिक रूप से, कर्नेल पाइप को pipe_inode_info डेटा संरचना का उपयोग करके प्रबंधित करता है। पाइप के अंदर डेटा एक "बफर" में संग्रहीत होता है जिसे पाइप बफर कहा जाता है।
5. पाइप बफर फ़्लैग (PIPE_BUF_FLAG_CAN_MERGE)
PIPE_BUF_FLAG_CAN_MERGE फ़्लैग लिनक्स कर्नेल संस्करण 5.8 में पेश किया गया था।
यहीं मुख्य कमजोरी निहित है। इस फ़्लैग का नाम PIPE_BUF_FLAG_CAN_MERGE है।
6. स्प्लिस
splice() दो फ़ाइल डिस्क्रिप्टर के बीच कर्नेल स्पेस और यूज़र स्पेस के बीच डेटा को कॉपी किए बिना स्थानांतरित करने के लिए एक syscall है। इसे अक्सर जीरो-कॉपी तंत्र के रूप में जाना जाता है।
splice() syscall डर्टी पाइप में "मुख्य अभिनेता" है:
7. कॉपी ऑन राइट (CoW)
कॉपी-ऑन-राइट (CoW) तंत्र एक मेमोरी प्रबंधन ऑप्टिमाइज़ेशन रणनीति है जिसका उपयोग लिनक्स कर्नेल द्वारा डेटा कॉपी करने में तब तक देरी करने के लिए किया जाता है जब तक कि यह बिल्कुल आवश्यक न हो।
कॉपी-ऑन-राइट (CoW) और डर्टी पाइप एक्सप्लॉइट (CVE-2022-0847) के बीच संबंध यह है कि लिनक्स कर्नेल में एक छोटी सी बग CoW तंत्र को सफलतापूर्वक "धोखा" देती है, जिससे उन फ़ाइलों में डेटा लिखा जा सकता है जो केवल-पढ़ने योग्य होनी चाहिए।
8. डर्टी पेज
डर्टी पेज RAM में एक मेमोरी पेज है जिसे किसी एप्लिकेशन द्वारा संशोधित किया गया है, लेकिन परिवर्तन अभी तक सेकेंडरी स्टोरेज (जैसे SSD या हार्ड डिस्क) पर वापस नहीं लिखे गए हैं।
डर्टी पाइप कमजोरी का विश्लेषण
डर्टी पाइप लिनक्स कर्नेल 5.8 से लिनक्स कर्नेल 5.15.24 में पाइप बफर हैंडलिंग में एक प्रकार का लॉजिक बग है। मुख्य समस्या पाइप तंत्र (इंटर-प्रोसेस कम्युनिकेशन चैनल) और कर्नेल द्वारा पेज कैशे (मेमोरी जो डिस्क से फ़ाइल डेटा की प्रतियाँ संग्रहीत करता है) के प्रबंधन में निहित है। मुख्य मुद्दा PIPE_BUF_FLAG_CAN_MERGE फ़्लैग में एक बग है।
मुख्य समस्या इस फ़्लैग को ठीक से पुनः आरंभ करने में कर्नेल की विफलता (लॉजिक बग) में निहित है। यहाँ कोड विश्लेषण है: लिनक्स कर्नेल संस्करण 5.16.11 से पहले copy_page_to_iter_pipe और push_to_pipe फ़ंक्शन में, splice संचालन करते समय, कर्नेल pipe_buffer संरचना तैयार करता है लेकिन .flags सदस्य को साफ़ करना भूल जाता है।
कमजोर कोड संरचना:
// समस्या का स्थान: fs/pipe.c या include/linux/pipe_fs_i.h
struct pipe_buffer {
struct page *page;
unsigned int offset, len;
const struct pipe_buf_operations *ops;
unsigned int flags; // <--- यह फ़्लैग रीसेट नहीं होता
unsigned long private;
};
पैच से पहले कोड (कमजोर):
// lib/iov_iter.c - CVE-2022-0847 पैच से पहले
static size_t copy_page_to_iter_pipe(struct page *page,
size_t offset, size_t bytes, struct iov_iter *i) {
// ---------snip-----------
struct pipe_buffer *buf = &pipe->bufs[head & mask];