
CVE-2026-68398 Ubuntu PPPoL2TP use-after-free स्थानीय विशेषाधिकार वृद्धि

इस रिपॉज़िटरी में CVE-2026-68398 के लिए एक बिल्ड-विशिष्ट स्थानीय विशेषाधिकार-वृद्धि एक्सप्लॉइट है; यह एक use-after-free रेस है जो PPPoL2TP रिसीव प्रोसेसिंग और एक अनअटैच्ड PPP चैनल के विनाश के बीच होती है। इसे आधिकारिक Ubuntu 22.04 पैकेज linux-image-5.15.0-187-generic (5.15.0-187.197) के विरुद्ध QEMU में मान्य किया गया था।
अंतिम परीक्षण एक समर्पित UID 1001 उपयोगकर्ता के रूप में शुरू होता है जिसके पास कोई supplementary समूह, कोई कैपेबिलिटी और कोई sudo पहुँच नहीं होती, फिर यह initial-namespace UID 0 प्राप्त करता है। KASLR, SMEP, SMAP और AppArmor सक्षम बने रहते हैं। गेस्ट को nokaslr, nopti, nosmep या nosmap के साथ बूट नहीं किया गया है।
चेतावनी
यह कोड जानबूझकर कर्नेल हीप की स्थिति को दूषित करता है और एक सटीक Ubuntu कर्नेल बिल्ड से जुड़ा हुआ है। एक असफल रेस सिस्टम को पैनिक या दूषित कर सकती है। इसे केवल एक पृथक, डिस्पोज़ेबल VM में चलाएँ जिसके आप स्वामी हों।
pppol2tp_recv() L2TP UDP रिसीव पथ में RCU read-side क्रिटिकल सेक्शन के अंतर्गत निष्पादित होता है और अंततः ppp_input(&po->chan) को कॉल करता है। PPPoX सॉकेट और उसका एम्बेडेड ppp_channel RCU-सुरक्षित हैं, लेकिन ppp_input() द्वारा उपयोग किया जाने वाला आंतरिक struct channel एक अलग आवंटन है।
PPPIOCGCHAN के साथ बाउंड किए गए लेकिन न तो किसी PPP यूनिट से जुड़े और न ही ब्रिज किए गए चैनल के लिए, क्लोज़ पथ उस आंतरिक ऑब्जेक्ट को तुरंत मुक्त कर देता था:
RX: l2tp_udp_encap_recv -> pppol2tp_recv -> ppp_input(channel)
CLOSE: pppol2tp_release -> pppox_unbind_sock
-> ppp_unregister_channel -> ppp_release_channel -> kfree(channel)
परिणामस्वरूप रिसीव पथ मुक्त किए गए चैनल की skb कतार और waitqueue पर कार्य कर सकता है। फिक्स struct channel में एक RCU कॉलबैक जोड़ता है और कतार की शुद्धि और मुक्ति को RCU ग्रेस पीरियड बीत जाने तक स्थगित कर देता है।
इस भेद्यता की खोज और अपस्ट्रीम फिक्स Doyensec के Norbert Szetei द्वारा किया गया। मेनलाइन फिक्स ec4215683e47424c9c4762fd3c60f552a3119142 है।
Linux CNA रिकॉर्ड भेद्य लाइनेज की शुरुआत Linux 4.15 से बताता है। वेंडर कर्नेल फिक्स को भिन्न संस्करण संख्या के अंतर्गत रख सकते हैं, इसलिए सटीक स्रोत या पैकेज चेंजलॉग इस तालिका से अधिक प्राथमिकता रखता है।
पुरानी समर्थित वेंडर लाइनों के लिए बैकपोर्ट आवश्यक है। 2026-08-12 तक, Ubuntu CVE ट्रैकर Jammy के linux पैकेज को needs-triage के रूप में चिह्नित करता है; कोई सुधारित Ubuntu Jammy पैकेज पहचाना नहीं गया। परीक्षित 5.15.0-187.197 स्रोत अभी भी सीधे kfree(pch) को कॉल करता है और भेद्य है।
कर्नेल को पुनः संकलित नहीं किया गया था। न्यूनतम क्लाउड इमेज में linux-modules-extra-5.15.0-187-generic नहीं था, इसलिए l2tp_ppp प्रदान करने के लिए वह आधिकारिक Ubuntu पैकेज स्थापित किया गया। linux-generic मेटापैकेज का उपयोग करने वाली एक सामान्य Jammy स्थापना पहले से ही संबंधित modules-extra पैकेज पर निर्भर करती है। जब एक्सप्लॉइट अपना PPPoL2TP सॉकेट बनाता है तो प्रोटोकॉल मॉड्यूल स्वतः लोड हो जाता है।
स्वचालित KASLR डिटेक्टर एक x86 prefetch टाइमिंग साइड चैनल का उपयोग करता है और KPTI निष्क्रिय होने पर RDTSCP की आवश्यकता रखता है। परीक्षित होस्ट CPU rdtscp, smep और smap उजागर करता है और Meltdown से प्रभावित नहीं है, इसलिए Ubuntu बिना किसी बूट ओवरराइड के KPTI को निष्क्रिय छोड़ देता है। ऐसे CPU पर जहाँ /proc/cpuinfo pti फ्लैग रिपोर्ट करता है, डिटेक्टर चलने से मना कर देता है। यह एक एक्सप्लॉइट-विशिष्ट हार्डवेयर स्थिति है: अंतर्निहित CVE पहुँच योग्य बनी रहती है, लेकिन यह रिलीज़ KPTI-सक्रिय सिस्टम पर KASLR बाइपास का दावा नहीं करती। मैन्युअल रूप से प्रदान किया गया slide केवल नियंत्रित डायग्नोस्टिक्स के लिए मौजूद है।
struct channel को पुनः प्राप्त करता है। अभी भी चल रहा RX पथ नियंत्रित कुंजी बाइट्स को अपनी skb कतार और waitqueue के रूप में मानता है।core_pattern को खुलासा स्क्रैच के रूप में उपयोग करता है और एक कुंजी-आवंटन पॉइंटर उजागर करता है।override_creds() को कॉल करती है। UID/GID फ़ील्ड, कैपेबिलिटी और आवश्यक user, namespace, ucount और group पॉइंटर सटीक Ubuntu बिल्ड से मेल खाते हैं।/proc/self/exe को /tmp में एक अद्वितीय फ़ाइल में कॉपी करता है, उसे root-स्वामित्व वाली mode 4755 में बदलता है और उन विशेषताओं को सत्यापित करता है।/usr/bin/id निष्पादित करता है।अंतिम सेतु आवश्यक है क्योंकि override_creds() सक्रिय कर्नेल कार्य के लिए व्यक्तिपरक क्रेडेंशियल बदल देता है; सत्यापित SUID प्रति को स्थापित और निष्पादित करना उस अल्पकालिक प्रिमिटिव को सामान्य प्रक्रिया क्रेडेंशियल में बदल देता है।
Makefile एक्सप्लॉइट को स्थिर रूप से लिंक करता है। टाइमिंग-संवेदनशील prefetch ऑब्जेक्ट को जानबूझकर -O0 पर संकलित किया जाता है; एक्सप्लॉइट स्वयं -O2 का उपयोग करता है।
make
समतुल्य कमांड:
gcc -O0 -Wall -Wextra -Werror -c -o build/kaslr_prefetch.o kaslr_prefetch.c
gcc -O2 -static -pthread -Wall -Wextra -Werror \
-o build/CVE-2026-68398 exploit.c build/kaslr_prefetch.o
सटीक मान्य किए गए कर्नेल पर सामान्य उपयोगकर्ता खाते से:
id
grep '^Cap' /proc/self/status
./CVE-2026-68398 auto 60
स्रोत uname() की जाँच करता है और 5.15.0-187-generic के अलावा किसी भी रिलीज़ को अस्वीकार कर देता है। रेस प्रायिक है; मिस या क्रैश के बाद पुनः प्रयास करने से पहले एक डिस्पोज़ेबल स्नैपशॉट को रीबूट करें।
एक सफल रन इस प्रकार समाप्त होता है:
[KASLR] image_base=0xffffffffb9200000 slide=0x38200000
CVE-2026-68398 Ubuntu local privilege-escalation exploit
uid=1001 euid=1001 slide=0x38200000
...
[9/9] invoking override_creds and installing the SUID transition...
override callback: uid=0 euid=0 gid=0 egid=0
installed root-owned mode 4755 helper: /tmp/.cve-2026-68398-root-948
SUID helper ready; executing it from the original unprivileged task...
SUID transition: uid=0 euid=0 gid=0 egid=0
uid=0(root) gid=0(root) groups=0(root),1001(poc)
उस वास्तविक QEMU रन का पूरा संक्षिप्त ट्रांसक्रिप्ट docs/example-output.txt में है।
श्रृंखला तीन नए, सामान्यतः यादृच्छिकृत Ubuntu बूटों पर पूरी हुई। स्वचालित रूप से पुनः प्राप्त इमेज बेस 0xffffffff90800000, 0xffffffffa5a00000 और 0xffffffffb9200000 थे। अंतिम रन में ऊपर वर्णित समर्पित गैर-प्रशासनिक UID 1001 खाते का उपयोग किया गया, और सत्यापित किया गया कि अस्थायी SUID फ़ाइल बाद में हटा दी गई थी।
वही अंतिम रेस KASAN सक्षम और समान चार-vCPU टोपोलॉजी के साथ सटीक अपस्ट्रीम फिक्स कमिट पर भी 60 सेकंड के लिए चलाई गई। इसने 5,969 चैनल/कुंजी चक्र पूरे किए, stage 1: no controlled reclaim रिपोर्ट किया, और कोई KASAN रिपोर्ट या एक्सप्लॉइट चरण संक्रमण उत्पन्न नहीं किया।
इस निजी रिपॉज़िटरी के निर्माण से पहले 2026-08-12 को जाँचा गया। SearchSploit/Exploit-DB ने कोई एक्सप्लॉइट नहीं लौटाया; Packet Storm ने कोई मेल खाती फ़ाइल नहीं लौटाई; GitHub सटीक-कोड खोज ने 22 CVE/सलाहकार मिरर लौटाए और कोई PoC नहीं; और सटीक वेब खोजों में केवल अपस्ट्रीम फिक्स और मेटाडेटा मिला। यह एक समय-बिंदु परिणाम है, यह गारंटी नहीं कि बाद में कोई अन्य PoC प्रकट नहीं होगा।
kaslr_prefetch.c का आधार हैएक्सप्लॉइट A. Ramos <[email protected]> (Twitter: @aramosf) द्वारा लिखा गया। भेद्यता की खोज और अपस्ट्रीम फिक्स का श्रेय Norbert Szetei (Doyensec) को जाता है।
exploit.c केवल GPL-2.0 है। kaslr_prefetch.c और kaslr_prefetch.h MIT लाइसेंस प्राप्त हैं और स्रोत फ़ाइलों में KASLD श्रेय और पूर्ण अनुमति सूचना बनाए रखते हैं।
| कर्नेल लाइन | पहला सुधारित रिलीज़ | फिक्स कमिट |
|---|
| 6.6.y | 6.6.148 | 4bb84e964ff0 |
| 6.12.y | 6.12.101 | 3ab32218d718 |
| 6.18.y | 6.18.42 | c9574b8a8ede |
| 7.1.y | 7.1.6 | 06213c85d8c0 |
| Mainline | 7.2-rc4 | ec4215683e47 |
| गुण | मान |
|---|
| वितरण | Ubuntu 22.04.5 LTS (Jammy) |
| कर्नेल पैकेज | linux-image-5.15.0-187-generic / 5.15.0-187.197 |
| कर्नेल रिलीज़ | 5.15.0-187-generic #197-Ubuntu |
| आर्किटेक्चर | x86-64 |
| VM | QEMU/KVM, -cpu host, चार vCPUs, 5 GiB RAM |
| प्रारंभिक पहचान | uid=1001(poc) gid=1001(poc) groups=1001(poc) |
| प्रारंभिक कैपेबिलिटी | inheritable, permitted, effective और ambient सभी शून्य |
| अंतिम पहचान | प्रारंभिक namespaces में uid=0(root) gid=0(root) |
| बूट परिवर्तन | कोई नहीं; स्टॉक कमांड लाइन, KASLR सक्षम |
| आवश्यकता | Ubuntu 5.15.0-187 स्थिति | एक्सप्लॉइट उपयोग |
|---|
| PPP | CONFIG_PPP=y | बिल्ट-इन |
| L2TP / PPPoL2TP | CONFIG_L2TP=m, CONFIG_PPPOL2TP=m | आधिकारिक linux-modules-extra मॉड्यूल |
| User keys | CONFIG_KEYS=y | मुक्त किए गए kmalloc-256 चैनल को पुनः प्राप्त करता है |
| AppArmor | CONFIG_SECURITY_APPARMOR=y | सक्रिय रहता है; नकली cred में एक मान्य unconfined लेबल शामिल है |
| KASLR | CONFIG_RANDOMIZE_BASE=y | सक्रिय रहता है; slide रनटाइम पर पुनः प्राप्त किया जाता है |
| SMAP | CONFIG_X86_SMAP=y | सक्रिय रहता है |
| User/network namespaces | Ubuntu द्वारा सक्षम, लेकिन उपयोग नहीं किए जाते | कोई namespace सेटअप या कैपेबिलिटी लाभ आवश्यक नहीं है |
/dev/ppp | आवश्यक नहीं | चैनल बाउंड है लेकिन कभी किसी PPP यूनिट से कनेक्ट नहीं होता |