
cve-2026-46331-audit script
سكربت تدقيق للقراءة فقط خاص بـ CVE-2026-46331 (المعروف أيضًا باسم pedit COW) — خلل جزئي في النسخ عند الكتابة (partial copy-on-write) في إجراء act_pedit ضمن net/sched في نواة Linux، يسمح لمستخدم محلي غير مميَّز بإفساد ذاكرة التخزين المؤقت للصفحات (page cache) وتصعيد الصلاحيات إلى الجذر.
____ _____ ____ ___ _____ ____ _____ __
| _ \| ____| _ \_ _|_ _| / ___/ _ \ \ / /
| |_) | _| | | | | | | | | | | | | \ \ /\ / /
| __/| |___| |_| | | | | | |__| |_| |\ V V /
|_| |_____|____/___| |_| \____\___/ \_/\_/
CVE-2026-46331 net/sched act_pedit partial COW
تحسب الدالة tcf_pedit_act() نطاق COW الخاص بـ skb_ensure_writable() مرة واحدة قبل حلقة المفاتيح، باستخدام tcfp_off_max_hint. تضيف المفاتيح المُنمَّطة (typed keys) إزاحة ترويسة وقت تشغيل لا يغطيها التلميح، لذا يقع جزء من عملية الكتابة النهائية خارج المنطقة المُخضعَة للنسخ عند الكتابة (COW'd). النتيجة: تُكتب بيانات عشوائية على صفحات مشتركة في ذاكرة التخزين المؤقت للصفحات، ويمكن تسميم ثنائية setuid مخزّنة مؤقتًا (الهدف التقليدي: /bin/su) في الذاكرة. تبقى التجزئات على القرص سليمة، ولن ترصدها أدوات مراقبة سلامة الملفات.
ينتمي هذا الخلل إلى العائلة نفسها التي ينتمي إليها Dirty COW (CVE-2016-5195) وDirty Pipe (CVE-2022-0847) وCopy Fail (CVE-2026-31431) وDirty Frag (CVE-2026-46300). نقطة الدخول مختلفة، لكن فشل ملكية الصفحات هو نفسه.
فرز تشخيصي للقراءة فقط بشكل صارم. لا يُحمّل أي وحدة نمطية (module) أبدًا، ولا يلمس sysctl، ولا ينفّذ أي PoC. مصمَّم ليكون آمنًا للتشغيل على بيئات الإنتاج.
act_pedit عبر أربع إشارات مستقلة:
lsmod)modinfo)/boot/config-$(uname -r), /proc/config.gz, modules.builtin)blacklist أو تجاوز install ... /bin/true في modprobe.dtc action pedit الموجودة (معلوماتية فقط؛ دون أي تغييرات).user.max_user_namespaces وkernel.unprivileged_userns_clone وقيود Ubuntu AppArmor على userns./etc/os-release (RHEL 8/9/10، Debian 11/12/13/14، Ubuntu 18.04→26.04، SUSE، Amazon Linux، وتوزيعات عائلة Arch ذات الإصدار المتجدد (rolling)).sudo ./cve-2026-46331-audit.sh # full text report
sudo ./cve-2026-46331-audit.sh --json # machine-readable JSON, no banner
sudo ./cve-2026-46331-audit.sh --quiet --no-hunt # one-line verdict for mass scans
sudo ./cve-2026-46331-audit.sh --since 2026-06-01 # widen IoC hunt window
sudo ./cve-2026-46331-audit.sh --no-banner # text report without the ASCII banner
انظر examples/sample-output.txt لتشغيل كامل، وexamples/sample-output.json للصيغة JSON.
الدرجة عبارة عن مزيج موزون من:
تُحصر الدرجة عند 100 كحد أقصى. أي درجة أعلى من ~70 يجب التعامل معها كحالة عاجلة على عقد متعددة المستأجرين / CI / Kubernetes؛ والدرجات الأقل من ~20 عادةً ما تؤكد سلامة المضيف.
ansible -i inventory all -m script \
-a "cve-2026-46331-audit.sh --json --quiet --no-hunt" \
--become \
| tee /tmp/audit.jsonl
ثم اجمع النتائج باستخدام jq:
grep -v '^[a-z]' /tmp/audit.jsonl | jq -s 'group_by(.verdict) | map({verdict: .[0].verdict, hosts: length})'
- name: audit CVE-2026-46331
ansible.builtin.script: cve-2026-46331-audit.sh --quiet --no-hunt
register: audit
failed_when: audit.rc == 2
changed_when: false
بالترتيب حسب الأولوية. سيقترح السكربت الإجراء المناسب بناءً على ما يجده.
# Option 1: block act_pedit if you don't use it.
tc actions list action pedit # MUST be empty before doing this
echo 'install act_pedit /bin/true' | sudo tee /etc/modprobe.d/disable-act_pedit.conf
lsmod | grep -q act_pedit && sudo rmmod act_pedit
# Option 2: restrict unprivileged user namespaces.
# Will break rootless Podman/Docker, browser sandboxes, Flatpak, unprivileged unshare, some CI sandboxes.
sudo sysctl -w user.max_user_namespaces=0 # EL-family
sudo sysctl -w kernel.unprivileged_userns_clone=0 # Debian/Ubuntu
الإصلاح الحقيقي هو تحديث نواة من البائع إضافة إلى إعادة تشغيل. uname -r بعد إعادة التشغيل هو الدليل الوحيد على ذلك.
هذه هي التكرار الخامس لنفس الفشل المعماري. عالج كلٌّ منها السبب المباشر، ولم يعالج أيٌّ منها السبب الجذري: مسارات سريعة بنسخ صفري (zero-copy) تشارك الصفحات عبر حدود الملكية، حيث يجب على كل كاتب إثبات الخصوصية قبل تعديل البايتات، في مئات المواقع الاستدعائية.
تعالج Rust داخل النواة هذه الفئة تحديدًا عبر أنواع الملكية. لن يظهر هذا النوع من الخلل في net/sched غدًا.
MIT. انظر LICENSE.
للاستخدام الدفاعي المصرَّح به على الأنظمة التي تملكها أو التي صُرِّح لك صراحةً بتدقيقها. لا ينفّذ السكربت إثبات المفهوم العلني (PoC) أبدًا، ولا يعدّل حالة النظام، ولا يُحمّل أي وحدات نمطية. تعامل مع الحكم بوصفه فرزًا تشخيصيًا أوليًا، لا كدليل على الاختراق ولا كدليل على السلامة.
| CVE | CVE-2026-46331 |
| المكوّن | نواة Linux net/sched / act_pedit |
| التصنيف | COW جزئي → إفساد ذاكرة التخزين المؤقت للصفحات → تصعيد صلاحيات محلي (LPE) |
| ناقل الهجوم | محلي (CAP_NET_ADMIN، يُكتسب عادةً عبر مساحات أسماء مستخدم غير مميَّزة) |
| الإصدارات المتأثرة من المنبع | 5.18 .. 7.1-rc6 |
| إصلاح المنبع | 7.1-rc7 |
| إثبات المفهوم العلني (PoC) | packet_edit_meme (تم التحقق منه على RHEL 10 وDebian 13 وUbuntu 24.04.4) |
| شدة Red Hat | مهمة |
| SUSE CVSS 3.1 | 7.8 (AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) |
auditd وjournalctl (نافذة زمنية قابلة للضبط عبر --since).PATCHED / NOT_APPLICABLE / MITIGATED / VULNERABLE / UNKNOWN.| الرمز | المعنى |
|---|
| 0 | PATCHED أو NOT_APPLICABLE (النواة أقدم من الخلل) |
| 1 | MITIGATED (التخفيف مفعّل، لكن النواة ما تزال عرضة؛ طبّق التصحيح على أي حال) |
| 2 | VULNERABLE (تحقق شرط أو أكثر من الشروط المسبقة المطلوبة، ولا توجد نواة مُصلَّحة) |
| 3 | UNKNOWN (عاملها كحالة مشبوهة في سياقات المشاركة / CI / Kubernetes) |
| 4 | ERROR (تعذّر تشغيل السكربت؛ أدوات مفقودة أو بيئة غير سليمة) |
| الإشارة | الوزن |
|---|
حكم البائع VULNERABLE | +50 |
حكم البائع UNKNOWN | +30 |
act_pedit مدمجة في النواة | +25 |
act_pedit قابلة للتحميل دون تجاوز | +20 |
act_pedit قابلة للتحميل مع تجاوز مفعّل | +5 |
act_pedit محمَّلة حاليًا | +5 |
| userns غير مميَّز قابل للوصول دون بوابة AppArmor | +15 |
| userns غير مميَّز قابل للوصول مع بوابة AppArmor مفعّلة | +8 |
| مؤشرات IoC موجودة في نافذة البحث | +10 |
| CVE | السنة | النظام الفرعي | الأولية (Primitive) |
|---|
| CVE-2016-5195 | 2016 | mm | سباق COW على تعيين للقراءة فقط |
| CVE-2022-0847 | 2022 | pipe / splice | تسريب علم pipe_buffer إلى ذاكرة التخزين المؤقت للصفحات |
| CVE-2026-31431 | 2026 | crypto AF_ALG/AEAD | تشفير موضعي (in-place) فوق ذاكرة تخزين مؤقتة للملفات للقراءة فقط |
| CVE-2026-46300 | 2026 | XFRM ESP-in-TCP | فقدان علامة المشاركة المكسّرة (shared-frag) في skbuff |
| CVE-2026-46331 | 2026 | net/sched act_pedit | COW جزئي ناتج عن إزاحة مفتاح مُنمَّط تُحلّ متأخرًا |