
مستودع بحثي لـ CVE-2026-74469 (DiagSpill)، وهو تجاوز في عدّاد نقل نظير SCTP في نواة Linux يؤدي إلى كتابة خارج الحدود، مع PoC وتحليل السبب الجذري وتفاصيل التصحيح.
DiagSpill
ثغرة في نواة Linux في بروتوكول SCTP ناتجة عن تجاوز سعة عدّاد ناقلات الأقران بعرض 16 بت، مما يسمح للعدّاد بالالتفاف من 65535 إلى 0. أثناء تفريغ تشخيصي لـ SCTP، قد تتسبب القيمة الملتفّة في حجز غير كافٍ لحمولة skb يتبعه كتابة خارج الحدود لبيانات عنوان القرين.
هذا المستودع مخصص للبحث الأمني المصرّح به، وتحليل ثغرات النواة، وبيئات CTF، وتنقيح النواة، والاختبار الدفاعي فقط.
لا تستخدم كود إثبات المفهوم ضد أنظمة دون تصريح صريح.
يصف إشعار CVE الخاص بنواة Linux المشكلة بأنها تجاوز سعة transport_count بعرض 16 بت في SCTP، يتبعه تخصيص أصغر من اللازم لـ INET_DIAG_PEERS وكتابة خارج الحدود أثناء التفريغ التشخيصي.
يحتفظ الكود المصاب بعدد ناقلات الأقران الفريدة في عدّاد بعرض 16 بت:
transport_count
كل قرين فريد يُضاف حديثًا يزيد العدّاد.
الحد الحرج هو:
65535
إضافة ناقل فريد آخر تؤدي إلى:
65535 + 1
↓
0
يُنشئ الالتفاف الناتج تعارضًا بين:
transport_count
و:
transport_addr_list
يثق النظام الفرعي التشخيصي لاحقًا بالعدّاد الملتفّ عند حساب حجم مخزن الاستجابة، بينما لا يزال يمرّ عبر القائمة الكاملة لعناوين الأقران.
يمكن تمثيل الثغرة كما يلي:
SCTP Association
│
▼
Add unique peers
│
▼
transport_count
uint16_t
│
▼
65,535 peers
│
▼
+ 1 unique peer
│
▼
Integer wrap
│
▼
transport_count = 0
│
▼
SCTP sock_diag
│
▼
Reserve incorrect payload
│
▼
Iterate complete peer list
│
▼
Out-of-bounds skb write
ينص الإشعار الأصلي تحديدًا على أن الناقل رقم 65,536 يلفّ العدّاد إلى الصفر.
يعتمد الكود التشخيصي فعليًا على رؤيتين مختلفتين لنفس الحالة.
transport_count
│
▼
payload size
transport_addr_list
│
▼
copy every peer address
بعد التفاف العدد الصحيح:
transport_count = 0
transport_addr_list =
[peer 1]
[peer 2]
[peer 3]
...
[peer 65536]
لذلك يحجز المخصّص مساحة بناءً على:
0 peers
بينما لا تزال عملية النسخ قادرة على معالجة:
65536 peer addresses
ينتج عن هذا التعارض انتهاك سلامة الذاكرة.
يصف إشعار نواة Linux التفريغ التشخيصي الناتج بأنه يحجز حمولة فارغة ثم يكتب ما يقارب 8 ميبي بايت من عناوين الأقران بعد نهاية skb.
من الناحية المفاهيمية:
Expected skb:
┌───────────────────────────────┐
│ INET_DIAG header │
├───────────────────────────────┤
│ Peer addresses │
└───────────────────────────────┘
▲
│
valid end
Actual vulnerable state:
┌───────────────────────────────┐
│ INET_DIAG header │
└───────────────────────────────┘
▲
│
skb tail
↓
Peer address writes
↓
Peer address writes
↓
Peer address writes
↓
OUT-OF-BOUNDS WRITE
تصنّف Red Hat هذا العيب بأنه CWE-787: كتابة خارج الحدود.
يمكن تلخيص المسار ذي الصلة كما يلي:
SCTP association
│
▼
sctp_assoc_add_peer()
│
▼
transport_count++
│
▼
16-bit overflow
│
▼
SCTP sock_diag
│
▼
INET_DIAG_PEERS
│
▼
skb payload reservation
│
▼
transport_addr_list iteration
│
▼
Out-of-bounds write
ملف المصدر المتأثر هو:
net/sctp/associola.c
يحدد إعلان CVE الخاص بنواة Linux هذا الملف صراحةً.
الإصلاح الأصلي هو:
bd0e9289e2642f6a5c54faad304ce0f41e926d22
الـ commit:
sctp: prevent peer transport count overflow
يرفض الإصلاح القرين الفريد الجديد عندما:
transport_count >= U16_MAX
والأهم أن الفحص يحدث بعد البحث عن القرين الموجود.
يحافظ ذلك على القدرة على استرجاع ناقل موجود بالفعل حتى عندما يصل الارتباط إلى الحد الأقصى.
New peer
│
▼
transport_count++
│
▼
Possible 16-bit wrap
│
▼
Diagnostic size mismatch
│
▼
OOB write
New peer
│
▼
Existing peer?
│
┌─┴──────────┐
│ │
YES NO
│ │
▼ ▼
Reuse Check U16_MAX
transport │
▼
Reject at limit
الخاصية الأمنية المهمة هي منع العدّاد من الالتفاف أبدًا مع الحفاظ على دلالات البحث الطبيعية لقرين موجود.
قد يؤدي إفساد الذاكرة إلى:
تشير أبحاث منشورة بعد الإفصاح إلى استغلال محلي بصلاحيات root في ظروف محددة، بينما يستخدم تقييم Linux Kernel CNA الأصلي AV:L/AC:H/PR:L/UI:N.
تُوصف الثغرة أيضًا بأنها قد تكون قابلة للوصول عن بُعد في ظروف محددة جدًا تتعلق بـ SCTP/إعداد العناوين، لكن لا ينبغي اعتبار ذلك مكافئًا لثغرة قابلة للاستغلال عن بُعد بشكل عام.
طوبولوجيا معزولة موصى بها:
┌───────────────────────────────────────────┐
│ Linux VM │
│ │
│ ┌───────────────────┐ │
│ │ SCTP Association │ │
│ └─────────┬─────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────┐ │
│ │ Multiple SCTP │ │
│ │ Peer Transports │ │
│ └─────────┬─────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────┐ │
│ │ SCTP sock_diag │ │
│ └─────────┬─────────┘ │
│ │ │
│ ▼ │
│ INET_DIAG_PEERS │
│ │
└───────────────────────────────────────────┘
أدوات مفيدة:
ip sctp
ss
ss -a
ss -A sctp
dmesg -w
gdb
pwndbg
crash
تحقق من دعم SCTP:
lsmod | grep sctp
تحقق من إعدادات النواة:
grep CONFIG_IP_SCTP /boot/config-$(uname -r)
تحقق من النواة قيد التشغيل:
uname -r
تحقق من إعدادات SCTP:
grep -E 'CONFIG_IP_SCTP|CONFIG_SCTP' \
/boot/config-$(uname -r)
تحقق من وحدات SCTP المحمّلة:
lsmod | grep -i sctp
افحص مقابس SCTP:
ss -A sctp
لبحث نواة مُتحكَّم به:
01. Build vulnerable kernel
↓
02. Boot isolated VM
↓
03. Enable SCTP
↓
04. Create controlled SCTP association
↓
05. Populate unique peer transports
↓
06. Reach transport-count boundary
↓
07. Trigger SCTP diagnostic dump
↓
08. Monitor skb diagnostics
↓
09. Capture kernel behavior
↓
10. Apply upstream fix
↓
11. Repeat test
↓
12. Compare vulnerable vs patched
راقب مخرجات النواة:
sudo dmesg -w
للتنقيح:
gdb vmlinux
أو:
pwndbg vmlinux
CVE-2026-74469-DiagSpill/
│
├── README.md
│
├── exploit/
│ ├── poc.c
│ └── Makefile
│
├── analysis/
│ ├── root-cause.md
│ ├── sctp-transport-count.md
│ ├── sock-diag.md
│ ├── skb-overflow.md
│ └── patch-analysis.md
│
├── kernel/
│ ├── vulnerable/
│ └── patched/
│
├── lab/
│ ├── setup.sh
│ ├── cleanup.sh
│ └── topology.md
│
├── screenshots/
│
├── docs/
│ └── research-notes.md
│
└── LICENSE
التخفيف الأساسي هو الترقية إلى نواة تحتوي على الإصلاح الأصلي.
لـ Debian/Kali:
sudo apt update
sudo apt full-upgrade
ثم أعد التشغيل:
sudo reboot
تحقق:
uname -r
إذا لم تكن هناك حاجة إلى SCTP، يمكن للمسؤولين أيضًا التفكير في تعطيل وظيفة SCTP المتأثرة وفقًا لبيئتهم ومتطلباتهم التشغيلية. تدرج الأبحاث المنشورة تحديدًا تعطيل SCTP / sctp_diag كتخفيف فوري عندما تكون هذه المكوّنات غير مستخدمة.
يسرد إعلان الاستقرار الأصلي هذه الإصدارات المُصلَحة:
هذه الإصدارات من إعلان CVE الخاص بنواة Linux؛ قد تقوم التوزيعات بنقل الإصلاح إلى حزم بأرقام إصدارات مختلفة.
العدّاد بعرض 16 بت له حد أقصى صارم:
U16_MAX = 65535
يجب أن يتعامل الكود الحساس أمنيًا مع هذا الحد بشكل صريح.
يجب أن يتوافق الحجم المستخدم لتخصيص مخزن مع عدد الكائنات المنسوخة فعليًا إليه.
قد تصبح واجهات التشخيص في النواة أسطح هجوم لإفساد الذاكرة عندما تصبح الحالة الداخلية غير متسقة.
الأصل الأولي هو تجاوز سعة عدد صحيح، لكن التأثير الأمني الناتج هو كتابة خارج الحدود في النواة.
قد تحتوي ارتباطات SCTP على مجموعات كبيرة من ناقلات الأقران، مما يجعل حدود العدّادات ومنطق إدارة القوائم أمرًا حساسًا أمنيًا.
net/sctp/associola.csctp_assoc_add_peer()sctp: prevent peer transport count overflowbd0e9289e2642f6a5c54faad304ce0f41e926d22Linux Kernel · SCTP · sock_diag · OOB Write · Kernel Security
Research • Analyze • Reproduce • Harden
| الحقل | التفاصيل |
|---|
| CVE | CVE-2026-74469 |
| الاسم الرمزي | DiagSpill |
| المكوّن | Linux Kernel |
| النظام الفرعي | SCTP / sock_diag |
| الملف المتأثر | net/sctp/associola.c |
| الدالة الأساسية | sctp_assoc_add_peer() |
| فئة الخلل | تجاوز سعة عدد صحيح / كتابة خارج الحدود |
| التأثير | إفساد ذاكرة النواة |
| التأثير المحتمل | تصعيد صلاحيات محلي |
| CVSS v3.1 | 7.0 — مرتفع |
| متجه الهجوم | محلي |
| تعقيد الهجوم | مرتفع |
| الصلاحيات المطلوبة | منخفضة |
| تفاعل المستخدم | لا يوجد |
| الحالة | مُرقّعة |
| الخاصية الأمنية | مصاب | مُرقّع |
|---|
| فرض حد النقل بعرض 16 بت | ❌ | ✅ |
| منع التفاف العدّاد | ❌ | ✅ |
| بقاء الأقران الموجودين قابلين للاستخدام | ✅ | ✅ |
| موثوقية حجم الحمولة التشخيصية | ❌ | ✅ |
| منع الكتابة خارج الحدود في skb | ❌ | ✅ |
| تخفيف إفساد ذاكرة النواة | ❌ | ✅ |
| الفرع | الإصدار المُصلَح |
|---|
| 5.10 | 5.10.265 |
| 5.15 | 5.15.216 |
| 6.1 | 6.1.183 |
| 6.6 | 6.6.151 |
| 6.12 | 6.12.103 |
| 6.18 | 6.18.44 |
| 7.1 | 7.1.8 |
| 7.2 | 7.2-rc6 |