
عرض توضيحي للأمن الدفاعي: بوابة seL4 microkernel تحمي ICS الضعيفة من CVE-2019-14462
مشروع بحث أمني دفاعي يقارن بين بنيتي كسر البروتوكول و توجيه الحزم لحماية أنظمة التحكم الصناعية من الهجمات الإلكترونية.
التوثيق:
- بنية الشبكة - رسومات الشبكة وتدفق الحركة
- بنية الحاويات - علاقات حاويات Docker
- شروحات الثغرات - تفاصيل الثغرات وآليات الهجوم
تواجه أنظمة ICS/SCADA الحديثة هجمات متطورة مثل FrostyGoop، والذي استهدف أنظمة التدفئة المحلية الأوكرانية عبر Modbus TCP في يناير 2024، مما ترك أكثر من 600 منزل بدون تدفئة خلال درجات حرارة تحت الصفر. تستخدم الحلول الأمنية التقليدية (الجدران النارية، أنظمة كشف التسلل) بنية توجيه الحزم التي تفحص الحركة على الخط ولكنها تحافظ على اتصال TCP واحد من النهاية إلى النهاية.
يقدم هذا المشروع بديلاً: بوابة كسر البروتوكول تستخدم النواة المصغرة seL4 المُثبتة رسميًا. من خلال إنهاء اتصالات TCP والتحقق من دلالات البروتوكول قبل إنشاء اتصالات جديدة بالأجهزة المحمية، توفر هذه البنية ضمانات أمنية أقوى.
| الجانب | كسر البروتوكول (seL4) | توجيه الحزم (Snort) |
|---|---|---|
| CVE-2019-14462 | محظور (التحقق من الطول) | مكتشف (قواعد Quickdraw) |
| CVE-2022-0367 | محظور (التحقق من العنوان) | مكتشف (قواعد مخصصة) |
| CVE-2022-20685 | محصن (بدون معالج مسبق) | قابل للاختراق (حرمان خدمة IDS) |
| CVE-2024-1086 | محصن (بدون نواة Linux) | قابل للاختراق (مشارك نواة المضيف) |
| المتغيرات غير المعروفة | محظور (التحقق البنيوي) | غير مكتشف (لا توقيع) |
| هجمات حالة TCP | محظور (تم إنهاء الاتصال) | ممكن |
| سطح الهجوم | ~1,000 سطر من الكود (نواة مصغرة) | ~500,000 سطر من الكود (Linux + Snort) |
┌─────────────────────────────────────────────────────────────────────────────┐
│ Docker Network: ics-untrusted (192.168.96.0/24) │
│ │
│ ┌───────────────────────┐ ┌───────────────────────┐ │
│ │ seL4 Gateway │ │ Snort IDS │ │
│ │ Port 502 │ │ Port 503 │ │
│ │ │ │ │ │
│ │ • Protocol-break │ │ • Packet-forwarding │ │
│ │ • TCP termination │ │ • Inline inspection │ │
│ │ • Length validation │ │ • Rule-based detection│ │
│ └───────────┬───────────┘ └───────────┬───────────┘ │
│ │ │ │
├───────────────┼───────────────────────────────┼─────────────────────────────┤
│ Docker Network: ics-protected (192.168.95.0/24) │
│ │ │ │
│ └───────────────┬───────────────┘ │
│ ▼ │
│ ┌───────────────────────────────┐ │
│ │ PLC (District Heating) │ │
│ │ Vulnerable libmodbus 3.1.2 │ │
│ │ Port 5020 (direct access) │ │
│ └───────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
# Place your seL4 kernel image at:
gateway/sel4-image/capdl-loader-image-arm-qemu-arm-virt
# Build all containers
sudo docker compose build
# Start individual containers
sudo docker compose up plc # PLC only
sudo docker compose up gateway # seL4 gateway + PLC
sudo docker compose up snort # Snort IDS + PLC
# Start all
sudo docker compose up
# Through seL4 gateway (protected - protocol-break)
echo -ne '\x00\x01\x00\x00\x00\x06\x01\x03\x00\x00\x00\x01' | nc localhost 502 | xxd
# Through Snort IDS (protected - packet-forwarding)
echo -ne '\x00\x01\x00\x00\x00\x06\x01\x03\x00\x00\x00\x01' | nc localhost 503 | xxd
# Direct to PLC (unprotected - vulnerable)
echo -ne '\x00\x01\x00\x00\x00\x06\x01\x03\x00\x00\x00\x01' | nc localhost 5020 | xxd
ملاحظة: يعمل PLC الافتراضي الآن في وضع CVE-2022-0367 مع ASAN. استخدم
--profile cve14462لاختبار CVE-2019-14462.
يستخدم PLC مكتبة libmodbus 3.1.2 المعرضة للخطر عن قصد. يستغل الهجوم حقول طول MBAP الموثوقة:
# Start PLC in CVE-2019-14462 mode
sudo docker compose --profile cve14462 up plc-14462
# Build attack tools
cd cve_tools && make
# Attack unprotected PLC (crashes)
./cve_14462_attack 127.0.0.1 5022
# Attack through seL4 (BLOCKED)
./cve_14462_attack 127.0.0.1 502
# Attack through Snort (DETECTED by Quickdraw rules)
./cve_14462_attack 127.0.0.1 503
خلل في التحقق من الحدود في modbus_mapping_new_start_address() يسمح بنقص سعة الكومة عبر كود الوظيفة 0x17 (كتابة وقراءة السجلات):
# Default PLC runs in CVE-2022-0367 mode with ASAN
sudo docker compose up plc
# Build attack tools
cd cve_tools && make
# Attack PLC - ASAN will detect heap-buffer-overflow
./cve_0367_attack 127.0.0.1 5020
# Attack with custom parameters
./cve_0367_attack 127.0.0.1 5020 88 0x4141 # Corrupt tab_registers pointer
./cve_0367_attack 127.0.0.1 5020 72 0xFFFF # Corrupt nb_registers
# Attack through seL4 (BLOCKED - address validation)
./cve_0367_attack 127.0.0.1 502
# Attack through Snort (DETECTED by custom rules)
./cve_0367_attack 127.0.0.1 503
تفاصيل تقنية:
start_registers=100، العناوين الصالحة هي 100-109write_address < 100، مما يسبب فهرس مصفوفة سالبmb_mapping بما في ذلك المؤشراتيعاني Snort 2.9.18 من تجاوز عدد صحيح في معالج Modbus المسبق مما يسبب حلقة لا نهائية، مما يمنع كل الحركة عبر IDS:
# 1. Verify Snort is working (should return Modbus response)
echo -ne '\x00\x01\x00\x00\x00\x06\x01\x03\x00\x00\x00\x01' | nc -w 2 localhost 503 | xxd
# 2. Attack the Snort IDS
./cve_20685_attack 127.0.0.1 503
# 3. Verify Snort is frozen (should timeout with NO response)
echo -ne '\x00\x01\x00\x00\x00\x06\x01\x03\x00\x00\x00\x01' | nc -w 5 localhost 503 | xxd
# 4. Check Snort CPU (should be 100%)
sudo docker exec ics-snort top -b -n 1 | grep snort
# 5. seL4 is IMMUNE (no Modbus preprocessor to exploit)
./cve_20685_attack 127.0.0.1 502 # No effect on seL4
# 6. Restart Snort after demo
sudo docker compose restart snort
لماذا هذا مدمر: يستخدم Snort وضع NFQUEUE المضمن، مما يعني أن الحزم محتجزة في قائمة انتظار النواة حتى يعيد Snort حكمًا. عندما يتوقف Snort عن العمل، لا تُعاد الأحكام، وتتوقف كل الحركة - ليس فقط عمى IDS، بل حرمان كامل من الخدمة.
استخدام بعد التحرير في netfilter nf_tables في Linux (النوى v5.14-v6.6) يمكن من الهروب من الحاوية:
# Check if host is vulnerable
uname -r # Vulnerable: v5.14 - v6.6 (before patches)
# The exploit is available at:
ls cve_tools/cve-2024-1086/
لماذا هذا مهم: تشترك حاويات Docker في نواة المضيف. إذا تمكن مهاجم من اختراق Snort (مثلاً عبر CVE-2022-20685)، يمكنه استخدام CVE-2024-1086 للهروب من الحاوية والحصول على صلاحيات الجذر على المضيف. seL4 محصن لأنه يعمل بنواة مصغرة، وليس Linux.
# Full demo with 4 quadrants (PLC, seL4, Snort, User terminal)
./scripts/demo.sh
# Snort-only demo with 3 panes (PLC, Snort, User terminal)
./scripts/demo-snort.sh
# Run automated comparison
./scripts/run_comparison.sh
تتوفر تكوينات متعددة لـ Snort لقياس كفاءة الكشف:
# Run Snort with specific profile
sudo docker compose --profile snort-talos up
# Compare detection efficiency
sudo docker compose --profile snort-quickdraw up -d
./cve_tools/cve_0367_attack 127.0.0.1 503 # Test detection
sudo docker compose --profile snort-quickdraw down
sudo docker compose --profile snort-combined up -d
./cve_tools/cve_0367_attack 127.0.0.1 503 # Test detection
sudo docker compose --profile snort-combined down
Client ────TCP────► Snort ────TCP────► PLC
(same connection flows through)
Client ────TCP1────► seL4 ────TCP2────► PLC
(terminates, validates, new connection)
يحاكي PLC وحدة تحكم تدفئة محلية مع دعم متعدد الماجستير (بنية خيط لكل عميل، نموذجية في PLCs الحديثة).
| الوضع | الخدمة | المنفذ | الوصف |
|---|---|---|---|
| CVE-2022-0367 | plc (افتراضي) | 5020 |
# Default mode (CVE-2022-0367 with ASAN)
sudo docker compose up plc
# CVE-2019-14462 mode
sudo docker compose --profile cve14462 up plc-14462
في وضع CVE-2022-0367، السجلات في العناوين 100-109 (استخدم العنوان 40101 في أدوات SCADA):
يحتوي هذا المشروع على رمز معرض للخطر عن قصد لأغراض البحث الأمني الدفاعي. تم تضمين libmodbus 3.1.2 و Snort 2.9.18 المعرضين للخطر لتوضيح المفاهيم الأمنية.
لا تنشر المكونات غير المحمية في بيئات الإنتاج.
لأغراض البحث الأمني الدفاعي المصرح به والتعليم فقط.
| المنفذ | المسار | البنية | الحماية |
|---|
| 502 | عميل → seL4 → PLC | كسر البروتوكول | يتحقق من بنية Modbus |
| 503 | عميل → Snort → PLC | توجيه الحزم | IDS قائم على القواعد |
| 5020 | عميل → PLC (ASAN) | مباشر | وضع CVE-2022-0367 |
| 5022 | عميل → PLC | مباشر | وضع CVE-2019-14462 (profile: cve14462) |
| الملف | الأمر | القواعد | الوصف |
|---|
| default | docker compose up snort | 12 | Quickdraw (المعيار الصناعي) |
| quickdraw | --profile snort-quickdraw | 12 | Digital Bond Quickdraw فقط |
| talos | --profile snort-talos | 40 | نمط Talos مع كلمات مفتاحية modbus_func |
| modbus | --profile snort-modbus | 13 | قواعد كشف الثغرات المخصصة فقط |
| combined | --profile snort-combined | 65 | جميع القواعد مجتمعة |
| CVE | Quickdraw | Talos | Custom Modbus |
|---|
| CVE-2019-14462 (طول MBAP) | ✅ | ✅ | ✅ |
| CVE-2022-0367 (نقص سعة الكومة) | ❌ | ✅ | ✅ |
| CVE-2022-20685 (حرمان خدمة Snort) | ❌ | ✅ | ✅ |
| عمليات الكتابة | ❌ | ✅ | ✅ |
| الاستطلاع | ✅ | ✅ | ✅ |
| أكواد دالة الحرمان من الخدمة | ✅ | ✅ | ❌ |
| الدليل | الوصف |
|---|
gateway/ | حاوية بوابة seL4 (QEMU + نواة seL4) |
snort/ | Snort 2.9.18 IDS مع عدة ملفات تعريف قواعد (معرض لـ CVE-2022-20685) |
plc/ | محاكاة للتدفئة المحلية (libmodbus 3.1.2 معرضة، وضع CVE-2022-0367) |
cve_tools/ | أدوات هجوم لعروض الثغرات |
scripts/ | نصوص مساعدة وتجربة |
docs/ | توثيق مع رسومات Mermaid (الشبكة، الحاويات، الثغرات) |
| الأداة | الهدف | الوصف |
|---|
cve_14462_attack | libmodbus | تجاوز سعة المخزن المؤقت للكومة عبر عدم تطابق طول MBAP |
cve_0367_attack | libmodbus | نقص سعة المخزن المؤقت للكومة عبر عنوان كتابة غير صالح (FC 0x17) |
cve_20685_attack | Snort | حلقة لا نهائية لمعالج Modbus المسبق (حرمان خدمة) |
cve-2024-1086/ | نواة Linux | تصعيد الصلاحيات عبر nf_tables (الهروب من الحاوية) |
| بناء ASAN، سجلات في العناوين 100-109 |
| CVE-2019-14462 | plc-14462 | 5022 | بناء عادي، سجلات في العناوين 0-9 |
| العنوان | السجل | الوصف | قراءة/كتابة |
|---|
| 100 | HR[0] | درجة الحرارة الداخلية (درجة مئوية ÷10) | R |
| 101 | HR[1] | أمر الصمام (0-100%) | R/W |
| 102 | HR[2] | نقطة ضبط درجة الحرارة (درجة مئوية ÷10) | R/W |
| 103 | HR[3] | الوضع (0=يدوي، 1=تلقائي) | R/W |
| 104 | HR[4] | درجة الحرارة الخارجية (درجة مئوية ÷10) | R |
| 105-109 | HR[5-9] | الحالة، الموضع، درجة حرارة الإمداد، وقت التشغيل، الطاقة | R |