
सीवीई-2026-31431 (Copy Fail) की एक संरचित व्याख्या, जो उन तीन कर्नेल परिवर्तनों को जोड़ती है जिन्होंने भेद्यता को पेश किया और इसके शोषण को सक्षम बनाया।
authencesn में एक तर्क दोष, जो AF_ALG और splice() के माध्यम से सिस्टम पर किसी भी पठनीय फ़ाइल के पेज कैश में नियंत्रित 4-बाइट लेखन में जुड़ जाता है। न कोई रेस कंडीशन, न ऑफसेट, न संकलित पेलोड। यही 732-बाइट स्क्रिप्ट 2017 से हर Linux वितरण पर रूट प्राप्त करती है।
CVE-2026-31431 - Copy Fail Linux कर्नेल के authencesn क्रिप्टोग्राफ़िक टेम्पलेट में एक तर्क दोष है। यह एक अविशेषित स्थानीय उपयोगकर्ता को सिस्टम पर किसी भी पठनीय फ़ाइल के पेज कैश में नियंत्रित 4-बाइट लेखन करने की अनुमति देता है, बिना फ़ाइल को डिस्क पर संशोधित किए।
बग तीनों घटकों में से किसी में व्यक्तिगत रूप से मौजूद नहीं है। यह उनके परस्पर संपर्क से उत्पन्न होता है:``` 2011 ────────────────────────────────────────────────────────────────────── - authencesn added to the kernel (a5079d084f8b). - Uses the caller's destination scatterlist as scratch space. - Reorder ESN bytes before HMAC computation. - Only caller: internal xfrm layer. Harmless.
2015 ────────────────────────────────────────────────────────────────────── - algif_aead.c gains AEAD support with splice() path (104880a6b470). - splice() can deliver page cache pages to the TX scatterlist. - AF_ALG uses out-of-place operation: req->src != req->dst. - Page cache pages remain read-only. Not exploitable.
2017 ────────────────────────────────────────────────────────────────────── - In-place optimization in algif_aead.c (72548b093ee3). - Copies AAD+CT to RX buffer but chains authentication tag pages via sg_chain(). - Sets req->src = req->dst. - Page cache pages now reside in WRITABLE dst. - authencesn writes past boundary → page cache corruption.
2026 ────────────────────────────────────────────────────────────────────── - Copy Fail - CVE-2026-31431. Discovered by Theori / Xint Code. - Exploitable across all distros since 2017.
---
---
---
<div id='root-cause'/>
## ***🧬 मूल कारण विश्लेषण (Root Cause Analysis)***
<div id='primitive'/>
### ***AF_ALG + splice() प्रिमिटिव***
AF_ALG (*[AF_ALG = 38](https://docs.kernel.org/crypto/userspace-if.html#user-space-api-general-remarks)*) एक सॉकेट प्रकार है जो कर्नेल क्रिप्टोग्राफिक API को अविशेषाधिकार प्राप्त यूज़रस्पेस के लिए उजागर करता है। एक अविशेषाधिकार प्राप्त प्रक्रिया यह कर सकती है:
1. AF_ALG / SOCK_SEQPACKET सॉकेट खोलना।
2. कर्नेल क्रिप्टो API द्वारा उजागर किसी भी उपलब्ध AEAD टेम्पलेट पर bind() करना।
3. कॉन्फ़िगर किए गए एल्गोरिथ्म पर setsockopt(SOL_ALG, ALG_SET_KEY, ...) के माध्यम से एक क्रिप्टोग्राफिक कुंजी सेट करना।
4. एक समर्पित ऑपरेशन सॉकेट प्राप्त करने के लिए accept() को कॉल करना जो एन्क्रिप्शन और डिक्रिप्शन अनुरोधों को संभालेगा।
5. sendmsg() का उपयोग करके क्राफ्ट किया गया डेटा भेजना और recvmsg() के माध्यम से संसाधित परिणाम प्राप्त करना, जिससे कर्नेल क्रिप्टो सबसिस्टम के साथ पूरी तरह से इंटरैक्ट किया जा सके।
यह सभी प्रमुख वितरणों के कर्नेल कॉन्फ़िगरेशन में डिफ़ॉल्ट रूप से सक्षम है (CONFIG_CRYPTO_USER_API_AEAD=y)।
**[splice(2)](https://man7.org/linux/man-pages/man2/splice.2.html)** बिना कॉपी किए फ़ाइल डिस्क्रिप्टरों के बीच डेटा स्थानांतरित करता है - यह पेजों के संदर्भ पास करता है, कॉपी नहीं। प्रासंगिक प्रवाह:```
open("/usr/bin/su") -> fd_file
pipe() -> pipe_rd, pipe_wr
# moves N bytes from the file into the pipe
# the pipe buffer now contains a reference to the same physical page in the page cache
splice(fd_file, pipe_wr, N)
# delivers that reference to the AF_ALG socket
# the TX scatterlist of algif_aead now points to the page cache page of /usr/bin/su
splice(pipe_rd, alg_fd, N)
AF_ALG सॉकेट का TX scatterlist फ़ाइल के प्रत्येक read(), mmap(), और execve() के लिए कर्नेल द्वारा उपयोग किए गए उन्हीं भौतिक पृष्ठों के प्रत्यक्ष संदर्भ रखता है। इसमें कोई प्रतिलिपि शामिल नहीं है।
कमिट 72548b093ee3, algif_aead.c। डिक्रिप्शन के लिए, कार्यान्वयन:
In-place operation: RX SGL (req->dst): [ user buffer: AAD (copy) || CT (copy) ] --sg_chain--> [ Tag (page cache pages) ] req->src = req->dst = RX SGL
Result: page cache pages from /usr/bin/su are now part of the WRITABLE scatterlist passed to the crypto algorithm.
<div id='authencesn'/>
### ***authencesn में आउट-ऑफ-बाउंड लेखन***
authencesn kernel AEAD wrapper है जिसका उपयोग IPsec Extended Sequence Numbers (RFC 4303) के साथ करता है। IPsec 64-बिट अनुक्रम संख्याओं का उपयोग करता है:
- seqno_hi - ऊपरी 32 बिट (AAD के बाइट 0-3)
- seqno_lo - निचले 32 बिट (AAD के बाइट 4-7)
केवल seqno_lo वायर पर प्रेषित होता है; seqno_hi अंतर्निहित संदर्भ है। HMAC गणना के लिए, authencesn को इन बाइट्स को पुनर्व्यवस्थित करने की आवश्यकता होती है: हैश इनपुट की शुरुआत में seqno_hi और अंत में seqno_lo।
यह पुनर्व्यवस्था caller के destination scatterlist को scratch space के रूप में उपयोग करके करता है:```c
/* crypto/authencesn.c - crypto_authenc_esn_decrypt() */
// [1] Read bytes 0-7 of the AAD from dst
scatterwalk_map_and_copy(tmp, dst, 0, 8, 0);