
对 CVE-2026-31431 的复现分析、C 改编的 exp。
.
├── container
│ ├── container.md # कंटेनर से भागने की रणनीति
│ ├── expenv # कंटेनर वातावरण
│ │ ├── bin
│ │ │ ├── gscontainer
│ │ │ └── share
│ │ ├── Dockerfile
│ │ ├── run.sh
│ │ └── src
│ │ ├── gscontainer.c
│ │ └── share.c
│ ├── images
│ │ ├── container.png
│ │ ├── getshell.png
│ │ ├── host.png
│ │ ├── payload.png
│ │ └── share.png
│ ├── recode.bin # एकल-चरण का shellcode
│ └── stager
│ ├── shell.elf # exp में एम्बेडेड चरणबद्ध shellcode
│ ├── stager1.bin
│ ├── stager2.bin
│ ├── stager3.bin
│ └── stager4.bin
├── doc
│ ├── cve-2026-31431.md # xint.io विश्लेषण सारांश
│ └── shellcode.md # shellcode क्या है इसका परिचय
├── exp.py # curl http://copy.fail/exp -o exp.py
├── README.md
├── success
│ ├── code.py # exp.py से निकाला गया shellcode
│ └── exploit.c # C भाषा में संक्षिप्त exp, जिसमें मूल msf प्रिविलेज एस्केलेशन का shellcode है, जिसे AV-बचाव की आवश्यकता है
└── test
├── exptest.c # टिप्पणियाँ हटाई गईं
└── test.c # सही और टिप्पणियों के साथ, समझने में आसान
तीन अलग-अलग हानिरहित कमिट, जो संयुक्त होने पर भेद्यता उत्पन्न करते हैं:
splice(फ़ाइल → pipe → AF_ALG)
↓
af_alg_sendmsg: फ़ाइल पेज कैश → TX SGL (शून्य-कॉपी)
↓
_aead_recvmsg: in-place अनुकूलन
├─ memcpy_sglist: AAD+सिफरटेक्स्ट को RX SGL में कॉपी किया
├─ sg_chain: tag पृष्ठ (अभी भी फ़ाइल पेज कैश की ओर इशारा करता है) RX SGL में जोड़ा गया
└─ req->src = req->dst (= फ़ाइल पेज कैश पृष्ठों वाला scatterlist)
↓
crypto_authenc_esn_decrypt: ESN पुनर्व्यवस्था
└─ scatterwalk_map_and_copy(tmp+1, dst, assoclen+cryptlen, 4, 1)
↓ dst scatterlist में tag स्थान तक ट्रैवर्स करता है
↓ kmap_local_page() फ़ाइल पेज कैश पृष्ठ को मैप करता है
↓ memcpy: seqno_lo को फ़ाइल पेज कैश पृष्ठ में लिखता है
↓
HMAC सत्यापन विफल → -EBADMSG लौटाता है
↓
फ़ाइल पेज कैश पृष्ठ संशोधित हो चुका है, कर्नेल ने इसे गंदा (dirty) चिह्नित नहीं किया, डिस्क फ़ाइल अपरिवर्तित रहती है
पेपर का दावा है कि 2017 के बाद से "लगभग सभी Linux वितरण" प्रभावित हैं। पेज कैश कंटेनरों के बीच साझा होता है, इसलिए यह भेद्यता स्थानीय विशेषाधिकार वृद्धि (LPE) और कंटेनर पलायन वेक्टर दोनों है।
कर्नेल मेनलाइन का फिक्स कमिट a664bf3d603d AF_ALG AEAD ऑपरेशनों को out-of-place (src और dst को अलग करके) पर वापस ले जाता है:
Before: aead_request_set_crypt(..., rsgl_src,
areq->first_rsgl.sgl.sgt.sgl, ...)
^ src == dst ^
After: aead_request_set_crypt(..., tsgl_src,
areq->first_rsgl.sgl.sgt.sgl, ...)
^ src ≠ dst ^ (src के लिए TX SGL, dst के लिए RX SGL)
कमिट संदेश: "There is no benefit in operating in-place in algif_aead since the source and destination come from different mappings."
आपातकालीन शमन उपाय:
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead
या seccomp नीति के माध्यम से AF_ALG सॉकेट निर्माण (socket(AF_ALG, ...)) को प्रतिबंधित करें।
| समय | कमिट | प्रभाव |
|---|
| 2011 | a5079d084f8b | authencesn जोड़ा गया, ESN पुनर्व्यवस्था के लिए dst scatterlist को अस्थायी स्थान के रूप में उपयोग करता है। उस समय हानिरहित—पुराने AEAD इंटरफ़ेस ने AAD को अलग रखा, और एकमात्र कॉलर कर्नेल xfrm था। |
| 2015 | 104880a6b470 | authencesn को नए AEAD इंटरफ़ेस में परिवर्तित किया गया, जिसमें assoclen+cryptlen पर seqno_lo लिखने का व्यवहार "आउटपुट सीमा पार करते हुए" शामिल किया गया। फिर भी शोषण योग्य नहीं—AF_ALG के out-of-place मोड के कारण, req->src और req->dst अलग थे, पेज कैश पृष्ठ केवल पढ़ने योग्य src में थे। |
| 2017 | 72548b093ee3 | AF_ALG in-place अनुकूलन। AAD+सिफरटेक्स्ट को TX SGL से RX बफ़र में कॉपी किया, लेकिन tag पृष्ठ को sg_chain के माध्यम से जोड़ा गया। req->src = req->dst सेट किया गया। अब splice द्वारा लाए गए पेज कैश पृष्ठ एक साथ लिखने योग्य dst scatterlist में हैं। भेद्यता उत्पन्न होती है। |
| वितरण | कर्नेल संस्करण | प्रभावित |
|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws | हाँ |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | हाँ |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 | हाँ |
| SUSE 16 | 6.12.0-160000.9-default | हाँ |
| विशेषता | स्रोत सत्यापन | विवरण |
|---|
| authencesn seqno_lo को अंत में लिखता है | authencesn.c:134 | assoclen+cryptlen पर seqno_lo (निचले 32 बिट) लिखता है। उपयोगकर्ता का विवरण सही है। |
| ESN पुनर्व्यवस्था सम्मेलन | ब्लॉग पुष्टि (xint.io) | AAD बाइट्स 0-3 = seqno_hi, बाइट्स 4-7 = seqno_lo। tmp[1] (=बाइट्स 4-7=seqno_lo) को अंत में लिखा जाता है। |
| डिक्रिप्शन पथ ओवरराइट किए गए बाइट्स को पुनर्स्थापित नहीं करता | authencesn.c:270-273 बनाम 215-217 | decrypt_tail ESN को ऑफसेट 0-7 पर पुनर्स्थापित करता है लेकिन assoclen+cryptlen पर मूल बाइट्स को कभी पुनर्स्थापित नहीं करता। एन्क्रिप्शन पथ (genicv_tail) ICV लिखने से पहले पुनर्स्थापित करता है। |
| AF_ALG in-place एन्क्रिप्शन/डिक्रिप्शन | algif_aead.c:189-252 | rsgl_src और areq->first_rsgl.sgl.sgt.sgl एक ही RX SGL को इंगित करते हैं। |
| AF_ALG tag चेनिंग | algif_aead.c:238-244 | डिक्रिप्शन के दौरान tag को कॉपी करने के बजाय sg_chain के माध्यम से संदर्भित किया जाता है—splice परिदृश्य में tag पृष्ठ अभी भी फ़ाइल पेज कैश को इंगित करता है। सुरक्षा भेद्यता का मूल कारण। |
| splice शून्य-कॉपी स्थानांतरण | fs/splice.c:876, af_alg.c:1049, lib/scatterlist.c:1167 | सीधे pipe पृष्ठ को संदर्भित करता है, शून्य-कॉपी। |
| CVE-2026-31431 | तीन कमिट श्रृंखला | authencesn(2011/2015) + in-place(2017) + splice शून्य-कॉपी = नियंत्रणीय पेज कैश लेखन प्राइमिटिव। |