
लिनक्स कर्नेल कॉपी फेल (CVE-2026-31431) भेद्यता का विश्लेषण और शमन जो AF_ALG/splice पेज कैश म्यूटेशन का शोषण करती है, एवं इसमें PoC जांचकर्ता, auditd पहचान नियम और कर्नेल अपडेट सत्यापन शामिल हैं।
यह परियोजना Linux Kernel Copy Fail (CVE-2026-31431) भेद्यता के कार्य सिद्धांत का विश्लेषण करती है, और सार्वजनिक PoC रिपॉजिटरी के गैर-विनाशकारी चेकर का उपयोग करके पैच से पहले और बाद की स्थिति की तुलना करने वाली एक मिनी-परियोजना है।
वास्तविक setuid बाइनरी में हेरफेर या /etc/passwd में हेरफेर करने वाला एक्सप्लॉइट नहीं किया गया है, बल्कि अस्थायी testfile-आधारित सुरक्षित भेद्यता जाँच और पता लगाने/शमन दृष्टिकोण के विश्लेषण पर ध्यान केंद्रित किया गया है।
इस परियोजना का उद्देश्य केवल एक्सप्लॉइट चलाना नहीं है, बल्कि यह समझना है कि Linux कर्नेल भेद्यता किस आंतरिक संरचना के संयोजन से उत्पन्न होती है और परिचालन दृष्टिकोण से इसकी पहचान और प्रतिक्रिया कैसे की जा सकती है।
कार्यक्षेत्र निम्नानुसार है:
भेद्यता सिद्धांत विश्लेषण
↓
PoC कोड संरचना विश्लेषण
↓
गैर-विनाशकारी चेकर-आधारित अभ्यास
↓
पैच से पहले और बाद की तुलना
↓
पता लगाने/शमन उपायों का सारांश
इस अभ्यास में केवल copy-fail-c रिपॉजिटरी के vulnerable.c को चलाया गया।
| विभाजन | पैच से पहले | पैच के बाद |
|---|---|---|
| OS | Ubuntu 24.04.2 LTS | Ubuntu 24.04.4 LTS |
| Kernel | 6.8.0-53-generic | 6.8.0-134-generic |
| खाता | सामान्य उपयोगकर्ता client | सामान्य उपयोगकर्ता client |
| चेकर | vulnerable | vulnerable |
| परीक्षण विधि | अस्थायी testfile-आधारित गैर-विनाशकारी जाँच | वही चेकर पुनः चलाया |
पैच से पहले कर्नेल जानकारी:
Linux ubuntu-server 6.8.0-53-generic #55-Ubuntu SMP PREEMPT_DYNAMIC Fri Jan 17 15:37:52 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
पैच के बाद कर्नेल जानकारी:
Linux ubuntu-server 6.8.0-134-generic #134-Ubuntu SMP PREEMPT_DYNAMIC Fri Jun 26 18:43:11 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux
कर्नेल पैकेज परिवर्तन सारांश:
- linux-image-6.8.0-53-generic 6.8.0-53.55
- linux-image-generic 6.8.0-53.55+1
+ linux-image-6.8.0-134-generic 6.8.0-134.134
+ linux-image-generic 6.8.0-134.134
+ linux-generic 6.8.0-134.134
+ linux-headers-generic 6.8.0-134.134
Copy Fail Linux कर्नेल के AF_ALG AEAD प्रसंस्करण पथ और splice() zero-copy संचालन के संयोजन से उत्पन्न होने वाली भेद्यता है, जिसमें केवल-पढ़ने योग्य फ़ाइल का page cache गलत लेखन लक्ष्य के रूप में उपयोग किया जा सकता है।
मुख्य घटक निम्नानुसार हैं:
| तत्व | भूमिका |
|---|---|
| Linux page cache | डिस्क फ़ाइल सामग्री को RAM में कैश करने वाला कर्नेल तंत्र |
splice() | डेटा को उपयोगकर्ता स्थान पर कॉपी किए बिना कर्नेल के अंदर संदर्भ के रूप में जोड़ने वाला zero-copy syscall |
AF_ALG | उपयोगकर्ता स्थान को Linux kernel crypto API को सॉकेट की तरह उपयोग करने की अनुमति देने वाला इंटरफ़ेस |
| AEAD in-place प्रसंस्करण | इनपुट और आउटपुट बफ़र को अलग न रखकर एक ही बफ़र में प्रसंस्करण करने वाला अनुकूलन |
authencesn | AEAD प्रसंस्करण के दौरान 4-बाइट scratch write उत्पन्न करने वाला crypto template |
भेद्यता का मुख्य प्रवाह निम्नानुसार है:
पढ़ने योग्य फ़ाइल
↓
Linux page cache में लोड होती है
↓
splice() के माध्यम से AF_ALG crypto पथ को page cache संदर्भ भेजा जाता है
↓
AEAD in-place प्रसंस्करण इनपुट और आउटपुट scatterlist को जोड़ता है
↓
authencesn प्रसंस्करण के दौरान 4-बाइट scratch write होता है
↓
एक अलग आउटपुट बफ़र के बजाय page cache पर लेखन होता है
↓
page cache mutation होता है
अर्थात, splice() page cache संदर्भ भेजता है, AEAD in-place प्रसंस्करण इनपुट और आउटपुट को एक ही पथ से जोड़ता है, और authencesn वास्तविक 4-बाइट लेखन उत्पन्न करने की भूमिका निभाता है।
अभ्यास में उपयोग की गई रिपॉजिटरी संरचना निम्नानुसार है:
copy-fail-c/
├── exploit.c
├── exploit-passwd.c
├── vulnerable.c
├── payload.c
├── utils.c
├── utils.h
├── Makefile
└── nolibc/
| फ़ाइल | भूमिका | इस अभ्यास में उपयोग |
|---|---|---|
utils.c, utils.h | AF_ALG/splice-आधारित page cache mutation primitive कार्यान्वयन | विश्लेषण और vulnerable चलाने में उपयोग |
vulnerable.c | अस्थायी testfile-आधारित गैर-विनाशकारी भेद्यता जाँच उपकरण | चलाया गया |
exploit.c | setuid root बाइनरी page cache हेरफेर variant | नहीं चलाया गया |
exploit-passwd.c | /etc/passwd page cache हेरफेर variant | नहीं चलाया गया |
payload.c | root अधिकारों के साथ चलने वाला payload | नहीं चलाया गया |
Makefile | निर्माण स्वचालन | केवल vulnerable target उपयोग |
nolibc/ | छोटे static ELF payload निर्माण के लिए हल्का libc विकल्प कोड | केवल विश्लेषण |
utils.cutils.c का मुख्य भाग patch_chunk() श्रृंखला के page cache mutation primitive हैं। यह फ़ंक्शन AF_ALG और splice() का उपयोग करके लक्ष्य फ़ाइल के page cache को crypto प्रसंस्करण पथ से जोड़ता है, और यह जाँचता है कि क्या कमजोर कर्नेल में AEAD प्रसंस्करण के दौरान page cache का कुछ भाग अधिलेखित हो जाता है।
vulnerable.cvulnerable.c वास्तविक सिस्टम फ़ाइलों को नहीं छेड़ता है। यह वर्तमान निर्देशिका में एक अस्थायी testfile बनाता है और जाँचता है कि क्या उस फ़ाइल का page cache बदल गया है।
इस परियोजना में केवल यह फ़ाइल चलाई गई।
कर्नेल अद्यतन करने से पहले, OS, कर्नेल और पैकेज स्थिति रिकॉर्ड की गई।
mkdir -p ~/copyfail-mini/{before,after,logs}
cd ~/copyfail-mini
uname -a | tee before/uname.txt
cat /etc/os-release | tee before/os-release.txt
dpkg -l | grep -E 'linux-image|linux-headers|linux-generic|linux-virtual' | tee before/kernel-package.txt
git clone https://github.com/jihwan77/copy-fail-c.git
cd copy-fail-c
make clean
make vulnerable
इस अभ्यास में डिफ़ॉल्ट make द्वारा एक्सप्लॉइट बाइनरी को एक साथ नहीं बनाया गया, बल्कि केवल vulnerable target का उपयोग किया गया।
./vulnerable > ../before/vulnerable-output.txt 2>&1
echo $? >> ../before/vulnerable-output.txt
cat ../before/vulnerable-output.txt
पैच से पहले निष्पादन परिणाम:

