
CVE-2026-89633 के लिए PoC और एक्सप्लॉइट चेन, जो Linux cifs.ko SMB1 TRANS2 कोएलेसिंग पाथ में हीप आउट-ऑफ-बाउंड्स राइट है, जो cred ओवरराइट और PTE एलियासिंग के माध्यम से uid 0 तक एस्केलेट होती है।
coalesce_t2 हीप OOB राइटअंग्रेज़ी | 简体中文
Linux cifs.ko SMB1 क्लाइंट में हीप आउट-ऑफ़-बाउंड्स राइट के लिए रिसर्च PoC/EXP। एक दुर्भावनापूर्ण SMB1 सर्वर TRANS2 सेकेंडरी रिस्पॉन्स में DataOffset को नियंत्रित करता है, और coalesce_t2() बिना किसी टारगेट-बाउंड्स जाँच के 8-बाइट सेकेंडरी पेलोड को &primary->Protocol + DataOffset + accumulated पर कॉपी करता है। कॉपी का गंतव्य वहीं होता है जहाँ सर्वर उसे इंगित करता है, रिस्पॉन्स बफ़र (server->bigbuf) के सापेक्ष।
यह रिपॉज़िटरी अलग-अलग भूमिकाओं वाले दो प्रदर्शन रखती है; वे एक-दूसरे के विकल्प नहीं हैं:
DataOffset को पैच करता है।uid/gid/suid/sgid/euid/egid/fsuid/fsgid को शून्य कर देता है। यह सबसे सीधा प्रमाण है कि OOB राइट नियंत्रणीय है और एक cred को संशोधित कर सकता है, सबसे कम निर्भरताओं के साथ।selinux_state को मैप करता है, और clone रूट-साइड अवलोकन के बिना पूर्ण caps के साथ uid 0 बन जाता है। यह EXP 1 का विस्तार है, प्रतिस्थापन नहीं।कर्नेल-मॉड्यूल लोडिंग इस रिपॉज़िटरी के दायरे से जानबूझकर बाहर है: श्रृंखला uid 0 (और वैकल्पिक रूप से selinux_state permissive) पर रुक जाती है और कोई मॉड्यूल इंस्टॉल नहीं करती। लोडेड मॉड्यूल के बिना भी, uid 0 + permissive वह पूर्ण LPE प्रदर्शन है जिसका दावा यह रिपॉज़िटरी करती है।
EXP 2 की लागतें स्पष्ट बनी हुई हैं: एक प्रति-विंडो लॉटरी (~25–33%, 12 प्रयासों में ~97–99%), एक बेयर PTE जो रीबूट तक लाइव रहता है, शेल-लेखन-योग्य tracefs पर निर्भरता, और बिल्ड-विशिष्ट direct-map/call-site/SEL_PFN मान्यताएँ। EXP 1 सबसे सरल प्रिमिटिव प्रमाण बना हुआ है और तब फ़ॉलबैक है जब शेल-लेखन-योग्य tracefs उपलब्ध न हो।
| आइटम | मान |
|---|---|
| CVE | CVE-2026-89633 |
| वर्ग | हीप आउट-ऑफ़-बाउंड्स राइट (CWE-787) |
| घटक | cifs.ko, SMB1 TRANS2 सेकेंडरी coalescing |
| अपस्ट्रीम फ़िक्स | 36d01415d881 ("smb: client: fix ... coalesce_t2", 6.12.113) |
| POC | ट्रिगर और OOB राइट सत्यापित (माउंट के बाद और माउंट के दौरान) |
| EXP 1 (न्यूनतम प्रिमिटिव) | रूट-साइड अवलोकन के अंतर्गत 4-फ़्रेम OOB cred राइट; uid 0 सत्यापित (माउंट के बाद और माउंट-समय पर होल्ड किया गया रिस्पॉन्स) |
| EXP 2 (उन्नत प्रिमिटिव) | केवल-शेल PTE श्रृंखला; uid 2000 → uid 0 + पूर्ण caps + Permissive सत्यापित (SEL_PFN/SEL_OFF); बेयर PTE पर रुकता है, कोई मॉड्यूल लोड नहीं |
| आवश्यकताएँ | हमलावर-नियंत्रित सर्वर पर SMB1 माउंट (विशेषाधिकार प्राप्त गेट); संदर्भ गेट su का उपयोग करता है, और केवल-शेल प्लेसमेंट के लिए शेल-लेखन-योग्य tracefs आवश्यक है |
परीक्षण किया गया वातावरण: एक arm64 Android 16 वेंडर बिल्ड, कर्नेल 6.12.38 जिसमें cifs.ko 6.12.23 KMI बेसलाइन से बनाया गया है, SELinux enforcing।
statfs नहीं, माउंट पॉइंट तक पहुँच नहीं), EXP 2 केवल-शेल प्लेसमेंट (केवल tracefs, कोई रूट-साइड अवलोकन नहीं), पूर्ण EXP 2 स्वीकृति (uid 0 + सभी cap बिट्स + SEL_PFN/SEL_OFF के साथ Permissive), और su-संचालित माउंट गेट (केवल माउंट रूट के रूप में चलता है; प्लेसमेंट uid 2000 के रूप में चलता है) का परीक्षण वहाँ SELinux enforcing के अंतर्गत किया गया।MAX_CIFS_SMALL_BUFFER_SIZE - 4 (444 बाइट्स) से बड़े SMB1 TRANS2 प्रतिक्रिया के लिए, क्लाइंट प्राइमरी को server->bigbuf में रखता है और उसे mid->resp_buf में संग्रहीत करता है। इसके बाद आने वाली SMB_COM_TRANSACTION2_SECONDARY प्रतिक्रियाएँ cifs_check_trans2() -> check2ndT2() -> coalesce_t2() से होकर गुज़रती हैं:
data_area_of_tgt = &primary->Protocol + primary->DataOffset + total_in_tgt;
memcpy(data_area_of_tgt, data_area_of_src, secondary->DataCount);
DataOffset सर्वर प्रतिक्रिया से शब्दशः लिया गया है। काउंटर जाँचें
(total_in_tgt/byte_count ओवरफ़्लो, स्रोत-बफ़र सीमाएँ) मौजूद हैं, लेकिन
इस बात की कोई जाँच नहीं है कि data_area_of_tgt प्रतिक्रिया बफ़र के अंदर
रहता है या नहीं। प्रत्येक सेकेंडरी फ़्रेम 8 बाइट आगे गिरता है (संचित
DataCount), इसलिए एक बहु-फ़्रेम प्रतिक्रिया बफ़र आधार से हमलावर-चयनित
ऑफ़सेट (16-बिट) पर 8*N बाइट लेखन देती है।
ट्रिगर शर्तें:
vers=1.0) जिसे हमलावर
नियंत्रित करता है;statfs के माध्यम से
QUERY_FS_INFORMATION का उपयोग करता है);TotalDataCount > DataCount
है और जो bigbuf पथ के लिए पर्याप्त बड़ा है, फिर एक या अधिक सेकेंडरी फ़्रेम
जिनमें TotalDataCount > DataCount है।Makefile
src/poc/poc_smb1_trans2.py malicious SMB1 server (QFS hook, runtime ctl)
src/poc/smb1_proxy.py TCP proxy: patches DataOffset, repeats secondaries
src/exp/pipesearch.c pipe placement/write driver (modes 3, 8, 9)
src/exp/shcred.c shell-side drain + clone helper (uid 2000)
src/exp/shp4a2.c trace-based drainer/observer/clone (modes 8/9)
src/exp/pte_fault.c 2 MiB fault + PTE alias writes
src/exp/bscan.c bigbuf discovery by call site (no kprobes)
src/exp/kslide.c KASLR slide from a raw call site
src/exp/smbd.c device-side SMB1 server (held TRANS2)
src/exp/smbd_templates.h SMB1 response templates for smbd
src/exp/pfn.c linear-map VA to pfn
src/exp/kflags.c /proc/kpageflags reader
scripts/setup_device.sh trace instance + kprobes (root on device)
scripts/start_servers.sh host: SMB1 server + proxy + mount helper
scripts/probe_round.sh one probe round: bigbuf base + free target page
scripts/place.sh placement: pipesearch mode 3 + shcred
scripts/write_cred.sh 4-frame coalesce write + /proc verification
scripts/mount_su.sh generic su mount gate (target/decoy/abort/unmount)
scripts/chain_shell.sh shell-only placement for an already-held TRANS2
scripts/gen_smb_templates.py regenerates smbd_templates.h from a capture
docs/analysis.md vulnerability and chain analysis
docs/exp-protocol.md shared-page and smbd ctl protocols
make deps # checks impacket
make helpers # NDK cross-build of all C helpers
make push # adb push to /data/local/tmp
NDK, API, ARCH, ADB, DEVICE_DIR को ओवरराइड किया जा सकता है।
ट्रिगर को स्वयं केवल SMB1 माउंट और चल रहे सर्वर/प्रॉक्सी की आवश्यकता होती है।
kprobes और kflags अवलोकन सहायक हैं, ट्रिगर का हिस्सा नहीं —
जब आपको dst/src/len साक्ष्य चाहिए तो इन्हें इंस्टॉल करें (और इनकी आवश्यकता नीचे दी गई
EXP श्रृंखला द्वारा होती है, जिसे bigbuf बेस, प्लेसमेंट वॉच और
लक्ष्य cred पता चाहिए)।
डिवाइस (root, वैकल्पिक — केवल अवलोकन): प्रोब्स इंस्टॉल करें।
adb push scripts/setup_device.sh /data/local/tmp/
adb shell su -c 'sh /data/local/tmp/setup_device.sh'
adb push build/kflags /data/local/tmp/kflags
होस्ट: SMB1 सर्वर और प्रॉक्सी प्रारंभ करें (स्क्रिप्ट शेयर निर्देशिका भी बनाती है और माउंट कमांड प्रिंट करती है):
scripts/start_servers.sh /tmp/cifs01-ctl