
pedit COW
CVE-2026-46331 (الملقب "pedit COW") هو ثغرة رفع صلاحية محلية في نواة لينكس ضمن نظام التحكم في حركة المرور. يمكن لمستخدم غير مميز (في نطاق شبكة غير مميز) تكوين فلتر act_pedit (محرر الحزم) لإحداث كتابة جزئية للنسخ عند الكتابة (COW) في ذاكرة التخزين المؤقت للصفحات. ونتيجة لذلك، تقوم النواة بكتابة بيانات يتحكم بها المهاجم في الصورة الذاكرية لملف دون وضع علامة على الصفحة كخاصة، مما يفسد النسخة المخبأة من ذلك الملف. بشكل حاسم، يتطلب الاستغلال فقط CAP_NET_ADMIN (يمكن الحصول عليها في نطاق مستخدم) ولا يعدّل الملف على القرص. عملياً، تم نشر إثبات المفهوم (PoC) عامل يُسمى packet_edit_meme في 17 يونيو 2026، يوضح كيفية استبدال صورة ذاكرة التخزين المؤقت لملف ثنائي setuid (مثل /bin/su) لإطلاق شل جذر. ينبع الثغرة من حساب غير صحيح لنطاق COW في tcf_pedit_act() وقد تم إصلاحه في النواة الرئيسية (4 يونيو 2026) عن طريق نقل التحقق من المنطقة القابلة للكتابة إلى الحلقة الخاصة بكل مفتاح.
act_pedit. الإصدارات المستقرة غير المُصححة (بما في ذلك نوى توزيعات عديدة) معرضة للثغرة.tc، ويستبدل نقطة الدخول ELF لملف ثنائي setuid في الذاكرة بكود شيل.skb_ensure_writable() داخل حلقة المفاتيح). كحل بديل، منع أو تفريغ وحدة act_pedit أو تعطيل نطاقات المستخدم غير المميزة (مثل sysctl user.max_user_namespaces=0). بعد التخفيف، إسقاط المخابئ (echo 3 > /proc/sys/vm/drop_caches) لإزالة أي صفحات مسمومة.يقدم هذا التقرير تحليلاً تقنياً مفصلاً لـ CVE-2026-46331: سببه، استغلاله، اكتشافه، واستراتيجيات المعالجة، مع مراجع لإشعارات البائعين، CVEs، والاستغلال العام.
تعريف: CVE-2026-46331 هو خلل في الكتابة خارج النطاق في النظام الفرعي مراقبة حركة المرور (net/sched) في نواة لينكس، وتحديداً في إجراء act_pedit (محرر الحزم). تقوم الدالة tcf_pedit_act() بحساب نطاق "النسخ عند الكتابة" لعمليات تحرير الحزم قبل التكرار على المفاتيح المكتوبة، باستخدام تلميح ثابت tcfp_off_max_hint. ومع ذلك، بعض المفاتيح (مثل تعديلات رأس TCP/UDP) تحدد إزاحة البايت النهائية فقط في وقت التشغيل. لا يقوم الكود أبداً بإعادة التحقق من قابلية الكتابة لهذه الإزاحات الديناميكية. ونتيجة لذلك، يمكن أن تحدث كتابات خارج المنطقة التي تم نسخها مسبقاً: جزء من كتابة الحزمة لا يتم جعله خاصاً أبداً، مما يؤدي إلى COW جزئي. تنتشر هذه الكتابة الخاطئة إلى ذاكرة التخزين المؤقت المشتركة لملف (إذا كانت مخازن الحزم تشير إلى صفحات ملف)، مما يفسد صورة الملف المخبأة.
خلفية: يسمح إجراء محرر الحزم (pedit) في لينكس للمسؤولين بإعادة كتابة بايتات عشوائية داخل رؤوس الحزم (طبقة الربط أو الشبكة أو النقل) أثناء مرور الحزم عبر فلتر tc مهيأ. يعمل بتحديد إزاحة (قد تكون مثبتة على رأس) وقيمة/قناع 32 بت. داخلياً، يعمل pedit على مخازن المقابس (sk_buff) ويجب جعل ذاكرة الحزم المستهدفة قابلة للكتابة قبل تعديلها (عبر skb_ensure_writable() بطريقة COW). من الناحية المثالية، يجب على النواة استنساخ (نسخة خاصة) أي صفحات مشتركة قبل الكتابة لتجنب تغيير الذاكرة المستخدمة في مكان آخر.
السبب الجذري: في tcf_pedit_act()، يحسب الكود النطاق القابل للكتابة مرة واحدة فقط مسبقاً، باستخدام tcfp_off_max_hint (أقصى إزاحة ثابتة). هذا التلميح لا يتضمن أي إزاحة رأس وقت التشغيل التي تضيفها المفاتيح المكتوبة عند معالجة الحزمة. المفاتيح مثل TCP أو UDP يمكنها حساب إزاحة بناءً على موقع رأس IP في وقت التشغيل (على سبيل المثال، إذا قام مفتاح سابق بنقل رأس الشبكة). وبالتالي، أثناء حلقة المفاتيح، قد تتجاوز الإزاحة الفعلية لمفتاح النطاق الذي تم تخصيصه مسبقاً كقابل للكتابة. ثم يكتب الكود في ذاكرة الحزمة عبر skb_store_bits()، ولكن نظراً لأن الصفحة خارج المنطقة التي تم نسخها مسبقاً لم تُجعل خاصة، فإن الكتابة تفسد صفحة لا تزال مشتركة مع ذاكرة التخزين المؤقت للصفحات. باختصار، "حساب نطاق الحزمة القابل للكتابة مبكراً جداً" يسبب كتابة خارج النطاق عبر الصفحات. كما أن الإزاحات السالبة (مثل تحرير رأس إيثرنت عند الدخول) لم تتم معالجتها بشكل صحيح، وحتى offset_valid() تفتقر إلى حماية ضد INT_MIN، مما يزيد من العيب.
لماذا يحدث: هذا الخلل هو في الأساس خطأ منطقي في حساب نطاق النسخ عند الكتابة. افترضت النواة أن أقصى إزاحة ثابتة (المعروفة وقت التحميل) كافية لجميع التعديلات. فشلت في تحديث نطاق COW عند تطبيق المفاتيح ذات الإزاحات الديناميكية فعلياً. بعد سلسلة من التعديلات المصفوفة، قد تقع الكتابة النهائية خارج المنطقة التي تم التحقق منها مسبقاً. نظراً لأن مخازن الحزم قد تشير إلى صفحات ملفات معممة في الذاكرة (مثلاً عبر آليات النسخ الصفري)، يمكن لهذه الكتابة "COW الجزئي" أن تصل إلى ذاكرة التخزين المؤقت لملف على القرص. عملياً، قد يستقبل إجراء محرر الحزم صفحات من sendfile أو splice؛ وبالتالي يمكن لعملية فلتر حزمة واحدة كتابة بيانات يختارها المهاجم بشكل غير مباشر في الصورة الذاكرية لملف، دون تغيير القرص.
المكونات وتدفق البيانات: يقع الكود المعرض للثغرة في النظام الفرعي net/sched في لينكس (act_pedit.c). عندما تتطابق حزمة مع قاعدة pedit مهيأة، يتم استدعاء tcf_pedit_act(). داخلياً تستدعي skb_ensure_writable(skb, X) مرة واحدة بالضبط، حيث X = tcfp_off_max_hint. هذا يجعل أول X بايت من الحزمة خاصة (مستنسخة عند الكتابة). ثم، في حلقة على كل مفتاح (عملية تحرير)، تحسب الإزاحة الفعلية للكتابة للمفتاح بإضافة إزاحة الرأس وقت التشغيل إلى الإزاحة المحددة للمفتاح، وتكتب قيمة 32 بت في الحزمة. في شبه كود:```c
u32 off_max = action->tcfp_off_max_hint;
skb_ensure_writable(skb, off_max);
for (i = 0; i < num_keys; i++) {
u32 hdr_off = compute_header_offset(skb, key[i].hdr_type);
u32 write_off = hdr_off + key[i].offset;
skb_store_bits(skb, write_off, &key[i].value, 4);
}
لأن `hdr_off` يُحسَب فقط عند معالجة كل مفتاح، فإن الاستدعاء الأولي لـ `skb_ensure_writable()` لم يأخذه في الحسبان. إذا تجاوز `hdr_off + key[i].offset` القيمة `off_max`، فإن الكود يتراجع إلى `skb_store_bits()` على الأجزاء (fragments) بدلاً من المنطقة الخطية الرئيسية، مما يعني أنه يكتب في صفحة لم تُجعل خاصة. هذه هي نقطة الفشل.
**سطح الهجوم:** الواجهة الوحيدة المطلوبة هي **مرشح tc** مع إجراء `pedit`، والذي يتطلب عادةً صلاحية **CAP_NET_ADMIN**. ومع ذلك، يمكن للمستخدمين العاديين الحصول على CAP_NET_ADMIN داخل مساحة اسم شبكة خاصة (استنساخ مساحة اسم المستخدم) دون امتيازات حقيقية. وبالتالي، يمكن لمستخدم غير مميز الدخول إلى مساحة اسم مستخدم+شبكة وإنشاء قاعدة `tc pedit` على loopback. يحدث الكتابة عند معالجة حزمة (عادةً ما يُولّد المهاجم حركة مرور على loopback لتفعيلها). يتم عبور حدود الثقة (مستخدم مقابل نواة) لأن النواة وثقت في إعداد COW الخاص بها، لكن الإزاحات التي قدمها المستخدم حطمت هذا الافتراض.
**الآلية الداخلية:** على جانب النواة، يظهر الثغرة كـ **كتابة خارج النطاق** (CWE-787). فهي تُفسد ذاكرة النواة التي تم تعيينها في مساحة المستخدم (ذاكرة تخزين صفحات الملفات). على وجه التحديد، يمكنها الكتابة فوق محتويات أي صفحة ملف تحدث مصادفةً أن تكون معينة في المخزن المؤقت للمقبس (socket buffer). في الإثبات العملي (proof-of-concept)، تم تعيين `/bin/su` في الذاكرة (mmapped) عن طريق إرساله إلى المخزن المؤقت للمقبس، لذا يقوم الاستغلال بقلب بايتات نقطة الدخول الخاصة به في الذاكرة. هذا لا يُعدّل الملف على القرص، لكن أي تنفيذ لاحق لهذا البرنامج الثنائي سيقرأ الصورة المسمومة من الذاكرة المخبأة. يُلاحظ تحليل المدونة:
> “نظرًا لأن skb يمكنه الرجوع إلى صفحات النسخ الصفري (zero-copy) المسحوبة عبر sendfile، فإن تلك الكتابة خارج النطاق يمكن أن تصل إلى ذاكرة مشتركة لصفحات الملفات (page-cache memory) تدعم ملفًا حقيقيًا. تعتقد النواة أنها جعلت ذاكرة الحزمة آمنة للتعديل؛ في الواقع، تصل الكتابة اللاحقة إلى المنطقة خارج ما جعلته خاصًا بالفعل.”
**حدود الثقة:** افترضت النواة خطأً أن `skb_ensure_writable()` (مسار COW السريع) سيضمن السلامة لجميع عمليات الكتابة اللاحقة. لم تقم بإعادة التحقق لكل مفتاح. يتحكم المستخدم فقط في تكوين مرشح الحزمة ومحتوى الحزمة؛ وقد منحت النواة ذلك (عبر مساحات أسماء الشبكة). بمجرد انتهاك هذه الثقة، هربت الكتابة إلى ذاكرة مدعومة بملفات كان يجب أن تكون محمية.
## تحليل السبب الجذري
السبب الجذري هو **حساب غير صحيح لنطاق COW في إجراء pedit**. بمصطلحات الكود، تم استدعاء `skb_ensure_writable()` واحدة بطول يستند إلى `tcfp_off_max_hint`، ثم داخل الحلقة يمكن أن تتجاوز الإزاحات الفعلية هذا الحد. يُصلح تصحيح صغير (مايو 2026) ذلك عن طريق نقل `skb_ensure_writable()` *داخل* الحلقة، بعد معرفة الإزاحة الحقيقية، وعن طريق إضافة فحوصات ومعالجة خاصة للإزاحات السالبة. بعبارة أخرى:
- **الكود المعيب:** ```c
skb_ensure_writable(skb, action->tcfp_off_max_hint);
for each key:
// compute offset (hdr_off + key_offset)
skb_store_bits(skb, write_off, ...);
بالإضافة إلى ذلك، يضمن التصحيح أنه بالنسبة للإزاحات السلبية (تعديلات رأس إيثرنت) يستخدم skb_cow() على مساحة الرأس، ويحمي من حالات INT_MIN. تنص رسالة الالتزام (ملخص stack.watch): "الإصلاح عن طريق نقل skb_ensure_writable() داخل حلقة لكل مفتاح حيث يكون إزاحة الكتابة الفعلية معروفة، وإضافة التحقق من الفائض على حسابات الإزاحة.".
وبالتالي، سبب وجوده: أثناء مراجعة الكود أو التصميم، تم تجاهل إعادة الحساب لكل مفتاح. تخطى تحسين التلميحات الثابتة الحاجة إلى إعادة التقييم لكل مفتاح. يبدو أنه خطأ صادق وليس سهوًا خبيثًا، لكن تأثيره شديد لأنه ينتهك افتراض النسخ عند الكتابة (COW). كما تلاحظ TuxCare، تم دمج هذا الخطأ تحت ستار إصلاح روتيني لـ"فساد البيانات"، بدون سياق أمني فوري.
تم تقديم الثغرة الأمنية بواسطة التزام النواة 8b796475fd78 (مايو 2022) وظلت غير ملحوظة حتى أوائل 2026. وفقًا للمصادر، تم تقديم الإصلاح (الالتزام 899ee91156e5 في 31 مايو 2026) إلى القائمة البريدية netdev كتصحيح عادي لفساد البيانات. قام مسؤولو النواة بدمج الإصلاح (net-7.1-rc7) في 4 يونيو 2026. فقط في 16 يونيو 2026 تم تعيين CVE-2026-46331 رسميًا (بعد حوالي أسبوعين من ظهور التصحيح). ظهر استغلال عام مسلح بالكامل في 17 يونيو 2026 (إثبات المفهوم packet_edit_meme).
عمليًا، كان التسلسل:
لاحظت عدة أطراف الثغرة من خلال التصحيح المفتوح. على سبيل المثال، نشر Massimiliano Oldani (باحث في الأمن السيبراني) مقالة مفصلة واستغلال بعد فترة قصيرة، مشيرًا إلى أن "استغلالًا عامًا وعمليًا لإثبات المفهوم يُسمى packet_edit_meme ظهر على GitHub خلال 24 ساعة من تعيين CVE". نشرت CloudLinux وTuxCare وSentinelOne تحليلات بمجرد أن أصبح استغلال إثبات المفهوم عامًا وتم تعيين CVEs. كما لخص متتبع أمان Debian وPT DBugs المشكلة والتحذيرات المتاحة (انظر المراجع).
يتطلب هجوم واقعي شروطًا مسبقة ضئيلة:
قدرات المهاجم: مستخدم محلي غير مميز على الجهاز المستهدف. يجب أن يكون المستخدم قادرًا على إنشاء مساحة اسم مستخدم جديدة مع مساحة اسم شبكة (عبر unshare(CLONE_NEWUSER|CLONE_NEWNET))، مما يمنح CAP_NET_ADMIN داخل تلك المساحة بدون صلاحيات جذر حقيقية. مساحات أسماء المستخدمين غير المميزة ممكنة افتراضيًا على العديد من النوى (مثل RHEL، Debian) ويمكن إعادة تمكينها على Ubuntu باستخدام حل بديل لـ aa-exec.
شروط الهدف: يجب أن يعمل الهدف بنواة لينكس ضعيفة (تقريبًا 5.18–7.1-rc6) مع توفر وحدة act_pedit. إذا كانت act_pedit مدمجة أو محملة بالفعل، فهي قابلة للاستغلال فورًا. إذا كانت وحدة، يتم تحميلها تلقائيًا عند تكوين قاعدة tc pedit. يجب ألا يكون الهدف قد طبق التصحيح المنبع. بشكل ملحوظ، ليس من الضروري أن يكون للمهاجم صلاحية كتابة لأي ملف؛ يعمل الاستغلال عن طريق الكتابة عبر فلاتر الحزم.
سلسلة الهجوم:
unshare --map-root-user --net --pid bash لإنشاء مساحة اسم مستخدم+شبكة جديدة. يمنح هذا CAP_NET_ADMIN في تلك المساحة (يتم تعيين المستخدم إلى الجذر داخليًا).ifconfig lo up) ويختار بدء مستمع (مثل nc -l 127.0.0.1 9999). يوفر هذا تدفق حزم لاستخدامه في إجراءات tc.التأثير: إذا نجح الاستغلال، يحصل المهاجم على صلاحيات جذر كاملة محليًا. يمكن تنفيذ الاستغلال بأمر واحد وهو حتمي. بالإضافة إلى ذلك، يمكن أن يتسبب فساد الصفحات المدعومة بملفات عشوائية في حرمان من الخدمة (تعطل النظام) إذا تم استخدامه بشكل مختلف. استبدل الاستغلال المنشور على وجه التحديد نقطة دخول /bin/su بشيفرة قشرة، ولكن يمكن استهداف أي ملف يمكن للمهاجم تعيينه. لا تتطلب السلسلة توقيتًا أو حالة سباق خاصة وقد تم إثباتها على العديد من التوزيعات (RHEL، Ubuntu، Debian، إلخ.).
استغلال عام، packet_edit_meme، متاح على GitHub (sgkdev/packet_edit_meme) ويستهدف /bin/su. نصف منطقه الأساسي بدون حمولات مدمرة:```c
/* Pseudocode outline of the exploit (simplified) /
int main() {
/ 1. Identify a setuid binary (su) and its ELF entry offset */
int fd = open("/bin/su", O_RDONLY);
long entry = elf_entry_offset(fd);
if (entry < 0) abort();
printf("Target %s (UID=%d), entry offset 0x%lx\n", "/bin/su", getuid(), entry);
/* 2. Unshare user+net namespace to get CAP_NET_ADMIN locally */
if (unshare(CLONE_NEWUSER | CLONE_NEWNET) < 0) abort();
/* Map UID/GID to root (handled via /proc/self/uid_map, /gid_map) */
// (omit details: write "0 <uid> 1" to /proc/self/uid_map and gid_map, and deny setgroups)
/* 3. Setup environment: bring up loopback and listener */
if (system("ip link set lo up") < 0) abort();
if (system("nc -l 127.0.0.1 9999 &") < 0) abort();
/* 4. Configure a tc pedit action via netlink (simplified) */
// Assume 'pedit_write' sends a packet-edit command to the kernel.
// The key offsets below are chosen such that they exceed the initial COW range.
char shellcode[/*size=48*/] = {
// (assembly for setgid(0); setuid(0); execve("/bin/sh").., padded to 36 or 48 bytes)
};
size_t total = sizeof(shellcode), sent = 0;
while (sent < total) {
int chunk = min(PEDIT_MAX_WRITE, total - sent);
/* Issue TC pedit action to write next chunk */
if (pedit_write(fd, entry + sent, &shellcode[sent], chunk) != 0) {
fprintf(stderr, "pedit_write failed\n");
exit(1);
}
sent += chunk;
}
/* 5. Trigger execution of su (in original namespace) */
execl("/bin/su", "su", NULL); // This will run the poisoned binary as root
return 0;
}
يوضح هذا الشبه كود التدفق: افتح `/bin/su`، قم بإلغاء مشاركة مساحات الأسماء للحصول على CAP_NET_ADMIN، قم بتكوين الحلقة المغلقة وقواعد pedit لـ TC، ثم قم باستدعاء دالة `pedit_write(fd, offset, data, len)` (في PoC الفعلي يستخدم هذا استدعاءات netlink تحت الغطاء) لاستبدال ذاكرة التخزين المؤقت للصفحات الهدف. أخيرًا، يتم تنفيذ الثنائي، مما يؤدي إلى ظهور شل الجذر.
إن PoC الفعلي أكثر تفصيلاً (يتعامل مع خرائط UID/GID، والاستماع الشبكي، وبايتات شل كود على مستوى استدعاء النظام)، لكن المفهوم الأساسي كما هو مذكور أعلاه. نؤكد **عدم تشغيل هذا الاستغلال** إلا في بيئة اختبار آمنة، وعدم استهداف أي نظام حقيقي. ما سبق هو للعرض التوضيحي فقط.
**ملاحظة:** إذا لم يكن هناك PoC عام آمن للاستخدام، لكنا صرحنا بذلك صراحة. في هذه الحالة، PoC عام، ونصفه من الناحية النظرية. لقد حذفنا بايتات شل كود الخام وتفاصيل netlink الفعلية للإيجاز والأمان.
## تدفق الاستغلال
1. **نقطة الدخول:** يجب على المهاجم أولاً الحصول على CAP_NET_ADMIN. عادةً، يعني هذا إنشاء مساحة اسم مستخدم+شبكة (`unshare`) من عملية غير مميزة، مما يمنح CAP_NET_ADMIN محليًا في مساحة الاسم.
2. **الوصول الأولي:** داخل مساحة الاسم هذه، يمكن للمهاجم استخدام الأدوات العادية (`ip`، `tc`) لتكوين التحكم في حركة المرور. مسار كود `act_pedit` للنواة أصبح الآن قابلاً للوصول للحزم.
3. **المشغل:** يقوم المهاجم بإعداد `tc filter ... action pedit` على واجهة الحلقة المغلقة. يقوم هذا المرشح بمطابقة الحزم (مثل تطابق 0) ويحدد مفتاحًا واحدًا أو أكثر **مكتوبة** مع أنواع رؤوس (IP، TCP) وإزاحات. يتم اختيار الإزاحات بحيث *بعد أن تقوم النواة بحساب قاعدة الرأس داخل الحلقة*، يتجاوز إزاحة الكتابة النهائية نطاق COW الأولي.
4. **الاستغلال:** عندما تتم معالجة حزمة تطابق المرشح، تستدعي النواة `tcf_pedit_act()`. تقوم بإجراء `skb_ensure_writable()` *غير كافٍ* ثم تكرر المفاتيح. بالنسبة لمفتاح واحد على الأقل، تهبط الكتابة على صفحة لم *يتم* استنساخها إلى نسخة خاصة. يتسبب هذا في **كتابة خارج النطاق** في ذاكرة التخزين المؤقت المشتركة للصفحات. إذا تم تحضير مخزن المقبس للإشارة إلى صفحات ملف (عبر sendfile/splice)، فإن تلك الكتابة تفسد صفحات الملف تلك.
5. **ما بعد الاستغلال:** تم كتابة شل كود المهاجم في ذاكرة التخزين المؤقت للصفحات للثنائي الهدف (مثل `/bin/su`). يقوم المهاجم (في مساحة الاسم الأصلية) بعد ذلك بتنفيذ `/bin/su`. تقرأ النواة الصورة في الذاكرة (مع الحمولة المحقونة) وتشغل شل الكود، مما يمنح المهاجم شل جذر. في هذه المرحلة، حدث اختراق كامل للنظام.
6. **التأثير:** يحصل المهاجم على صلاحيات الجذر. يمكن استبدال البيانات السرية ولكن لا يتم تسريبها مباشرة. يتم كسر النزاهة بالكامل (يمكن للمهاجم تغيير صورة ذاكرة أي ملف). يمكن أيضًا التأثير على التوفر (قد تؤدي كتابة خاطئة للصفحات الحرجة إلى تعطل العمليات أو النظام). مقاييس CVSS: متوسط إجمالي (CVSS 3.1=6.0)، لكن التأثير الفعلي هو جذر محلي شديد.
يتم تلخيص هذا التدفق بشكل رسم بياني:```mermaid
flowchart LR
A[Attacker (unprivileged user)] --> B[Unshare into user+net namespace<br>(gains CAP_NET_ADMIN)]
B --> C[Configure TC pedit filter on lo]
C --> D{Packet processing by kernel}
D --> E[act_pedit computes wrong COW range]
E --> F[skb_store_bits writes beyond COW'd region]
F --> G[Page cache of target file is corrupted]
G --> H[Attacker executes poisoned setuid binary]
H --> I[Root shell obtained]
act_pedit في lsmod بشكل غير متوقع على الأنظمة التي لا تستخدم عادةً tc pedit (مثل أن يكون lsmod | grep act_pedit غير فارغ على خوادم الويب).tc: أوامر tc غير عادية أو رسائل netlink من عمليات غير مميزة. قد تظهر سجلات التدقيق منح CAP_NET_ADMIN لعملية غير جذرية.nc أو مستمع مخصص على 127.0.0.1 في netstat -tulnp يمكن أن يكون علامة.tcf_pedit_act أو skb_ensure_writable أو أقفال لينة (soft lockups) أثناء حركة مرور كثيفة على الحلقة المحلية أو أخطاء في معالجة tc (ستكون هذه غير عادية وتشير إلى تلف).على سبيل المثال، أحد مؤشرات الهجوم (IOA) هو الملفات التالفة في ذاكرة التخزين المؤقت للصفحات: قد تتضمن قائمة الفحص التحقق من محتوى الملف في الذاكرة مقابل القرص، خاصةً للثنائيات setuid بعد نشاط tc مكثف. مؤشر آخر هو إنشاء مساحة اسم جديدة: مراقبة استدعاءات unshare(CLONE_NEWUSER|CLONE_NEWNET) يمكن أن ترفع علامة. باختصار، يجب على المدافعين مراقبة أي من: استخدام act_pedit، استخدام userns، والتعديلات المفاجئة للقابلات للتنفيذ في ذاكرة الوصول العشوائي.
لاكتشاف محاولات الاستغلال:
tc أو رسائل netlink التي تضيف فلتر act_pedit. على سبيل المثال، يمكن لقواعد Sigma البحث عن أحداث تحتوي على TCA_ACT_KIND: pedit أو ما شابه. راقب سجلات التدقيق بحثاً عن capset CAP_NET_ADMIN من عمليات غير جذرية، أو كتابات إلى /proc/*/uid_map./bin/su (أو ثنائيات حساسة أخرى) وتنفذها فجأة بالتزامن مع استدعاءات مساحة الاسم/unshare. نبه على أي عملية تفتح ثنائي setuid وتنشئ userns.skb_ensure_writable() لا يمكن خداعها (على الرغم من عدم وجود فحص مدمج معروف).باختصار، يجب على المدافعين تسجيل وتدقيق استخدام مساحة اسم المستخدم، أوامر tc، وتحميل الوحدات. أحد الأساليب الرئيسية: رفض أو تسجيل أي استدعاء لـ tc pedit من مستخدمين غير موثوقين. على المضيفات المخترقة، تحقق مما إذا تم تطبيق /etc/modprobe.d/disable-act_pedit.conf (يجب أن يكون مطبقاً استباقياً).
تطبيق التصحيحات: الإصلاح الأساسي هو تحديث النواة. جميع التوزيعات الرئيسية أصدرت تحديثات في يونيو 2026. الترقية إلى نواة مصححة (Linux 7.1.0 أو أحدث، أو الإصدارات الخلفية للتوزيعات) هو الحل النهائي.
تغييرات التكوين: إذا لم يكن التصحيح ممكناً فوراً، قم بتطبيق إجراءات التخفيف:
act_pedit: إذا كانت أعباء العمل لديك لا تتطلب tc pedit، قم بإدراج الوحدة في القائمة السوداء. على سبيل المثال: ```
echo 'install act_pedit /bin/true' | sudo tee /etc/modprobe.d/disable-act_pedit.conf
lsmod | grep -w act_pedit && sudo rmmod act_pedit
هذا يضمن عدم تحميل الإجراء. (يوصى بذلك من قبل CloudLinux وTuxCare.) لا تقم بتطبيقه على المضيفين الذين يستخدمون tc pedit بشكل شرعي.
على Ubuntu 22.04+: ``` sudo sysctl -w kernel.unprivileged_userns_clone=0 echo 'kernel.unprivileged_userns_clone = 0' | sudo tee /etc/sysctl.d/99-pedit-cow.conf
يمنع هذا المستخدمين غير المميزين من إنشاء مساحة اسم المستخدم اللازمة للحصول على CAP_NET_ADMIN. ملاحظة: قد يؤدي تعطيل مساحات الأسماء إلى تعطيل الحاويات بدون صلاحيات جذر وبعض التطبيقات المعزولة.
- **إسقاط ذاكرة التخزين المؤقت للصفحات (الاحتواء):** إذا اشتبهت في أن الاستغلال قد تم تشغيله، فقد تكون النسخ في الذاكرة من البرامج الثنائية مسمومة. قم بإسقاط ذاكرات التخزين المؤقت فورًا لطردها: ```
sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
هذا يجبر الصفحات على إعادة التحميل من القرص. ملاحظة: إذا كان المهاجم قد حصل بالفعل على صلاحيات الجذر (root)، فإن تفريغ الذاكرة المخبئية لن يزيل أي استمرارية قام بتثبيتها. تعامل مع هذه المضيفات باعتبارها مخترقة.
الحد الأدنى من الصلاحيات: قم بمراجعة وتقييد من يمكنه استخدام tc. الاستغلال يحتاج فقط إلى CAP_NET_ADMIN؛ تأكد من أن المسؤولين الموثوقين فقط لديهم هذه الإمكانية. استخدم RBAC أو الحاويات لتقييد منح الصلاحيات.
التحكم في الشبكة: على الرغم من أنه ليس قابلاً للاستغلال عبر الشبكة بشكل مباشر، تأكد من مراقبة استخدام الحلقة المحلية (loopback). جدار ناري لـ 127.0.0.1 غير عملي، لكن تأكد من استخدام حركة المرور المحلية فقط لعمليات TC.
تنبيهات البائعين: راجع التنبيهات الرسمية لنظام التشغيل الخاص بك. لدى Red Hat تنبيه RHSA-2026:27354 (وما يتعلق به) لـ RHEL 8/9/10، وDebian لديه DSA-6355-1، وصفحة CVE الخاصة بـ Ubuntu تدرج النواة المعدلة، إلخ. (انظر المراجع).
تتضمن المعالجة طويلة المدى ضمان أن جميع الأنظمة المتأثرة تعمل على نواة محدثة. يجب تثبيت حزم النواة التي تحتوي على الإصلاح وإعادة تشغيل الأنظمة. بالنسبة للحاويات أو الأنظمة غير القادرة على إعادة التشغيل، فكر في حلول التصحيح المباشر (مثل KernelCare) التي أعدت تصحيحات.
بالإضافة إلى ذلك، يجب أن يفترض تصميم النظام أن واجهات النواة التي يمكن الوصول إليها من مساحة المستخدم يمكن أن تتغير بمرور الوقت. تقييد CAP_NET_ADMIN وتصفية استخدام tc هما ممارستان جيدتان تتجاوزان هذا الخطأ.
إذا حدث اختراق، أعد بناء النظام. الثغرة تسمم ذاكرة التخزين المؤقت للصفحات فقط، لكن المهاجم ذو صلاحيات الجذر قد يكون قام بأعمال ضارة أخرى؛ التحقق الجنائي ضروري. لا تعتمد على فحوصات سلامة الملفات بعد الاستغلال، لأنه كما ذكرنا، تترك PoC الملفات على القرص سليمة. إعادة التشغيل والتحديث هما مسار المعالجة الآمن.
السرية: لا يوجد تسرب مباشر للبيانات، نظرًا لأن هذا الخطأ لا يقرأ بيانات حساسة من النواة. إنه يكتب فقط بيانات المهاجم في الذاكرة. يقوم CVSS v3.1 بتقييم تأثير السرية على أنه لا شيء (C:N).
السلامة: عالية (I:H). يمكن للمهاجم تغيير محتويات الذاكرة لصفحات ملفات عشوائية (مثل الملفات التنفيذية، ملفات التكوين) دون إذن. هذا يسمح بانتهاك كامل لسلامة تلك الملفات في النظام الجاري.
التوفر: عال (A:H). استبدال الذاكرة التي تديرها النواة أو هياكل البيانات الحيوية يمكن أن يتسبب في تعطل العمليات أو النظام بأكمله. حتى لو لم يتم استغلاله لـ shellcode، يمكن استخدام الخطأ لإفساد الصفحات الحيوية والتسبب في رفض الخدمة.
النطاق: غير متغير (المكون الضعيف = ناقل الهجوم = نطاق الضحية) لأن الاستغلال محلي.
بالنظر إلى هذه العوامل، متجه CVSS v3.1 النموذجي هو AV:L/AC:L/PR:H/UI:N/S:U/C:N/I:H/A:H، مما يعطي درجة أساسية 6.0 (متوسط). لاحظ مع ذلك أن CVSS لا يلتقط أن هذه الثغرة تمنح رفع الصلاحيات إلى الجذر، وهو أمر حرج عمليًا. (بعض المصادر حسبت CVSSv4 لثغرات مماثلة؛ على سبيل المثال يسرد PT DBugs 8.5 على CVSSv4.)
غالبًا ما يتم تصنيف الخطورة على أنها هامة/حرجة من قبل البائعين. تنبيه Red Hat لهذا CVE يصنفه على أنه هام، وتصنفه AWS على أنه متوسط (CVSS 6.0). في أي حال، نظرًا لأنه يتم الحصول على صلاحيات الجذر، فإن الخطر العملي يكون أعلى في الأنظمة متعددة المستخدمين أو المشتركة.
تنتمي هذه الثغرة إلى عائلة من أخطاء تسميم ذاكرة التخزين المؤقت للصفحات. تشمل CVEs البارزة الأخرى:
CVE-2022-0847 (“Dirty Pipe”): خطأ LPE مشابه في Linux 5.8+ حيث يمكن لـ splice() على pipe الكتابة إلى ذاكرة التخزين المؤقت للصفحات خارج حدود COW. كما سمح باستبدال الملفات في الذاكرة (بدون تغيير القرص).
CVE-2016-5195 (“Dirty COW”): ثغرة أقدم في /proc/self/mem للنسخ عند الكتابة (copy-on-write) سمحت بالكتابة المحلية إلى تعيينات للقراءة فقط.
CVE-2020-14386 (“Dirty Frag”): ثغرة في معالجة حزم XFRM/ESP (التشفير) أدت إلى كتابات عبر الصفحات في pagecache.
CVE-2023-4099 (“Dirty Clone”): خطأ آخر في النواة متعلق بـ netfilter.
كل من هذه تتضمن مسارًا سريعًا للنواة يكتب إلى ذاكرة يعتقد أنه يمتلكها حصريًا، لكنه لا يمتلكها. CVE-2026-46331 فريد من حيث أنه يحدث في net/sched pedit action ويستفيد من مساحات أسماء المستخدمين لتجاوز قيود الصلاحيات. على عكس DirtyPipe أو Dirty COW، لا حاجة لعملية متميزة مساعدة (مثل نظام سيء التصرف) – يمكن لمستخدم واحد غير متميز تشغيله.
جميع المراجع من مصادر موثوقة (تنبيهات البائعين، تحليلات منشورة، إدخالات CVE/NVD).
act_pedit، حساب قابلية الكتابة في وقت مبكر جدًا مكن من إفساد ذاكرة التخزين المؤقت للصفحات.tclomatch u32 0 0peditskb_ensure_writable()echo '' > /dev/udp/127.0.0.1/53) لتشغيل الفلتر. تستدعي النواة tcf_pedit_act()، وتخصص نطاق COW، ثم تتكرر عبر المفاتيح. يقع كتابة مفتاح واحد على الأقل خارج المنطقة المحددة مسبقًا بـ COW، مما يتسبب في الكتابة إلى ذاكرة التخزين المؤقت للصفحة المشتركة./bin/su في المقبس عبر sendfile أو ما شابه، بحيث يشير مخزن الحز المؤقت إلى صفحات ذلك الملف. ثم تفسد الكتابة خارج النطاق النسخة الموجودة في الذاكرة من /bin/su (تحديدًا نقطة الدخول لـ ELF)./bin/su). نظرًا لأن النواة قد أدخلت شيفرة قشرة (shellcode) تقوم بـ setgid(0); setuid(0); execve("/bin/sh")، فإن تشغيل su ينتج عنه غلاف جذر (root shell). لم يتم تغيير الملف على القرص أبدًا، لذا لن تظهر أدوات تكامل الملفات على القرص أي تغيير.auditdCAP_NET_ADMIN/proc/[pid]/uid_map