
تخفيف قائم على Seccomp لثغرة CVE-2026-31431، وهي ثغرة رفع صلاحيات محلية (LPE) في نواة لينكس. تمنع مقبس AF_ALG عبر وحدة PAM وغلاف مستقل، مع اكتشاف تلقائي للنوى المُصحّحة.
حل خفيف وقابل للعكس يعتمد على seccomp لتخفيف CVE-2026-31431، وهي ثغرة تصعيد صلاحيات محلية في نظام Linux kernel في نظام التشفير الفرعي algif_aead / authencesn.
النوع: تصعيد صلاحيات محلي (LPE)
المكوّن المتأثر: Linux kernel crypto/algif_aead.c - عملية AEAD في المكان
أساس الهجوم: كتابة قابلة للتحكم بحجم 4 بايت في ذاكرة التخزين المؤقت للصفحات لأي ملف قابل للقراءة عبر مسار الكتابة المؤقتة لخوارزمية AEAD authencesn. من خلال استهداف /etc/passwd، يمكن للمهاجم تغيير UID الخاص به إلى 0 (الجذر) والحصول على قشرة جذر عبر su.
النوى المتأثرة: تم التأكيد على النواة 6.12+، 6.17+، 6.18+، وتم إعادة إنتاجها أيضًا على نوى RHEL/CentOS 4.18/5.14.
البيئات المُتحقق منها: Rocky Linux 8 (النواة 4.18) و Rocky Linux 9 (النواة 5.14) - تم حظر الاستغلال بالكامل، وتم تأكيد الإزالة الآمنة.
السبب الجذري: الالتزام 72548b093ee3 أدخل عملية AEAD في المكان. عند استخدام صفحات ذاكرة مخزنة مؤقتًا مقسمة كقائمة تبعثر وجهة، يتم كتابة حقل AAD seqno_lo بشكل غير صحيح مرة أخرى في ذاكرة التخزين المؤقت للصفحات أثناء فك تشفير AEAD.
الإصلاح الرسمي: العودة إلى عملية AEAD خارج المكان.
يحتوي هذا الحل على مكوّنين:
وحدة PAM (pam_block_afalg.so) - الدفاع الأساسي. يتم تحميلها بواسطة PAM أثناء فتح الجلسة (pam_sm_open_session)، وتطبق مرشح seccomp BPF الذي يحظر socket(AF_ALG, ...) قبل تشغيل أي كود مستخدم. يغطي هذا جميع الجلسات المصادق عليها عبر PAM: su -c، su -، SSH، تسجيل الدخول عبر TTY، إلخ.
الملف الثنائي المستقل (block_afalg) - اختياري. يمكنه تغليف برامج محددة لسيناريوهات غير PAM (مثل مهام cron، خدمات systemd، الاستدعاء اليدوي).
مرشح seccomp:
socket(AF_ALG, ...) (يُرجع EACCES)setuid، su، sudo)فتح جلسة PAM (su، ssh، login، إلخ.)
|
v
pam_block_afalg.so (pam_sm_open_session)
|
+-- تحقق: هل النواة معرضة للخطر؟ (محاولة socket(AF_ALG))
| |
| +-- لا --> إرجاع PAM_SUCCESS (بلا تأثير)
| |
| +-- نعم --> prctl(PR_SET_SECCOMP, مرشح BPF)
| |
| +-- مرشح seccomp نشط على عملية sshd الفرعية
| +-- يُورث لقشرة المستخدم وجميع العمليات الفرعية
| +-- socket(AF_ALG, ...) يُرجع EACCES
v
قشرة المستخدم / الأمر يعمل مع حماية seccomp
|
+-- su، sudo، وجميع استدعاءات النظام الأخرى تعمل بشكل طبيعي
+-- فقط مقبس AF_ALG محظور
| الملف | الغرض |
|---|---|
pam_block_afalg.c | كود مصدر وحدة PAM. يطبق مرشح seccomp عند فتح الجلسة. |
gcc (للترجمة)libpam (وقت التشغيل، مثبت مسبقًا عادةً)# 1. ترجمة وحدة PAM
gcc -Wall -O2 -fPIC -shared -o pam_block_afalg.so pam_block_afalg.c \
/usr/lib64/libpam.so.0
# 2. التثبيت (يضيف تلقائيًا إعدادات PAM إلى su، sshd، login)
sudo ./deploy.sh install
# 3. التحقق (يجب أن تكون جلسة جديدة)
cat /proc/self/status | grep Seccomp
# يجب أن يُظهر: Seccomp: 2
python3 -c "
import socket
try:
s = socket.socket(38,2,0); s.close()
print('VULNERABLE')
except OSError:
print('BLOCKED')
"
# يجب أن يُظهر: BLOCKED
# 4. إلغاء التثبيت
sudo ./deploy.sh remove
| الأمر | الوصف |
|---|---|
deploy.sh install | ترجمة وحدة PAM، تثبيتها في /lib64/security/، إضافة إعدادات PAM تلقائيًا |
deploy.sh remove | إلغاء تثبيت كامل: إزالة الوحدة، تنظيف إعدادات PAM، حذف الملفات |
deploy.sh status |
لسيناريوهات غير PAM، استخدم block_afalg مباشرة:
# الترجمة
gcc -Wall -O2 -o block_afalg block_afalg.c
# تشغيل أمر مع حظر AF_ALG
./block_afalg python3 your_script.py
./block_afalg bash
python3 -c "
import socket
try:
s = socket.socket(38, socket.SOCK_SEQPACKET, 0)
s.close()
print('VULNERABLE: AF_ALG socket available')
except:
print('SAFE: AF_ALG socket blocked or unavailable')
"
# التحقق من حالة seccomp
cat /proc/self/status | grep Seccomp
# Seccomp: 0 = غير محمي
# Seccomp: 2 = محمي
# اختبار مقبس AF_ALG
python3 -c "
import socket
try:
s = socket.socket(38,2,0)
s.close()
print('AF_ALG available - NOT protected')
except OSError:
print('AF_ALG blocked - PROTECTED')
"
# التحقق من سجلات PAM
grep pam_block_afalg /var/log/secure
# يجب أن يُظهر: تم تطبيق مرشح seccomp، تم حظر AF_ALG
__NR_socket على x86_64). البنى الأخرى تحتاج إلى تحديث رقم استدعاء النظام.exec() المباشرة بدون PAM غير مغطاة (استخدم block_afalg لها).remove.yum update kernel ثم إزالة الوحدة.يتم توفير هذه الأداة لأغراض الاختبار الأمني المصرح به والدفاع فقط. استخدمها فقط على الأنظمة التي تملكها أو التي لديك إذن صريح بتقييمها.
pam_minimal.h| تعريفات أنواع PAM الحد الأدنى (يُترجم بدون pam-devel). |
block_afalg.c | ملف ثنائي مستقل لتغليف seccomp. للاستخدام غير PAM. |
deploy.sh | سكربت النشر. يُترجم، يُثبت، ويدير وحدة PAM. |
| عرض حالة التثبيت، إعدادات PAM، حالة النواة |