निर्णय:
exit code 100
→ page cache mutation की पुष्टि
→ पैच से पहले कर्नेल में Copy Fail primitive काम करता है
पैच से पहले के परिणामों को सहेजने के बाद, Ubuntu पैकेज अद्यतन किया गया।
sudo apt update
sudo apt full-upgrade -y
sudo reboot
रीबूट के बाद कर्नेल निम्नानुसार बदल गया:
Before: 6.8.0-53-generic
After : 6.8.0-134-generic
cd ~/copyfail-mini/copy-fail-c
make clean
make vulnerable
./vulnerable > ../after/vulnerable-output.txt 2>&1
echo "exit_code=$?" >> ../after/vulnerable-output.txt
cat ../after/vulnerable-output.txt
पैच के बाद निष्पादन परिणाम:

परिणाम तुलना:
| आइटम | पैच से पहले | पैच के बाद |
|---|---|---|
| Kernel | 6.8.0-53-generic | 6.8.0-134-generic |
| चेकर परिणाम | VULNERABLE | authencesn template not registered |
| Exit Code | 100 | 2 |
| Page cache mutation | पुष्टि | चेकर mutation चरण तक नहीं पहुंचा |
| व्याख्या | Copy Fail primitive काम करता है | PoC द्वारा आवश्यक AEAD/authencesn पथ में प्रवेश विफल |
पैच के बाद exit_code=2 का सीधा अर्थ "कमजोर नहीं" नहीं है। सटीक रूप से यह निम्नानुसार है:
AF_ALG का authencesn(hmac(sha256),cbc(aes)) template पंजीकृत नहीं है,
इसलिए चेकर भेद्यता की सीधे पुष्टि नहीं कर सका
अतिरिक्त जाँच से पता चला कि Ubuntu अद्यतन के बाद algif_aead मॉड्यूल लोड अवरुद्ध कर दिया गया था।
lsmod | grep -E 'af_alg|algif_aead'
परिणाम:
af_alg 32768 0
algif_aead लोड नहीं था।
sudo modprobe algif_aead
परिणाम: