
cve-2026-46331-audit script
سكربت تدقيق للقراءة فقط خاص بـ CVE-2026-46331 (المعروف أيضًا بـ pedit COW) — خلل في النسخ عند الكتابة الجزئي (partial copy-on-write) في إجراء act_pedit ضمن net/sched في نواة لينكس، يتيح لمستخدم محلي غير متمتع بامتيازات إفساد ذاكرة ذاكرة التخزين المؤقت للصفحات (page cache) والارتقاء إلى صلاحيات الجذر (root).
____ _____ ____ ___ _____ ____ _____ __
| _ \| ____| _ \_ _|_ _| / ___/ _ \ \ / /
| |_) | _| | | | | | | | | | | | | \ \ /\ / /
| __/| |___| |_| | | | | | |__| |_| |\ 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 region). النتيجة: تتعرض صفحات ذاكرة التخزين المؤقت المشتركة للكتابة العشوائية، ويمكن تسميم ملف ثنائي setuid مخزّن مؤقتًا (الهدف الكلاسيكي: /bin/su) في الذاكرة. تبقى تجزئات القرص نظيفة. لن ترصدها مراقبات سلامة الملفات.
من نفس عائلة ثغرة Dirty COW (CVE-2016-5195)، وDirty Pipe (CVE-2022-0847)، وCopy Fail (CVE-2026-31431)، وDirty Frag (CVE-2026-46300). نقطة الدخول مختلفة، لكن فشل ملكية الصفحة هو نفسه.
| CVE | CVE-2026-46331 |
| المكوّن | نواة Linux net/sched / act_pedit |
| الفئة | COW جزئي ← تلف ذاكرة التخزين المؤقت للصفحات ← رفع الصلاحيات المحلي (LPE) |
| ناقل الهجوم | محلي (CAP_NET_ADMIN، يُكتسب عادةً عبر userns غير مميّز) |
| الإصدارات المتأثرة في المنبع | 5.18 .. 7.1-rc6 |
| إصلاح المنبع | 7.1-rc7 |
| PoC عام | packet_edit_meme (تم التحقق منه على RHEL 10، Debian 13، Ubuntu 24.04.4) |
| خطورة Red Hat | Important |
| SUSE CVSS 3.1 | 7.8 (AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) |
فرز للقراءة فقط بشكل صارم. لا يحمّل وحدة أبدًا، ولا يمسّ sysctl، ولا ينفّذ PoC. مصمم ليكون آمنًا للتشغيل على بيئات الإنتاج.
act_pedit عبر أربع إشارات مستقلة:
lsmod)modinfo)/boot/config-$(uname -r)، /proc/config.gz، modules.builtin)install ... /bin/true في modprobe.d، أو بواسطة blacklist على النوى التي تحمّل act_pedit تلقائيًا عبر اسمه المستعار net-act-pedit (6.9+؛ النوى الأقدم تطلبه بالاسم، وهو ما لا يوقفه blacklist)tc action pedit الموجودة (لأغراض معلوماتية؛ دون أي تغييرات).user.max_user_namespaces، kernel.unprivileged_userns_clone، user.max_net_namespaces، وقيود userns الخاصة بـ AppArmor في Ubuntu./etc/os-release (RHEL 8/9/10، Debian 11/12/13/14، Ubuntu 18.04→26.04، SUSE، Amazon Linux، عائلة Arch المتدحرجة).auditd وjournalctl (نافذة قابلة للضبط عبر --since و--until).PATCHED / NOT_APPLICABLE / MITIGATED / VULNERABLE / UNKNOWN.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 --since 2026-06-01 --until 2026-09-01 # bounded IoC window
sudo ./cve-2026-46331-audit.sh --no-banner # text report without the ASCII banner
./cve-2026-46331-audit.sh --version # print script version and exit
| الرمز | المعنى |
|---|---|
| 0 | PATCHED أو NOT_APPLICABLE (نواة أقدم من الخطأ) |
| 1 | MITIGATED (التخفيف نشط، النواة لا تزال عرضة، ثبّت الترقيع على أي حال) |
| 2 | VULNERABLE (تحقق شرط أساسي واحد أو أكثر، لا توجد نواة مُصلحة) |
| 3 | UNKNOWN (تعامل معه كمشتبه به في سياقات المشاركة / CI / Kubernetes) |
| 4 | ERROR (تعذّر تشغيل السكربت؛ أدوات مفقودة أو بيئة غير سليمة) |
راجع examples/sample-output.txt للحصول على تشغيل كامل، وexamples/sample-output.json للاطلاع على صيغة JSON.
الدرجة هي مزيج مرجّح من:
| الإشارة | الوزن |
|---|---|
حكم المورّد VULNERABLE | +50 |
حكم المورّد UNKNOWN | +30 |
act_pedit مدمج في النواة | +25 |
act_pedit قابل للتحميل، دون تجاوز | +20 |
act_pedit قابل للتحميل، التجاوز أو القائمة السوداء نشطة | +5 |
act_pedit محمّل حالياً | +5 |
| userns+netns غير مميّز قابل للوصول، دون بوابة AppArmor | +15 |
| userns+netns غير مميّز قابل للوصول، بوابة AppArmor نشطة | +8 |
| تم العثور على مؤشرات اختراق (IoCs) في نافذة البحث | +10 |
بحد أقصى 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
# 1a) Hard block via modprobe install override (strongest).
echo 'install act_pedit /bin/true' | sudo tee /etc/modprobe.d/disable-act_pedit.conf
# 1b) `blacklist act_pedit` only stops the autoload on kernels 6.9+, which
# request the "net-act-pedit" alias. Older kernels load it by name and
# ignore the blacklist, so prefer 1a. Check your kernel:
modinfo -F alias act_pedit | grep -qx net-act-pedit && echo "blacklist works here"
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
# Option 2b: restrict network namespaces (breaks the CAP_NET_ADMIN acquisition path).
# Less disruptive than disabling all user namespaces, but still breaks some container tooling.
sudo sysctl -w user.max_net_namespaces=0
الإصلاح الحقيقي هو تحديث نواة من المورّد مع إعادة تشغيل. uname -r بعد إعادة التشغيل هو الشيء الوحيد الذي يثبت ذلك.