
CVE-2014-0038 के लिए Linux लोकल रूट एक्सप्लॉइट
X86_X32 recvmmsg सिस्टम कॉल, उपयोगकर्ता स्पेस से पारित टाइमआउट पॉइंटर को ठीक से सैनिटाइज़ नहीं करता है।
recvmmsg के लिए टाइमआउट के रूप में कर्नेल एड्रेस पर एक पॉइंटर पास करें, यदि उस एड्रेस पर मूल बाइट ज्ञात है, तो इसे ज्ञात डेटा से ओवरराइट किया जा सकता है। यदि सबसे कम महत्वपूर्ण बाइट 0xff है, तो 255 सेकंड प्रतीक्षा करने पर यह 0x00 में बदल जाएगा।
पास किए गए एड्रेस पर पहला लॉन्ग (tv_sec) सकारात्मक होना चाहिए और दूसरा लॉन्ग (tv_nsec) 1000000000 से छोटा होना चाहिए।
गैर-आरंभित (और इस प्रकार लिखने योग्य) कर्नेल मेमोरी में स्थित ptmx_fops संरचना के रिलीज़ फ़ंक्शन पॉइंटर को लक्षित करें। तीन सबसे महत्वपूर्ण बाइट को शून्य करें और इस प्रकार इसे उपयोगकर्ता स्पेस में मैप करने योग्य एड्रेस के पॉइंटर में बदल दें। रिलीज़ पॉइंटर का उपयोग किया जाता है क्योंकि इसके बाद 16 0x00 बाइट होते हैं (इसलिए tv_nsec मान्य है)। /dev/ptmx खोलें, इसे बंद करें और आनंद लें।
बहुत सुंदर नहीं है लेकिन यदि प्रतीकों को हल किया जा सकता है तो काफी विश्वसनीय होना चाहिए।
Ubuntu 13.10 पर परीक्षण किया गया
यह भी देखें http://blog.includesecurity.com/2014/03/exploit-CVE-2014-0038-x32-recvmmsg-kernel-vulnerablity.html
/proc/kallsyms से पते प्राप्त करें और शोषण चलाएं:
./build.sh && ./timeoutpwn
यदि आप रिमोट सर्वर के लिए बाइनरी बनाना चाहते हैं, तो यह प्रयास करें:
ssh user@host 'cat /proc/kallsyms' > syms.txt
CFLAGS=-static ./build.sh syms.txt
scp timeoutpwn user@host:
...
यदि ptmx_fops kallsyms में नहीं मिलता है, तो इसे हेडर पैकेज (Arch Linux पर linux-headers) के साथ प्रदान किए गए vmlinux से निकालने का प्रयास करें:
nm /lib/modules/$(uname -r)/build/vmlinux > syms.txt