
# حاجب BPF LSM لثغرة CVE-2026-31431 (Copy Fail) — يمنع ربط AF_ALG غير المصرح به في وقت التشغيل دون إعادة تشغيل النظام
إثبات المفهوم للتخفيف في وقت التشغيل من CVE-2026-31431 ("Copy Fail") — تصعيد صلاحيات في نواة لينكس عبر قالب التشفير authencesn في algif_aead.
على عكس حظر الوحدات النمطية، فإن هذا لا يتطلب إعادة تشغيل. يقوم برنامج BPF LSM بربط socket_bind ويمنع جميع عمليات ربط AF_ALG AEAD — النظام الفرعي الذي تم استغلاله بواسطة Copy Fail. يمنع هذا تجاوزات عبر تداخل قوالب التشفير (مثل pcrypt(authencesn(...))). استخدامات AF_ALG الأخرى (hash، skcipher) غير متأثرة.
يتم تسجيل المحاولات المحظورة في الوقت الفعلي مع 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 بلغة Common Lisp):
git clone https://github.com/atgreen/whistler.git ~/git/whistler
make build
sudo ./block-copyfail
قم بالبناء داخل حاوية UBI8 لإنتاج ثنائي يعمل على RHEL/CentOS/Alma/Rocky 8+ وFedora وUbuntu 20.04+ وأي لينكس مع glibc 2.28 أو أحدث. لا حاجة إلى 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 7 بايت من struct sockaddr_alg من وسائط socket_bind عبر bpf_probe_read_kernel، ويتحقق من salg_family == AF_ALG و salg_type == "aead"، ويعيد -EPERM عند التطابق. يمنع هذا جميع عمليات ربط خوارزميات AEAD بغض النظر عن تداخل القوالب. يتم إرسال الأحداث إلى مساحة المستخدم عبر حلقة عازلة (ring buffer).
مكتوب بلغة Whistler، وهي لهجة Common Lisp تترجم مباشرة إلى بايت كود eBPF — بدون الحاجة إلى C أو clang أو LLVM.
MIT