
مستودع بحثي لـ CVE-2026-68121، وهو ثغرة use-after-free في نواة Linux ضمن PPPoE في الدالة pppoe_sendmsg() تتيح تصعيد الصلاحيات محليًا، مع PoC وتحليل السبب الجذري وإعداد مختبر.
PPPoEject
ثغرة إفساد الذاكرة في نواة Linux ضمن مسار إرسال PPPoE،
ناتجة عن مؤشر قديم إلى ترويسة sk_buff بعد أن تعيد دالة رد نداء ترويسة الجهاز
تخصيص رأس skb.
هذا المستودع مخصص لأبحاث الأمن المصرّح بها، وتحليل ثغرات النواة، وبيئات CTF، والاختبار الدفاعي فقط.
لا تنفّذ كود إثبات المفهوم ضد أنظمة دون تصريح صريح.
يُصنّف سجل CVE الثغرة على أنها مؤشر ترويسة PPPoE قديم قد
يصبح غير صالح عندما تعيد dev_hard_header() تخصيص رأس skb.
توجد الثغرة في:
drivers/net/ppp/pppoe.c
ضمن:
pppoe_sendmsg()
التسلسل المعرّض للثغرة من الناحية المفاهيمية:
pppoe_sendmsg()
│
▼
Save PPPoE header pointer
│
▼
dev_hard_header()
│
▼
skb head may be reallocated
│
▼
Old pointer becomes stale
│
▼
PPPoE writes through stale pointer
│
▼
Use-After-Free
│
▼
Kernel memory corruption
يسمح كود الشبكات في Linux لدوال رد نداء ترويسة الجهاز بإعادة تخصيص
رأس sk_buff. لذلك لا يمكن إعادة استخدام مؤشر إلى الرأس القديم بأمان
بعد عودة dev_hard_header().
المشكلة الأساسية هي انتهاك عمر الكائن.
تحصل pppoe_sendmsg() على مؤشر إلى ترويسة PPPoE قبل استدعاء:
dev_hard_header()
غير أن رد النداء هذا قد يتسبب في انتقال رأس skb.
من الناحية المفاهيمية:
Before callback:
skb
┌──────────────────────────────┐
│ Ethernet │ PPPoE │ Payload │
└──────────┴───────┴───────────┘
▲
│
stale pointer
After skb expansion:
old skb head ──X──► freed
new skb head
┌────────────────────────────────────┐
│ Ethernet │ PPPoE │ Payload │
└──────────┴───────┴─────────────────┘
▲
│
valid location
لا يزال المؤشر القديم يشير إلى التخصيص المحرَّر.
عندما تكتب PPPoE الترويسة لاحقًا عبر ذلك المؤشر، تنفّذ النواة كتابة استخدام-بعد-التحرير.
يتضمن التفعيل الموثّق حالة تسابق حول copy_from_user() وتغييرات
في عمليات ترويسة جهاز team.
أحد التسلسلات الموصوفة هو:
PPPoE sendmsg()
│
▼
copy_from_user() blocks
│
│
├───────────────┐
│ │
▼ ▼
Team device changes First non-Ethernet
header operations port is added
│
▼
Delegated GRE callback
│
▼
skb head expansion
│ │
└───────────────┘
│
▼
stale PPPoE pointer
│
▼
use-after-free write
يشير سجل CVE إلى أن ذلك قد يحدث عندما يُضاف أول منفذ غير Ethernet إلى جهاز team فارغ، ويقوم رد نداء ترويسة GRE المفوَّض بتوسيع رأس skb.
قد تؤدي الثغرة إلى:
متجه CVSS المنشور للثغرة هو:
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
بدرجة أساسية 7.8 High.
المكوّنات ذات الصلة هي:
PF_PPPOX / PPPoE socket
│
▼
pppoe_sendmsg()
│
▼
sk_buff (skb)
│
▼
dev_hard_header()
│
▼
Network device header callback
│
▼
Potential skb head expansion
│
▼
PPPoE stale header pointer
│
▼
UAF write
لذلك، ليس الكود المعرّض مجرد محلّل حزم PPPoE عام؛ الشرط الحرج هو التفاعل بين إرسال مقبس PPPoE وإعادة التخصيص الديناميكي لرأس skb.
عنوان الإصلاح في المنبع هو:
pppoe: reload header pointer after dev_hard_header()
يعيد الإصلاح تحميل ترويسة PPPoE عبر إزاحة ترويسة الشبكة الخاصة بـ skb بعد إنشاء ترويسة الجهاز.
الخاصية المهمة هي:
Before:
header pointer
│
▼
dev_hard_header()
│
▼
skb moves
│
▼
pointer = stale ❌
After:
dev_hard_header()
│
▼
skb may move
│
▼
reload header using skb offset
│
▼
pointer = valid ✅
تحدّث pskb_expand_head() إزاحة skb ذات الصلة عند نقل رأس skb،
مما يجعل البحث المعتمد على الإزاحة آمنًا بعد إعادة التخصيص.
يمكن تنظيم مختبر محكوم على النحو التالي:
┌───────────────────────────────────────────────┐
│ Linux VM │
│ │
│ ┌───────────────┐ │
│ │ PPPoE Socket │ │
│ └───────┬───────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ pppoe_sendmsg │ │
│ └───────┬───────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ Team │ │
│ └───────┬───────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ GRE │ │
│ └───────────────┘ │
│ │
└───────────────────────────────────────────────┘
أدوات تصحيح النواة المفيدة:
gdb
pwndbg
gef
crash
objdump
readelf
pahole
مراقبة رسائل النواة:
sudo dmesg -w
فحص دعم PPPoE:
lsmod | grep pppoe
التحقق من وحدات PPP المتاحة:
find /lib/modules/$(uname -r) -iname '*pppoe*'
تحقق من النواة قيد التشغيل حاليًا:
uname -r
تحقق من الإعدادات المتعلقة بـ PPPoE:
grep -E 'CONFIG_PPP|CONFIG_PPPOE' \
/boot/config-$(uname -r)
تشمل الخيارات النموذجية ذات الصلة:
CONFIG_PPP
CONFIG_PPP_ASYNC
CONFIG_PPP_SYNC_TTY
CONFIG_PPPOE
لأبحاث النواة المحكومة:
01. Build vulnerable kernel
↓
02. Boot isolated VM
↓
03. Enable PPPoE support
↓
04. Create controlled networking topology
↓
05. Configure team/GRE interaction
↓
06. Exercise PPPoE sendmsg()
↓
07. Monitor skb lifetime
↓
08. Capture kernel diagnostics
↓
09. Apply upstream patch
↓
10. Repeat and compare
الهدف هو إعادة إنتاج انتهاك عمر الذاكرة بأمان ومقارنة السلوك المعرّض والسلوك المرقَّع.
CVE-2026-68121-PPPoEject/
│
├── README.md
│
├── exploit/
│ ├── poc.c
│ └── Makefile
│
├── analysis/
│ ├── root-cause.md
│ ├── pppoe-sendmsg.md
│ ├── skb-lifetime.md
│ └── patch-analysis.md
│
├── kernel/
│ ├── vulnerable/
│ └── patched/
│
├── lab/
│ ├── setup.sh
│ ├── cleanup.sh
│ └── topology.md
│
├── screenshots/
│
├── docs/
│ └── research-notes.md
│
└── LICENSE
التخفيف الموصى به هو التحديث إلى نواة Linux تحتوي على إصلاح المنبع أو نسخة خلفية مناسبة من التوزيعة.
لـ Debian/Kali:
sudo apt update
sudo apt full-upgrade
ثم أعد التشغيل:
sudo reboot
تحقق من النواة قيد التشغيل:
uname -r
قد تستخدم النسخ الخلفية للتوزيعات أرقام إصدارات مختلفة، لذا ينبغي للمسؤولين التحقق من الحزمة المثبَّتة مقابل النشرة الأمنية الخاصة بالتوزيعة. تُدرج Debian حاليًا إصدارات مُصلَحة تشمل 6.1.187-1 لـ Bookworm و6.12.101-1 لـ Trixie.
تحتوي أشجار Linux المستقرة على الإصلاح عبر فروع متعددة مُصانة. يُدرج سجل CVE الالتزامات المستقرة المقابلة ويحدد ملف المصدر المتأثر على أنه:
drivers/net/ppp/pppoe.c
يبدأ السجل المعرّض من تطبيق PPPoE في نواة Linux،
وتنتهي سلسلة الالتزامات المُصلَحة عند إصلاح المنبع الممثَّل بـ
7a56e7c9b08e08fd55a1bcada24cf4fe3782b722 في بيانات CVE.
لا يمكن افتراض صلاحية مؤشر إلى skb بعد رد نداء قادر على إعادة تخصيص رأس skb.
قد تغيّر ردود نداء الشبكات تخطيط الذاكرة الأساسي.
يوضح الإصلاح لماذا تكون الإزاحة النسبية لـ skb أكثر أمانًا من الاحتفاظ بمؤشر خام عبر عملية قد تنقل الذاكرة.
تعتمد الحالة المعرّضة على نشاط متزامن حول إرسال الحزم وإعداد جهاز الشبكة.
قد يتحول مؤشر قديم في كود شبكات النواة إلى بدائية إفساد ذاكرة ذات تبعات على السرية والسلامة والتوافر.
drivers/net/ppp/pppoe.cpppoe_sendmsg()pppoe: reload header pointer after dev_hard_header()Linux Kernel · PPPoE · Use-After-Free · Kernel Security · LPE
Research • Analyze • Reproduce • Harden
| الحقل | التفاصيل |
|---|
| CVE | CVE-2026-68121 |
| الاسم الرمزي | PPPoEject |
| المكوّن | Linux Kernel |
| النظام الفرعي | PPPoE / Networking |
| الملف المتأثر | drivers/net/ppp/pppoe.c |
| الدالة الأساسية | pppoe_sendmsg() |
| فئة الخلل | Use-After-Free |
| التأثير | إفساد ذاكرة النواة |
| التأثير المحتمل | تصعيد الصلاحيات المحلي |
| CVSS v3.1 | 7.8 — High |
| ناقل الهجوم | محلي |
| تعقيد الهجوم | منخفض |
| الصلاحيات المطلوبة | منخفضة |
| تفاعل المستخدم | لا يوجد |
| الحالة | تم الترقيع |
| خاصية الأمان | Vulnerable | Patched |
|---|
| Header pointer saved before callback | ✅ | — |
| skb head can move | ✅ | ✅ |
| Pointer refreshed after callback | ❌ | ✅ |
| Stale pointer dereference | Possible | Prevented |
| Use-after-free write | Possible | Mitigated |
| Kernel memory corruption | Possible | Mitigated |