
مستودع بحثي لـ CVE-2025-38502، وهو وصول خارج الحدود في التخزين المحلي لمجموعة BPF cgroup في نواة Linux عبر الاستدعاءات الخلفية (tail calls) مما يتيح تصعيد الصلاحيات محليًا.

Abraxas Labs · abraxaslabs.tech · github.com/abraxas · @abraxas_null
وصول خارج الحدود إلى التخزين المحلي لـ cgroup في نواة Linux عبر BPF باستخدام tail calls
| CVE | CVE-2025-38502 |
| CWE | CWE-125 — قراءة خارج الحدود |
| المورّد | Linux kernel |
| المكوّن | kernel/bpf/core.c, include/linux/bpf.h (التخزين المحلي لـ cgroup + tail calls) |
| التأثير | تلف في ذاكرة النواة المحلية؛ تصعيد الصلاحيات وارد على الأنوية غير المُرقّعة |
| ناقل الهجوم | محلي (AV:L) |
| الصلاحيات | منخفضة (PR:L) — عملية قادرة على تحميل برامج BPF من النوع CGROUP_SKB (أو برامج مكافئة مرتبطة بـ cgroup) |
| تفاعل المستخدم | لا يوجد |
| CVSS 3.1 (kernel.org CNA) | 7.8 HIGH — CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CVSS 3.1 (NVD) | 7.1 HIGH — CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:H |
| الإفصاح العام | 16 أغسطس 2025 |
| الإصلاح في المنبع | abad3d0 في 6.17-rc1؛ تم نقله إلى 6.16.1، 6.12.46، 6.6.105، 6.1.151، 5.15.192 |
للبحث / الاستخدام التعليمي فقط. لا تقم بتشغيل أو نشر أو استخدام المواد الموجودة في هذا المستودع ضد أي مضيف ما لم يكن لديك إذن كتابي صريح من كلٍّ من الجهة المستضيفة لهذا المستودع ومالك الأنظمة المستهدفة. تم العثور عليه في البرية.
اسم الملف المصدري CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c يقتطع المعرّف. السجل المنشور هو CVE-2025-38502. لا يوجد CVE في Linux بالمعرّف CVE-2025-3850.
أبلغ Lonial أن التخزين المحلي لـ cgroup BPF يمكن الوصول إليه خارج الحدود عبر tail call.
يتحقق مُدقّق eBPF من نوع كل برنامج على حدة. في وقت التشغيل، لا تبحث bpf_get_local_storage() عن خريطة البرنامج قيد التنفيذ. بل تقرأ مؤشر تخزين cgroup من current->bpf_ctx → bpf_cg_run_ctx → prog_item->cgroup_storage[]. تُملأ هذه الخانة من البرنامج المرتبط أصلاً، وليس من البرنامج الذي تم استدعاؤه عبر tail call.
إذا استدعى البرنامج A (بحجم قيمة صغير لـ BPF_MAP_TYPE_CGROUP_STORAGE) البرنامج B (بحجم قيمة كبير) عبر tail call، فإن bpf_get_local_storage() في B لا تزال تُعيد مخزن A الأصغر. عندئذٍ تتجاوز عمليات الوصول التي سمح بها المُدقّق مقابل خريطة B نهاية تخصيص A.
أُدخل هذا العيب في Linux 5.9 عبر 7d9c342 (bpf: Make cgroup storages shared between programs on the same cgroup). وتم إصلاحه بتوسيع bpf_map_owner بحقل storage_cookie[] بحيث لا تُقبل تركيبات tail-call إلا عندما يستخدم البرنامج المُستدعى نفس خرائط تخزين cgroup التي يستخدمها المُستدعي، أو لا يستخدم أيًّا منها.
هذا وصول خارج الحدود إلى كومة النواة محليًا. تتفاوت درجات الخطورة حسب المورّد لأنهم يختلفون حول ما إذا كانت البدائية "حجب خدمة للقراءة فقط" أم تلف كامل للذاكرة:
ما يعنيه ذلك عمليًا:
struct bpf_array المرشوش في نفس الـ slab/order).map->ops، اختطاف helper، commit_creds / تبديل namespace). لهذا تُصنّف هذه الشجرة المشكلة كـ LPE. تعكس درجة Red Hat الأدنى تقييمهم الخاص بمنتجاتهم، وليس غياب العلّة.لا تتطلب العلّة خدمة مواجهة للشبكة. إنها محلية. ولا تتطلب TTY، ولا مساعد setuid، ولا تفاعل مستخدم.
برنامجان لـ cgroup BPF، لكلٍّ منهما BPF_MAP_TYPE_CGROUP_STORAGE خاص به (النوع المشترك، BPF_CGROUP_STORAGE_SHARED):
| البرنامج | الدور | حجم قيمة التخزين |
|---|---|---|
| A | مرتبط / مُستدعي tail-call | صغير (مثلاً يناسب رتبة kmalloc معينة) |
| B | هدف tail-call | كبير (يسمح المُدقّق بعمليات وصول حتى هذا الحجم) |
يتحقق المُدقّق من A مقابل خريطة A ومن B مقابل خريطة B. كلاهما يمر.
في وقت التشغيل يقوم الـ helper بما يلي:
ctx = container_of(current->bpf_ctx, struct bpf_cg_run_ctx, run_ctx);
storage = ctx->prog_item->cgroup_storage[stype];
if (stype == BPF_CGROUP_STORAGE_SHARED)
ptr = &READ_ONCE(storage->buf)->data[0];
else
ptr = this_cpu_ptr(storage->percpu_buf);
prog_item هو مدخل المصفوفة الخاص بالبرنامج الذي بدأ تشغيل cgroup، وليس البرنامج قيد التنفيذ حاليًا بعد bpf_tail_call. لذلك يعمل B على كائن تخزين A.
يحدد bpf_cgroup_storage_alloc() حجم المخزن الداعم من value_size الخاص بالخريطة. مخزن A أصغر من أن يستوعب عمليات الوصول المُتحقَّق منها في B. النتيجة هي التباس نوعي لهوية الخريطة عبر نقل التحكم — نفس عائلة العلل الأخرى في BPF من نوع "الـ helper يرى خريطة مختلفة عن التي رآها المُدقّق".
جعل الـ commit 7d9c342 تخزينات cgroup مشتركة بين البرامج المرتبطة بنفس cgroup. هذا التشارك هو ما يجعل خانة سياق التشغيل مؤشرًا واحدًا بدلاً من بحث لكل برنامج، وهو السبب في أن الأنوية قبل 5.9 غير متأثرة.
BPF_PROG_TEST_RUN على برنامج من النوع BPF_PROG_TYPE_CGROUP_SKB يخصص تخزين cgroup طوال مدة الاختبار. يقع هذا التخصيص على كومة النواة بجوار أي شيء آخر تم تحريره مؤخرًا في نفس فئة الحجم — بما في ذلك خرائط struct bpf_array التي اختير value_size الخاص بها ليقع في نفس رتبة kmalloc. لذلك يمكن لتجاوز خارج الحدود من مخزن التخزين أن يصل إلى حقول bpf_map (ops، قائمة RCU، value[]) الخاصة بخريطة مصفوفة مجاورة.
هذه التفصيلة في تخطيط الكومة هي السبب في أن تحذيرًا بـ "مجرد قراءة خارج الحدود" وكتابة عن LPE يمكن أن يصفا نفس الـ CVE.
أُدخلت في: Linux 5.9 (7d9c3427894fe70d1347b4820476bf37736d2ff0)
غير متأثرة: جميع الأنوية قبل 5.9
سطر واحد:
/* CVE-2025-38502: affected 5.9–5.15.191, 5.16–6.1.150, 6.2–6.6.104, 6.7–6.12.45, 6.13–6.16.0; fixed in 5.15.192, 6.1.151, 6.6.105, 6.12.46, 6.16.1, 6.17-rc1 */
لا تزال مفتوحة في بعض الفروع المستقرة: أدرج متتبع نواة Debian الإصدار 5.10 upstream-stable / bullseye 5.10 كـ needed. لا تفترض أن كل إصدار 5.10.y مُرقّع.
أرقام ABI الخاصة بالتوزيعات مضللة. Ubuntu 5.15.0-163 هو 5.15 مُرقّع رغم أن 5.15.0 يبدو أقدم من upstream 5.15.192. قارن سجل تغييرات الحزمة / USN / DSA / ALAS / RHSA، وليس uname -r مقابل الجدول أعلاه.
أي توزيعة شحنت نواة ضمن النطاقات أعلاه كانت ضمن النطاق حتى نقلت abad3d0 (أو الـ commit المستقر المطابق). هذا كود BPF عام، وليس تصحيحًا خاصًا بتوزيعة.
Ubuntu 26.04 / 25.10 مُدرجة غير متأثرة (تفرّعت بعد الإصلاح). Ubuntu 25.04 وصلت EOL وهي لا تزال needed.
قد يطابق مضيف إصدارًا متأثرًا ومع ذلك لا يكون قابلاً للوصول. فحوصات مفيدة:
unprivileged_bpf_disabled=1 ليس إصلاحًا كاملاً — يمكن لمستخدم يمتلك صلاحية BPF أن يصطدم بالعلّة — لكنه يزيل المسار غير المُتميّز.
الـ commit في المنبع abad3d0bad72a52137e0c350c59542d75ae4f513 (bpf: Fix oob access in cgroup local storage، Daniel Borkmann).
يكتسب struct bpf_map_owner مصفوفة storage_cookie[]. عند تحديث هدف tail-call، تقوم النواة الآن بما يلي:
bpf_get_local_storage() — اشترط أن تكون خرائط تخزين cgroup الخاصة به مطابقة تمامًا لخرائط المُستدعي (نفس الكوكيز).لم يعد من الممكن تركيب أحجام قيم غير متطابقة خلف ظهر المُدقّق. لا يزال كل برنامج يُتحقق منه منفردًا؛ الفحص الجديد على الحافة بينهما.
لا تقم بـ cherry-pick للـ commit على شجرة عشوائية دون مساعدات owner/cookie المحيطة بـ BPF. استخدم النقل المستقر الخاص بسلسلتك.
uname -r
# Compare against the table above, then against your distro advisory —
# Ubuntu/Debian ABI numbers are not upstream stable numbers.
grep -E 'CONFIG_BPF_SYSCALL|CONFIG_CGROUP_BPF' \
/boot/config-$(uname -r) /proc/config.gz 2>/dev/null
sysctl kernel.unprivileged_bpf_disabled
# 0 = unprivileged bpf allowed (widest exposure)
# 1 = disabled after first privileged use, or fully disabled depending on kernel
# 2 = disabled (admin can re-enable)
أكّد الحزمة، وليس فقط سلسلة الإصدار:
# Debian / Ubuntu
apt changelog linux-image-$(uname -r) 2>/dev/null | grep -i 38502
# RHEL family
rpm -q --changelog kernel | grep -i 38502
نواة ≥ 6.17، أو إصدار مستقر مُدرج في عمود "أول إصلاح"، أو حزمة توزيعة من جدول الإشعارات، هي الإغلاق الفعلي.
abad3d0 / المكافئ المستقر. هذا هو الإصلاح الكامل الوحيد.kernel.unprivileged_bpf_disabled=1 (أو 2) لإسقاط المحمّلات غير المُتميّزة.CAP_BPF و CAP_PERFMON و CAP_SYS_ADMIN على المستخدمين والحاويات غير الموثوقة.seccomp، LSM، أو إسقاط تلك الصلاحيات في وقت التشغيل).BPF_PROG_TEST_RUN كافٍ لتفعيل مسار التخصيص؛ والمهاجم المحلي هو من يوفّر البرامج.CVE-2025-38502/
├── README.md
├── banner.png
├── CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c
└── ebpf_lpe.h
| الملف | ما هو |
|---|---|
banner.png | لافتة README (Abraxas Labs / CVE-2025-38502) |
CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c | مصدر بحثي تم استرجاعه في البرية (اسم الملف يقتطع معرّف CVE) |
ebpf_lpe.h | بواني تعليمات BPF المشتركة، ومساعدات الخرائط، وماكرو إزاحات النواة المستخدمة في ذلك المصدر |
يوثّق هذا الدليل الثغرة ويحتوي على شجرة البحث المقابلة. إنه ليس مجموعة استغلال جاهزة: رموز gadgets النواة (ARRAY_MAP_OPS_OFF، COMMIT_CREDS، …) هي مدخلات وقت الترجمة لـ vmlinux محدد، وتشغيل البرنامج ضد نواة حية خارج نطاق هذا الـ README.
CVE / NVD
المنبع
7d9c342 — bpf: Make cgroup storages shared between programs on the same cgroupabad3d0 — bpf: Fix oob access in cgroup local storageالنقل المستقر
التوزيعات
Abraxas Labs — للبحث / الاختبار المصرّح به فقط
هذا المستودع للبحث والتعليم.
لا تقم بترجمة أو تشغيل أو نشر أو استخدام الكود هنا بأي شكل ضد أي نظام ما لم يكن لديك تفويض كتابي صريح من كلٍّ من الجهة المستضيفة لهذا المستودع ومالك الهدف. الوصول غير المصرّح به إلى أنظمة الحاسوب جريمة.
يوفّر المؤلفون و Abraxas Labs هذه المواد كما هي، دون أي ضمان بأنها كاملة أو صحيحة أو آمنة للتنفيذ. يمكن أن يتسبب بحث استغلال النواة في تعطّل الجهاز، وإتلاف أنظمة الملفات، وفقدان البيانات. أنت تتحمل هذا الخطر.
تم العثور عليه في البرية.
| المصدر | الدرجة | السلامة | ملاحظات |
|---|
| kernel.org CNA / cve.org | 7.8 HIGH | عالية | C:H/I:H/A:H — يعامل العلّة كتأثير محلي كامل |
| NVD | 7.1 HIGH | لا يوجد | C:H/I:N/A:H — السرية + التوافر |
| Ubuntu | متوسط (7.1) | — | USN-7909 |
| Red Hat | 4.0 LOW | لا يوجد | C:N/I:N/A:L — مُقيَّم كتوافر محدود |
| Amazon Linux | 4.0 متوسط | لا يوجد | نفس متجه Red Hat |
| SUSE | 6.1 معتدل | لا يوجد | بعض إصدارات SLE 15 مُعلَّمة WONTFIX |
| السلسلة | متأثرة | أول إصلاح |
|---|
| 5.9 – 5.15 | 5.9 حتى 5.15.191 | 5.15.192 (c1c74584…) |
| 5.16 – 6.1 | 5.16 حتى 6.1.150 | 6.1.151 (66da7cee…) |
| 6.2 – 6.6 | 6.2 حتى 6.6.104 | 6.6.105 (7acfa07c…) |
| 6.7 – 6.12 | 6.7 حتى 6.12.45 | 6.12.46 (41688d1f…) |
| 6.13 – 6.16 | 6.13 حتى 6.16.0 | 6.16.1 (19341d5c…) |
| mainline | حتى وصول الإصلاح | 6.17-rc1 (abad3d0b…) |
| التوزيعة | الإصدارات / الأنوية التي كانت ضمن النطاق |
|---|
| Ubuntu | 22.04 LTS (5.15)، 24.04 LTS (6.8)، 25.04 (EOL لا تزال needed). 20.04 HWE 5.15. |
| Debian | 11 bullseye (5.10)، 12 bookworm (6.1)، 13 trixie (6.12) |
| RHEL 9 / 10، Rocky، Alma، Fedora | RHEL 9 ≈ 5.14؛ RHEL 10 ≈ 6.12؛ Fedora المتجددة 5.9–6.16 |
| SUSE / openSUSE | SLE Micro 5.3/5.4؛ بعض إصدارات SLE 15 WONTFIX |
| Amazon Linux 2023 | النواة الافتراضية و kernel6.12 |
| Amazon Linux 2 extras | 5.10 extra (لا إصلاح مخطط) و 5.15 extra |
| Arch، Gentoo، Tumbleweed | أنوية متجددة بين 5.9 وإصلاح 6.16.1 / 6.17-rc1 |
| التوزيعة | الحزمة المُصلَحة (إرشادية) | الإشعار |
|---|
| Ubuntu 22.04 | linux 5.15.0-163.173 | USN-7909 |
| Ubuntu 24.04 | linux 6.8.0-106.106 | نفسه |
| Debian 12 | linux 6.1.153-1 | DSA-6009-1 |
| Debian 13 | linux 6.12.48-1 | DSA-6008-1 |
| Debian 11 (نقل 6.1) | linux-6.1 6.1.153-1~deb11u1 | DLA-4328-1 |
| Amazon Linux 2023 | kernel / kernel6.12، 2025-09-29 | ALAS2023-2025-1210 / 1208 |
| Amazon Linux 2 5.15 extra | 2025-09-29 | ALAS2KERNEL-5.15-2025-091 |
| الشرط | لماذا يهم |
|---|
CONFIG_BPF_SYSCALL=y | يجب أن توجد bpf(2) |
CONFIG_CGROUP_BPF=y | البرامج المرتبطة بـ cgroup والتخزين المحلي لـ cgroup |
kernel.unprivileged_bpf_disabled | 0 يسمح بتحميل برامج غير مُتميّزة؛ 1/2 تتطلب CAP_BPF / CAP_PERFMON / CAP_SYS_ADMIN |
| Lockdown / LSM / seccomp | قد تحجب BPF_PROG_LOAD أو BPF_PROG_TEST_RUN |
BPF_PROG_TYPE_CGROUP_SKB (أو أنواع برامج cgroup أخرى تحمل تخزينًا محليًا) | سياق التشغيل الذي يحمل cgroup_storage[] |