
लिनक्स कर्नेल FUSE readdir कैश आउट-ऑफ-बाउंड राइट (CVE-2026-31694): एक दुर्भावनापूर्ण FUSE सर्वर 24 बाइट्स द्वारा पेज-कैश पेज को ओवरफ्लो करता है। PoC के साथ-साथ /etc/passwd पेज-कैश भ्रष्टाचार के माध्यम से एक अविशेषाधिकार प्राप्त स्थानीय-रूट शोषण। केवल VM के अंदर चलाएँ।
fs/fuse/readdir.c:fuse_add_dirent_to_cache() में एक गुम बाउंड्स चेक। एक FUSE सर्वर namelen = 4095 के साथ एक dirent लौटाता है, जो 4120-बाइट रिकॉर्ड में सीरियलाइज़ होता है। कर्नेल इसे एक एकल 4096-बाइट पेज-कैश पेज में कॉपी करता है और अगले भौतिक पेज में 24 सर्वर-नियंत्रित बाइट्स ओवरफ्लो करता है।
इस रिपॉजिटरी में राइट प्रिमिटिव के लिए एक मार्कर PoC और एक स्थानीय विशेषाधिकार वृद्धि है जो ओवरफ्लो को /etc/passwd की पेज-कैच कॉपी पर ग्रूम करती है और रूट को पासवर्डलेस खाते में बदल देती है।
FUSE_NAME_MAX को PATH_MAX - 1 तक बढ़ाने से readdir पथ पहुंच योग्य हो गया)51a8de6c50bf9 "fuse: oversized dirents को पेज कैश में अस्वीकार करें" (पाँच स्थिर बैकपोर्ट्स में से एक)ओवरफ्लो एक कर्नेल राइट है जो FUSE कैश पेज के ठीक बाद वाले किसी भी भौतिक पेज में होता है। ग्रूमिंग उस राइट को एक चुने गए पेज पर लक्षित करती है, लेकिन यह प्रोबेबिलिस्टिक है। मिस होने पर 24 बाइट्स किसी असंबंधित पेज पर पड़ सकती हैं:
इसे केवल एक डिस्पोजेबल VM के अंदर चलाएँ। यहाँ स्क्रिप्ट हमेशा QEMU/KVM के अंदर एक्सप्लॉइट चलाती हैं, होस्ट पर कभी नहीं।
exploit.c the PoC and LPE (single file, static build)
Makefile builds ./exploit (static)
vm/config.sh all paths and settings (edit KERNEL_TREE)
vm/make_rootfs.sh build the Ubuntu 24.04 guest image (run as root)
vm/build_vuln_kernel.sh build a vulnerable bzImage from your kernel tree
vm/run_vm.sh boot the guest headless
vm/provision_guest.sh in-guest setup (runs over ssh)
vm/run_in_vm.sh one command: boot, provision, run, verify
होस्ट: Linux जिसमें KVM (/dev/kvm मौजूद हो, आपका उपयोगकर्ता kvm समूह में), और:
qemu-system-x86_64, sshpass, gcc, makemake_rootfs.sh के लिए: debootstrap (और रूट)आपको एक कमजोर कर्नेल बनाने के लिए Linux कर्नेल स्रोत ट्री की भी आवश्यकता है।
vm/config.sh संपादित करें। एकमात्र मान जो आपको सेट करना है वह है KERNEL_TREE: एक Linux स्रोत चेकआउट का पथ। फिक्स 51a8de6c50bf9 से पहले के रिवीज़न का उपयोग करें (किसी भी 6.15..7.0 चेकआउट में बग है)। यदि ट्री में पहले से ही फिक्स है, तो build_vuln_kernel.sh बिल्ड के लिए गार्ड को हटा देता है और बाद में फ़ाइल को पुनर्स्थापित करता है। बाकी सब कुछ (मेमोरी, CPUs, ssh पोर्ट, इमेज पथ) का एक डिफ़ॉल्ट है जिसे आप छोड़ सकते हैं। किसी भी मान को पर्यावरण से भी सेट किया जा सकता है, उदाहरण के लिए KERNEL_TREE=/path/to/linux vm/run_in_vm.sh।
गेस्ट इमेज बनाएँ (Ubuntu 24.04, debootstrap के लिए रूट की आवश्यकता है):
sudo vm/make_rootfs.sh
यह एक test:test sudo उपयोगकर्ता, एक सीरियल कंसोल, ssh पासवर्ड प्रमाणीकरण और fuse3 बनाता है।
कमजोर कर्नेल बनाएँ:
vm/build_vuln_kernel.sh
एंड-टू-एंड (बूट, प्रोविज़न, मार्कर PoC, LPE, uid 0 सत्यापित करें):
vm/run_in_vm.sh
मैन्युअल:
vm/run_vm.sh & # बिना हेड बूट करें; कंसोल vm/serial.log पर जाता है
make # स्टैटिक एक्सप्लॉइट बनाएँ
# ./exploit को गेस्ट में कॉपी करें, फिर test उपयोगकर्ता के रूप में:
./exploit --poc -n 20 # मार्कर टेस्ट
./exploit # वार्मअप, फिर LPE
VM रोकें:
pkill -f bzImage-fuse-vuln
--poc केवल मार्कर मोड, /etc/passwd में कोई बदलाव नहीं
-n N राउंड की संख्या
(कोई आर्ग) 5 वार्मअप राउंड, फिर 200 LPE प्रयास तक; सफलता पर यह /etc/passwd में एक पासवर्डलेस रूट लाइन लिखता है और कैश छोड़ देता है
मार्कर मोड प्रति-राउंड हिट और कुल प्रिंट करता है, उदाहरण के लिए 20/20 (100.0%)।
LPE मोड Warmup: 5/5 प्रिंट करता है, फिर एक LPE n/200 ... HIT! लाइन, /etc/passwd की पहली पंक्ति को root:x:0:0:root:/root:/bin/bash से root::0:0:root:/root:/bin/sh में बदलता है, और उसके बाद एक खाली पासवर्ड के साथ su -s /bin/sh root uid 0 लौटाता है।
readdir कैश पथ प्रत्येक dirent को पेज-कैश पेज में कॉपी करता है। साइज़ चेक केवल यह पूछता है कि क्या dirent वर्तमान पेज के बचे हुए स्थान में फिट बैठता है; यह कभी नहीं पूछता कि क्या dirent किसी भी पेज में फिट बैठता है। namelen = 4095 के साथ रिकॉर्ड 4120 बाइट्स का होता है, इसलिए कॉपी एक नए पेज के अंत से 24 बाइट्स आगे चलती है।
एक्सप्लॉइट प्रति-CPU पेज (PCP) फ्रीलिस्ट को खाली करता है ताकि आवंटक बडी स्प्लिट से भौतिक रूप से आसन्न पेज दे, फिर readdir कैश पेज और एक पीड़ित पेज को पड़ोसी बनाने की व्यवस्था करता है। LPE के लिए पीड़ित /etc/passwd की पेज-कैश कॉपी है: 24-बाइट ओवरफ्लो रूट की लाइन को फिर से लिखता है ताकि उसका पासवर्ड फ़ील्ड खाली हो, और PAM nullok (Ubuntu डिफ़ॉल्ट) के साथ su root तब खाली पासवर्ड से सफल होता है।
पूर्ण लेख: https://cyberstan.co.uk/fuse-readdir-oob/
Qi Tang और Zijun Hu द्वारा अपस्ट्रीम को रिपोर्ट किया गया; फिक्स Samuel Page द्वारा लिखा गया। मैंने इसे स्वतंत्र रूप से पाया और रिपोर्ट किया। अपस्ट्रीम क्रेडिट और CVE-2026-31694 उनका है। बग मेनलाइन और स्थिर ट्री में फिक्स हो गया है।
MIT, देखें LICENSE। केवल शिक्षा और अधिकृत परीक्षण के लिए।