
BPF LSM ब्लॉकर CVE-2026-31431 (Copy Fail) के लिए — रिबूट किए बिना रनटाइम पर authencesn AF_ALG बाइंड्स को ब्लॉक करता है
प्रूफ ऑफ कॉन्सेप्ट CVE-2026-31431 ("कॉपी फेल") के लिए रनटाइम शमन — algif_aead में authencesn क्रिप्टोग्राफिक टेम्पलेट के माध्यम से लिनक्स कर्नेल विशेषाधिकार वृद्धि।
मॉड्यूल ब्लैकलिस्टिंग के विपरीत, इसके लिए कोई रीबूट आवश्यक नहीं है। एक BPF LSM प्रोग्राम socket_bind को हुक करता है और सभी AF_ALG AEAD बाइंड्स को ब्लॉक करता है — वह सबसिस्टम जिसका कॉपी फेल द्वारा शोषण किया जाता है। यह क्रिप्टो टेम्पलेट नेस्टिंग (जैसे pcrypt(authencesn(...))) के माध्यम से बायपास को रोकता है। अन्य AF_ALG उपयोग (हैश, स्कीसाइफर) प्रभावित नहीं होता है।
ब्लॉक किए गए प्रयासों को PID, प्रक्रिया नाम और टाइमस्टैम्प के साथ वास्तविक समय में लॉग किया जाता है।
CONFIG_BPF_LSM=y और बूट पैरामीटर में lsm=bpf होmake doctor # सभी पूर्वापेक्षाएँ जाँचें
git clone https://github.com/atgreen/block-copyfail.git
cd block-copyfail
make ubi8-build
sudo ./block-copyfail
ब्लॉकर तब तक सक्रिय रहता है जब तक आप Ctrl-C दबाते नहीं हैं, फिर साफ-सुथरे तरीके से अलग हो जाता है।
अपनी मशीन पर बिल्ड करने के लिए आपको SBCL और Whistler (कॉमन लिस्प eBPF कंपाइलर) की आवश्यकता है:
git clone https://github.com/atgreen/whistler.git ~/git/whistler
make build
sudo ./block-copyfail
RHEL/CentOS/Alma/Rocky 8+, Fedora, Ubuntu 20.04+, और glibc 2.28 या नए वाले किसी भी लिनक्स पर चलने वाली बाइनरी बनाने के लिए UBI8 कंटेनर के अंदर बिल्ड करें। लक्ष्य सिस्टम पर SBCL या Whistler की आवश्यकता नहीं है — बस बाइनरी कॉपी करें और चलाएँ।
make ubi8-build
scp block-copyfail root@server:
ssh root@server ./block-copyfail
एक मानक .bpf.o फ़ाइल उत्पन्न करता है जिसे bpftool, libbpf, या किसी भी BPF लोडर द्वारा लोड किया जा सकता है:
make elf
sudo mkdir -p /sys/fs/bpf/copyfail
sudo bpftool prog loadall block-copyfail.bpf.o /sys/fs/bpf/copyfail autoattach
अलग करने और हटाने के लिए:
sudo rm -rf /sys/fs/bpf/copyfail
एक टर्मिनल में ब्लॉकर चलाते हुए, दूसरे में परीक्षण ट्रिगर करें:
python3 trigger-test.py
परीक्षण स्क्रिप्ट एक AF_ALG AEAD बाइंड का प्रयास करती है (कोई शोषण नहीं किया जाता है)।
परीक्षण टर्मिनल में अपेक्षित आउटपुट:
BLOCKED: aead/authencesn(hmac(sha256),cbc(aes)) — [Errno 1] Operation not permitted
BLOCKED: aead/gcm(aes) — [Errno 1] Operation not permitted
ALLOWED: hash/sha256
ALLOWED: skcipher/cbc(aes)
ब्लॉकर टर्मिनल में अपेक्षित आउटपुट:
Copy Fail blocker active — all AF_ALG AEAD binds blocked.
Other AF_ALG usage (hash, skcipher) unaffected.
Watching for blocked attempts. Press Ctrl-C to exit.
TIME PID COMMAND
---- --- -------
06:38:12 31337 python3
ब्लॉकर के बिना चलाने पर, परीक्षण स्क्रिप्ट सभी चार एल्गोरिदम के लिए ALLOWED प्रिंट करती है।
BPF प्रोग्राम bpf_probe_read_kernel के माध्यम से socket_bind तर्कों से struct sockaddr_alg के 7 बाइट्स पढ़ता है, salg_family == AF_ALG और salg_type == "aead" की जाँच करता है, और मिलान पर -EPERM लौटाता है। यह टेम्पलेट नेस्टिंग की परवाह किए बिना सभी AEAD एल्गोरिदम बाइंड्स को ब्लॉक करता है। इवेंट्स को रिंग बफर के माध्यम से यूज़रस्पेस में भेजा जाता है।
Whistler में लिखा गया, एक कॉमन लिस्प बोली जो सीधे eBPF बाइटकोड में संकलित होती है — C, clang, या LLVM की आवश्यकता नहीं है।
MIT