
إطار دفاع وقت التشغيل على مستوى النواة لثغرات AF_ALG، يتضمن تتبع مآخذ eBPF، وتقوية Ansible، ومدقق تشفير لاكتشاف الانحراف.
إطار عمل دفاعي على مستوى نواة النظام لبنية AF_ALG (عائلة عناوين الخوارزميات، العائلة 38) في لينكس. صُمم لمراكز العمليات الأمنية التي تدير أساطيل لينكس المؤسسية حيث يجب أن تمتد الثقة الصفرية إلى داخل النواة، ولا تتوقف عند حافة الشبكة.
يكشف AF_ALG واجهة برمجة التشفير الخاصة بالنواة لمساحة المستخدم عبر واجهة مآخذ (socket(AF_ALG, SOCK_SEQPACKET, 0)). أُضيف أصلاً للأنظمة المدمجة التي لا تحتوي على /dev/crypto، ومنذ ذلك الحين تراكمت عليه حصة غير متناسبة من ثغرات النواة لأنه يعرض كود التشفير في وضع النواة لمستدعين غير مميزين — وهو عدم تطابق كلاسيكي في مساحة السطح.
في بيئة مؤسسية نموذجية:
connect() أو bind() أو DNS لا ترى شيئاً — حركة مرور AF_ALG لا تغادر النواة أبداً.يعامل هذا الإطار كل إنشاء لمقبس AF_ALG كحدث عالي الإشارة ويقلل السطح الذي يجعل تلك الأحداث قابلة للاستغلال.
| مبدأ الثقة الصفرية | التحكم في هذا الإطار |
|---|---|
| لا تثق أبداً، تحقق دائماً | متتبع eBPF يسجل كل محاولة إنشاء مقبس AF_ALG مع pid/uid/comm |
| افترض الاختراق | مدقق التشفير يقارن حالة النواة بخط أساس موقّع |
| أقل امتياز | RestrictAddressFamilies في systemd + تحديد القدرات على الوحدات المُدارة |
| التقسيم الدقيق (على مستوى النواة) | unprivileged_userns_clone=0 يزيل نقطة تحول userns المستخدمة في الاستغلالات |
| التحقق المستمر | CI يتحقق من تقارير التدقيق مقابل مخطط إصدارات عند كل تغيير |
.
├── ebpf/ مراقبة وقت التشغيل (متتبع BCC + قائمة السماح)
├── ansible/ التكوين كرمز (sysctl + drop-ins لـ systemd)
├── systemd/ drop-in مستقل لـ systemd للمضيفات غير المزودة بـ Ansible
├── auditor/ مدقق حالة النواة (Python)
├── schemas/ مخطط JSON لاستيعاب تقارير التدقيق
├── scripts/ سكربتات شل مساعدة (يتم فحصها بواسطة CI)
├── tests/ اختبارات الوحدات + نماذج التقارير
└── .github/workflows/ CI: shellcheck + التحقق من مخطط JSON + lint
يربط ebpf/af_alg_tracer.py خطاف kprobe بـ security_socket_create. يقوم الخطاف بالتصفية على family == 38 على مستوى برنامج BPF بحيث يقوم المدقق باقتطاع إنشاءات المقابس غير المرتبطة ويبقى الحمل لكل حدث في نطاق النانو ثانية. يصدر سجلاً JSON واحداً لكل محاولة:
{
"@timestamp": "2026-05-02T09:14:11.412041+00:00",
"event": {"category": "kernel", "action": "af_alg_socket_create", "severity": "high"},
"process": {"pid": 1394, "tgid": 1394, "comm": "suspicious_bin"},
"user": {"uid": 1000, "gid": 1000},
"socket": {"family": 38, "family_name": "AF_ALG", "type": 5, "protocol": 0},
"host": {"name": "web-prod-04"}
}
قم بتوجيه الإخراج إلى Vector أو Fluent Bit أو journald (عبر systemd-cat). قائمة سماح بأسماء العمليات (/etc/af-alg-defense/allow.list) تقوم بكتم المستهلكين المعروفين الجيدين دون فقدان القدرة على اكتشاف الانحرافات.
هدف kprobe هو خطاف LSM، لذا تُطلق الأحداث عند النية — حتى المحاولات التي قد يرفضها seccomp أو RestrictAddressFamilies لا تزال تنتج سجلاً. هذا بالضبط ما يريده مركز العمليات الأمنية لإنشاء خط أساس سلوكي.
يطبق ansible/roles/af_alg_hardening/ طبقتين من التحصين:
drop-in لـ sysctl (/etc/sysctl.d/90-af-alg-defense.conf):
kernel.unprivileged_userns_clone=0 — يزيل نقطة تحول userns المستخدمة في معظم سلاسل تصعيد AF_ALG.user.max_user_namespaces=0 — دفاع متعمق قابل للنقل بين التوزيعات.drop-in لـ systemd (/etc/systemd/system/<unit>.d/50-af-alg-restrict.conf):
يستخدم RestrictAddressFamilies كـ قائمة سماح (وليس قائمة منع). يُسمح للوحدة بـ AF_UNIX AF_INET AF_INET6 AF_NETLINK؛ أي عائلة أخرى — بما فيها AF_ALG — تفشل مع EAFNOSUPPORT لأن systemd يفرضها عبر BPF مرتبط بـ cgroup لا يمكن للتطبيق تعطيله. كما يزيل drop-in قدرة CAP_SYS_ADMIN ويطبق ProtectKernel* لإغلاق مسارات التصعيد الأكثر شيوعاً.
طبق باستخدام:
ansible-playbook -i inventory ansible/site.yml --check --diff # معاينة
ansible-playbook -i inventory ansible/site.yml # تنفيذ
للمضيفات غير المزودة بـ Ansible، ضع الملف المستقل في مكانه:
sudo ./scripts/deploy_dropin.sh nginx.service
ينتج auditor/crypto_auditor.py تقريراً JSON عن حالة الأمان من خلال فحص:
/proc/crypto — كل تشفير / تجزئة / aead مسجل، مع علامات FIPS وحالة الاختبار الذاتي./sys/module/ — الوحدات المحملة في شجرة التشفير، مع علامات التلوث ولقطات المعاملات./proc/sys/kernel/ و /proc/sys/user/ — sysctls التي تتحكم في مسارات هجوم AF_ALG./sys/kernel/security/lockdown — وضع إغلاق النواة.يتم مفتاح التقرير بمعرفات نتائج مستقرة (FND-001 حتى FND-005 حالياً) بحيث يمكن لقواعد SIEM كتم النتائج الفردية دون إسقاط المستند بأكمله. يقارن كشف الانحراف الحالة بخط أساس:
sudo ./auditor/crypto_auditor.py --output /var/log/af-alg-defense/today.json
sudo ./auditor/crypto_auditor.py \
--baseline /var/log/af-alg-defense/baseline.json \
--fail-on-drift
المخطط موجود في schemas/audit_report.schema.json (Draft 2020-12) ويتم التحقق منه في CI عند كل دفع.
يشغل .github/workflows/ci.yml أربع مهام عند كل دفع وطلب سحب:
*.sh وسكربت يحمل shebang.audit_report.schema.json، ثم تشغيل المدقق مباشرة على نواة مشغل GH والتحقق من التقرير الناتج. كما يتم فحص النماذج في tests/fixtures/.ruff check .).فشل فحص المخطط يمنع الدمج، مما يمنع محللات SIEM النهائية من الانهيار بسبب حقل أعيدت تسميته بصمت.
af_alg_socket_create من عملية غير مدرجة في قائمة السماح — استدعِ الصفحة عند أول حدوث، ولا تجمع.crypto_modules بين تشغيلين متتاليين للمدقق على مضيف حيث يجب تجميد تحميل الوحدات.hardened=false بعد تشغيل سكربت التحصين — يشير إلى عبث يدوي أو انحراف من نظام تكوين موازٍ.lockdown من integrity/confidentiality إلى none — مؤشر قوي على عبث بحالة النواة.allow.list للمستهلكين المعروفين الجيدين (cryptsetup عند الإقلاع هو المعتاد).baseline.json موقّع.af_alg_systemd_services على وحدة واحدة منخفضة المخاطر. راقب أخطاء EAFNOSUPPORT في journald.systemd-analyze security <unit> أن التقييد مفروض.--fail-on-drift ووجّه المخارج غير الصفرية إلى قائمة الاستدعاء.af_alg إذا كان قيد الاستخدام بالفعل. إلغاء تحميل الوحدات خارج النطاق لأن مستهلكي وقت الإقلاع الشرعيين قد لا يزالون يعملون. استخدم modprobe.blacklist=af_alg في سطر أوامر النواة إذا أكدت أن لا شيء على المضيف يحتاجه.security_socket_create).uname -r.CAP_BPF (أو صلاحيات الجذر) لتحميل المتتبع؛ وصول قراءة إلى /proc/crypto للمدقق (لا يتطلب امتيازات لقراءته).Apache-2.0. انظر LICENSE.