
Фаззер для протокола Sparkplug B IIoT
Инструмент для всесторонней оценки безопасности протокольных реализаций Sparkplug B MQTT. Фаззер систематически тестирует все поля протокола для всех 9 типов сообщений, обнаруживает активные устройства в сети и создает подробные журналы для анализа.
Этот инструмент отправляет искаженные, внедряющие и нарушающие протокол сообщения MQTT целевому брокеру. Запускайте его только против систем, которыми вы владеете или на тестирование которых у вас есть явное письменное разрешение. Брокеры Sparkplug B часто находятся в средах OT/ICS, где неожиданные полезные нагрузки могут нарушить физические процессы — считайте, что любая цель находится рядом с производственной средой, пока не доказано обратное.
Если вы обнаружите уязвимость в реализации Sparkplug B с помощью этого инструмента, пожалуйста, следуйте скоординированному раскрытию информации с затронутым поставщиком. Чтобы сообщить о проблеме безопасности в самом инструменте, см. SECURITY.md.
Спецификация Sparkplug B определяет пространство имен тем и формат полезной нагрузки, построенные на MQTT и Google Protocol Buffers для сред промышленного Интернета вещей (IIoT). Этот фаззер оценивает безопасность и устойчивость реализаций Sparkplug B путем:
На современных системах Debian/Ubuntu/Kali (системы PEP-668) --setup не может выполнить pip install в системный Python — сначала используйте виртуальное окружение или pipx. Рекомендуемый путь:```bash
python3 -m venv .venv
source .venv/bin/activate
python3 sparkplug-fuzzer.py --setup
Или запустите через `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
Это позволит:
1. Подключиться к брокеру на `localhost:1883`
2. Прослушивать 10 секунд для обнаружения существующих устройств Sparkplug
3. Установить фаззер как узел/устройство Sparkplug
4. Запустить все 12 категорий фаззинга (~635+ тестов)
5. Нацелиться на любые обнаруженные устройства с поддельными сообщениями
6. Записать результаты в `sparkplug_fuzz.jsonl`
## Использование
### Параметры командной строки```
python3 sparkplug-fuzzer.py [OPTIONS]
| Опция | По умолчанию | Описание |
|---|---|---|
-H, --host | localhost | Имя хоста или IP-адрес MQTT-брокера |
-p, --port | 1883 (или 8883 с --tls) | Порт MQTT-брокера |
-u, --username | Нет | Имя пользователя MQTT (также читает переменную окружения MQTT_USERNAME) |
-P, --password | Нет | Пароль MQTT (также читает MQTT_PASSWORD; передайте - для чтения из stdin без эха) |
--tls | выкл | Подключение через TLS; порт по умолчанию становится 8883, если -p не указан |
--cafile | Нет | Пакет CA для проверки сертификата TLS-сервера |
--insecure | выкл | Пропустить проверку имени хоста/сертификата TLS (только для тестирования) |
-g, --group | Sparkplug B Devices | Идентификатор группы Sparkplug, под которым регистрируется фаззер |
-n, --node | FuzzNode | Идентификатор граничного узла Sparkplug для фаззера |
-d, --device | FuzzDevice | Идентификатор устройства Sparkplug для фаззера |
-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 = info, -vv = debug). -vv также показывает пропуски генератора фаззинга, а ограниченный логгер paho.mqtt переключается на INFO/DEBUG с подробностью. |
--setup | — | Установить все зависимости и выйти |
--tahu-path | — | Путь к локальному клону eclipse/tahu (или его каталогу python/core). Используется --setup в изолированных средах вместо git clone. |
--extra-string-payloads | — | Путь к файлу с дополнительными полезными нагрузками для внедрения строк (по одной на строку, UTF-8). Добавляется к встроенному STRING_FUZZ_VALUES; не заменяет их. Максимум 10 МБ / 10 000 полезных нагрузок. См. Пользовательские строковые корпуса. |