
Sparkplug B IIoT प्रोटोकॉल के लिए फ़ज़र
स्पार्कप्लग B MQTT प्रोटोकॉल कार्यान्वयनों के परीक्षण के लिए एक व्यापक सुरक्षा मूल्यांकन उपकरण। यह फ़ज़र सभी 9 संदेश प्रकारों में सभी प्रोटोकॉल फ़ील्ड्स का व्यवस्थित रूप से परीक्षण करता है, नेटवर्क पर लाइव उपकरणों की खोज करता है, और विश्लेषण के लिए विस्तृत लॉग तैयार करता है।
यह उपकरण लक्ष्य ब्रोकर को ख़राब, इंजेक्शन और प्रोटोकॉल-उल्लंघन करने वाले MQTT संदेश भेजता है। इसे केवल उन सिस्टमों के विरुद्ध चलाएँ जिनके आप स्वामी हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित अधिकार है। Sparkplug B ब्रोकर सामान्यतः OT/ICS वातावरण में स्थित होते हैं जहाँ अप्रत्याशित पेलोड भौतिक प्रक्रियाओं को बाधित कर सकते हैं — जब तक कि अन्यथा सिद्ध न हो, हर लक्ष्य को उत्पादन-निकट मानें।
यदि आप इस उपकरण का उपयोग करके Sparkplug B कार्यान्वयन में कोई कमज़ोरी खोजते हैं, तो कृपया प्रभावित विक्रेता के साथ समन्वित प्रकटीकरण का पालन करें। इस उपकरण में ही किसी सुरक्षा समस्या की रिपोर्ट करने के लिए, SECURITY.md देखें।
Sparkplug B विनिर्देशन औद्योगिक IoT (IIoT) वातावरण के लिए MQTT और Google Protocol Buffers पर निर्मित एक विषय नामस्थान और पेलोड प्रारूप को परिभाषित करता है। यह फ़ज़र Sparkplug B कार्यान्वयनों की सुरक्षा और मज़बूती का मूल्यांकन निम्नलिखित द्वारा करता है:
आधुनिक Debian/Ubuntu/Kali (PEP-668 सिस्टम) पर, --setup सिस्टम Python में pip install नहीं कर सकता — पहले वर्चुअल एनवायरनमेंट या pipx का उपयोग करें। अनुशंसित पथ:```bash
python3 -m venv .venv
source .venv/bin/activate
python3 sparkplug-fuzzer.py --setup
या यदि आप स्वयं venv प्रबंधित नहीं करना चाहते हैं तो `pipx run` के माध्यम से चलाएँ। पुराने सिस्टम पर जहाँ PEP-668 लागू नहीं है, सीधे `python3 sparkplug-fuzzer.py --setup` काम करता है।
`--setup` निम्नलिखित करेगा:
1. pip निर्भरताएँ स्थापित करें (`paho-mqtt`, `protobuf`)
2. [Eclipse Tahu](https://github.com/eclipse/tahu) भंडार का एक पिन किया हुआ टैग क्लोन करें (स्क्रिप्ट में `TAHU_REF` देखें)
3. `sparkplug_b.py` और `array_packer.py` सहायक मॉड्यूल कॉपी करें
4. `sparkplug_b.proto` को Python बाइंडिंग में संकलित करें (`protoc` उपलब्ध होने पर इसका उपयोग करता है, अन्यथा `grpcio-tools` पर वापस जाता है)
5. Tahu क्लोन को साफ करें
सेटअप के बाद, आपकी निर्देशिका में निम्नलिखित होना चाहिए:```
sparkplug-fuzzer.py # The fuzzer
sparkplug_b.py # Sparkplug B helper module (from Tahu)
array_packer.py # Array packing helper (from Tahu)
sparkplug_b_pb2.py # Generated protobuf bindings
requirements.txt # Python dependencies
python3 sparkplug-fuzzer.py --setup # first-time setup python3 sparkplug-fuzzer.py -H localhost -p 1883 -v # run fuzzer
This will:
1. Connect to the broker at `localhost:1883` पर ब्रोकर से कनेक्ट करें
2. Listen for 10 seconds to discover existing Sparkplug devices के लिए 10 सेकंड तक सुनें मौजूदा Sparkplug उपकरणों को खोजने
3. Establish the fuzzer as a Sparkplug node/device को एक Sparkplug नोड/उपकरण के रूप में स्थापित करें
4. Run all 12 fuzz categories (~635+ test cases) सभी 12 fuzz श्रेणियाँ (~635+ परीक्षण मामले) चलाएँ
5. Target any discovered devices with spoofed messages खोजे गए किसी भी उपकरण को नकली संदेशों से लक्षित करें
6. Write results to `sparkplug_fuzz.jsonl` परिणाम `sparkplug_fuzz.jsonl` में लिखें
## Usage
### Command-Line Options```
python3 sparkplug-fuzzer.py [OPTIONS]
| विकल्प | डिफ़ॉल्ट | विवरण |
|---|---|---|
-H, --host | localhost | MQTT ब्रोकर का होस्टनाम या IP |
-p, --port | 1883 (या 8883 के साथ --tls) | MQTT ब्रोकर पोर्ट |
-u, --username | कोई नहीं | MQTT उपयोगकर्ता नाम (MQTT_USERNAME env var को भी पढ़ता है) |
-P, --password | कोई नहीं | MQTT पासवर्ड (MQTT_PASSWORD को भी पढ़ता है; stdin से बिना इको के पढ़ने के लिए - पास करें) |
--tls | बंद | TLS पर कनेक्ट करें; यदि -p सेट नहीं है तो डिफ़ॉल्ट पोर्ट 8883 हो जाता है |
--cafile | कोई नहीं | TLS सर्वर प्रमाणपत्र सत्यापन के लिए CA बंडल |
--insecure | बंद | TLS होस्टनाम/प्रमाणपत्र सत्यापन छोड़ें (केवल परीक्षण के लिए) |
-g, --group | Sparkplug B Devices | Sparkplug समूह ID जिसके तहत फ़ज़र पंजीकृत होता है |
-n, --node | FuzzNode | फ़ज़र के लिए Sparkplug एज नोड ID |
-d, --device | FuzzDevice | फ़ज़र के लिए Sparkplug डिवाइस ID |
-c, --categories | all | चलाने के लिए फ़ज़ श्रेणियों की स्पेस-सेपरेटेड सूची |
--discovery-time | 10 | नेटवर्क डिस्कवरी के लिए निष्क्रिय रूप से सुनने के सेकंड |
--delay | 0.1 | फ़ज़ संदेशों के बीच सेकंड में विलंब |
--probe-anon-write | बंद | डिस्कवरी के दौरान, यह पुष्टि करने के लिए एक QoS=1 प्रकाशन भेजें कि ब्रोकर अप्रमाणित PUBLISH स्वीकार करता है या नहीं |
-l, --log | sparkplug_fuzz.jsonl | आउटपुट लॉग फ़ाइल का नाम (सापेक्ष पथ --output-dir के अंदर आते हैं; निरपेक्ष पथ ज्यों-के-त्यों माने जाते हैं) |
--output-dir | ./sparkplug-runs/<UTC-ts>_<host>/ | प्रति-रन आउटपुट निर्देशिका। यदि मौजूद नहीं है तो बनाई जाती है। |
-v, --verbose | 0 | कंसोल वर्बोसिटी बढ़ाएँ (-v = जानकारी, -vv = डीबग)। -vv फ़ज़-जनरेटर स्किप्स को भी दिखाता है, और थ्रॉटल किया गया paho.mqtt लॉगर वर्बोसिटी के साथ INFO/DEBUG पर बढ़ जाता है। |
--setup | — | सभी निर्भरताएँ स्थापित करें और बाहर निकलें |
--tahu-path | — | eclipse/tahu (या इसकी python/core निर्देशिका) की स्थानीय क्लोन का पथ। git clone के बजाय एयर-गैप्ड वातावरण में --setup द्वारा उपयोग किया जाता है। |
--extra-string-payloads | — | अतिरिक्त स्ट्रिंग-इंजेक्शन पेलोड (प्रति पंक्ति एक, UTF-8) वाली फ़ाइल का पथ। अंतर्निर्मित STRING_FUZZ_VALUES में जोड़ा गया; उन्हें प्रतिस्थापित नहीं करता। अधिकतम 10 MB / 10,000 पेलोड। कस्टम स्ट्रिंग कॉर्पोरा देखें। |