
# CVE-2026-31431 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट यह Linux कर्नेल में AF_ALG पेज कैश राइट के माध्यम से स्थानीय विशेषाधिकार वृद्धि (local privilege escalation) का एक प्रूफ-ऑफ-कॉन्सेप्ट है, जो प्रमुख डिस्ट्रीब्यूशन पर रूट एक्सेस प्राप्त करता है।
algif_aead पेज कैश राइट ("कॉपी फेल") के माध्यम से स्थानीय विशेषाधिकार वृद्धि
लेखक: वैन ग्लेनडन एनाड
मूल खोज: थियोरी / ज़िंट कोड रिसर्च टीम (तायांग ली)
प्रकाशित: 29 अप्रैल, 2026
गंभीरता: उच्च
CVSS v3.1 स्कोर: 7.8
CVSS v3.1 वेक्टर: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CWE: CWE-787 (आउट-ऑफ-बाउंड्स राइट), CWE-269 (अनुचित विशेषाधिकार प्रबंधन)
CVE-2026-31431, जिसे सार्वजनिक रूप से "कॉपी फेल" नाम दिया गया है, लिनक्स कर्नेल के algif_aead मॉड्यूल — कर्नेल के यूज़रस्पेस क्रिप्टोग्राफ़िक API (AF_ALG) का AEAD सिफर इंटरफ़ेस — में एक उच्च-गंभीरता वाली स्थानीय विशेषाधिकार वृद्धि (LPE) भेद्यता है। यह दोष 2017 में कमिट 72548b093ee3 के माध्यम से पेश किए गए एक प्रदर्शन अनुकूलन (इन-प्लेस ऑपरेशन) से उत्पन्न होता है, जिसने अनजाने में AEAD क्रिप्टोग्राफ़िक ऑपरेशन के दौरान पेज-कैश-समर्थित फ़ाइल पेजों को लिखने योग्य गंतव्य स्कैटरलिस्ट में रखने की अनुमति दी।
तीन कर्नेल सबसिस्टम — AF_ALG सॉकेट, splice() सिस्टम कॉल, और authencesn एल्गोरिदम का स्क्रैच-राइट व्यवहार — को जोड़कर, एक अन-प्रिविलेज्ड स्थानीय उपयोगकर्ता किसी भी पठनीय फ़ाइल के पेज कैश में नियंत्रित 4-बाइट राइट कर सकता है। /usr/bin/su जैसे setuid बाइनरी को लक्षित करते हुए, यह राइट डिस्क पर फ़ाइल को संशोधित किए बिना इन-मेमोरी निष्पादन योग्य छवि को दूषित कर देता है, जिससे ऑन-डिस्क फ़ाइल अखंडता उपकरण बायपास हो जाते हैं। root तक परिणामी विशेषाधिकार वृद्धि नियतात्मक है — कोई रेस कंडीशन, कोई प्रति-वितरण कर्नेल ऑफ़सेट, और कोई विशेष विशेषाधिकार आवश्यक नहीं हैं। एक सार्वजनिक रूप से जारी 732-बाइट Python PoC एक्सप्लॉइट उबंटू, अमेज़न लिनक्स, RHEL और SUSE पर एक ही अपरिवर्तित रन में रूट शेल प्रदान करता है।
| घटक | विवरण |
|---|---|
| प्रभावित सबसिस्टम | crypto/algif_aead.c — लिनक्स कर्नेल AF_ALG AEAD इंटरफ़ेस |
| भेद्यता प्रस्तुत | लिनक्स कर्नेल 4.14 (2017), कमिट 72548b093ee38a6d4f2a19e6ef1948ae05c181f7 |
| फिक्स्ड संस्करण | 6.18.22, 6.19.12, 7.0 |
| फिक्स कमिट | a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5 |
| सत्यापित वितरण | उबंटू 24.04 LTS, अमेज़न लिनक्स 2023, RHEL 10.1, SUSE 16 |
| अप्रत्यक्ष रूप से प्रभावित | डेबियन, आर्क, फेडोरा, रॉकी, अल्मालिनक्स, ओरेकल लिनक्स, और 2017 से निर्मित कोई भी अनपैच्ड कर्नेल चलाने वाला कोई भी वितरण |
यह भेद्यता लगभग नौ वर्षों से हर मुख्यधारा लिनक्स वितरण में चुपचाप मौजूद है। थियोरी के अनुसार, AF_ALG लगभग हर वितरण के डिफ़ॉल्ट कर्नेल कॉन्फ़िगरेशन में सक्षम है, जिसका अर्थ है कि सिस्टम के भेद्य होने के लिए किसी विशेष बिल्ड फ़्लैग या कॉन्फ़िगरेशन की आवश्यकता नहीं है।
लिनक्स कर्नेल AF_ALG सॉकेट इंटरफ़ेस (crypto/algif_aead.c) के माध्यम से यूज़रस्पेस को क्रिप्टोग्राफ़िक प्रिमिटिव प्रदान करता है। 2017 में, एक प्रदर्शन अनुकूलन मर्ज किया गया था जिसने algif_aead को AEAD ऑपरेशन इन-प्लेस करने की अनुमति दी — अनावश्यक डेटा कॉपी से बचने के लिए स्रोत मेमोरी बफ़र को गंतव्य के रूप में पुनः उपयोग करना।
दोष तब उत्पन्न होता है जब यूज़रस्पेस splice() सिस्टम कॉल के माध्यम से AF_ALG सॉकेट में इनपुट फीड करता है। इस मामले में, स्रोत स्कैटरलिस्ट में रखे गए पेज पेज कैश पेज होते हैं — स्प्लिस्ड फ़ाइल का समर्थन करने वाली साझा, कर्नेल-प्रबंधित मेमोरी। इन-प्लेस अनुकूलन के कारण req->src = req->dst सेट होने के कारण, ये पेज कैश पेज लिखने योग्य गंतव्य स्कैटरलिस्ट में समाप्त हो जाते हैं। authencesn एल्गोरिदम बाद में dst[assoclen + cryptlen] पर एक स्क्रैच राइट करता है, जो उन पेज कैश पेजों के भीतर एक ऑफ़सेट पर हल होता है — प्रभावी रूप से स्प्लिस्ड फ़ाइल की इन-मेमोरी छवि में हमलावर-नियंत्रित डेटा लिखता है।
क्योंकि पेज कैश पूरे होस्ट में साझा होता है, जिसमें कंटेनर भी शामिल हैं, एक प्रक्रिया से एक राइट उस फ़ाइल के कैश्ड पेजों को उसी कर्नेल पर चलने वाली हर प्रक्रिया और कंटेनर के लिए प्रभावित करता है।
algif_aead.c में आपत्तिजनक परिवर्तन ने req->src = req->dst सेट किया और sg_chain() के माध्यम से स्रोत स्कैटरलिस्ट से टैग पेजों को आउटपुट स्कैटरलिस्ट में जोड़ा:
/* 2017 in-place optimization — commit 72548b093ee3 */
req->src = req->dst; /* source == destination */
sg_chain(dst, n + 1, src_tag); /* tag pages chained into writable dst */
जब splice() का उपयोग सॉकेट में फ़ाइल फीड करने के लिए किया जाता है, तो स्कैटरलिस्ट पेज पेज-कैश-समर्थित होते हैं, निजी अनाम मेमोरी नहीं। उन्हें लिखने योग्य dst स्कैटरलिस्ट में जोड़ना इस धारणा का उल्लंघन करता है कि गंतव्य लिखने योग्य निजी मेमोरी है।
authencesn स्क्रैच राइटauthencesn टेम्पलेट dst[assoclen + cryptlen] पर एक अनुक्रम संख्या स्क्रैच मान (seqno_lo, AAD के बाइट 4–7) लिखता है। क्योंकि dst में अब स्प्लिस्ड फ़ाइल के पेज कैश पेज शामिल हैं, यह राइट फ़ाइल की इन-मेमोरी छवि के भीतर एक हमलावर-नियंत्रित ऑफ़सेट पर पहुंचता है:
/* authencesn scratch write — offset determined by assoclen + cryptlen */
scatterwalk_map_and_copy(seqno, dst,
req->assoclen + req->cryptlen,
sizeof(seqno), 1); /* writes into page cache */
लिखे गए 4 बाइट seqno_lo के अनुरूप हैं, जिसे हमलावर sendmsg() के माध्यम से भेजे गए AAD पेलोड के माध्यम से नियंत्रित करता है।
AF_ALG socket (SOCK_SEQPACKET)
│
│ splice() — delivers file-backed pages into socket
▼
algif_aead in-place optimization
│ req->src = req->dst
│ page-cache pages land in writable scatterlist
▼
authencesn scratch write
│ writes seqno_lo at dst[assoclen + cryptlen]
│ = attacker-chosen 4 bytes at attacker-chosen file offset
▼
page cache corruption (no on-disk change)
फिक्स (a664bf3d603d) इन-प्लेस अनुकूलन को पूरी तरह से वापस ले लेता है — algif_aead अब हमेशा आउट-ऑफ-प्लेस संचालित होता है, एक अलग गंतव्य बफ़र आवंटित करता है। चूंकि स्रोत और गंतव्य अब अलग-अलग मैपिंग से आते हैं, src में पेज कैश पेज dst राइट पथ द्वारा कभी नहीं पहुंचे जा सकते।
| आवश्यकता | नोट्स |
|---|---|
| स्थानीय अन-प्रिविलेज्ड उपयोगकर्ता खाता | कोई उन्नत अनुमति आवश्यक नहीं |
| 2017 से निर्मित कर्नेल (≥ 4.14) | प्रभावी रूप से सभी मुख्यधारा वितरणों को कवर करता है |
AF_ALG (CONFIG_CRYPTO_USER_API) सक्षम | लगभग सभी वितरण कर्नेल कॉन्फ़िगरेशन में डिफ़ॉल्ट |
algif_aead मॉड्यूल लोड करने योग्य/लोडेड | पहले AF_ALG सॉकेट निर्माण पर ऑटोलोडेड |
कम से कम एक पठनीय setuid बाइनरी | जैसे, /usr/bin/su, /usr/bin/sudo |
| Python 3.10+ (सार्वजनिक PoC के लिए) | केवल stdlib से os, socket, zlib |
पूर्वापेक्षाओं से उल्लेखनीय रूप से अनुपस्थित: नेटवर्क एक्सेस, कर्नेल डिबगिंग सुविधाएँ, CAP_SYS_ADMIN, प्री-लोडेड कर्नेल मॉड्यूल, या कोई पूर्व-मौजूद प्रिमिटिव। हमला सतह पूरी तरह से स्थानीय और आत्म-निहित है।