UDSim

Hardware & Industrial

Симулятор ECU для тестирования UDS (Unified Diagnostic Services) — стандартного протокола диагностики автомобилей (ISO 14229). Эмулирует ответы ECU на UDS-запросы: ReadDataByIdentifier, SecurityAccess, RoutineControl. Используется для разработки automotive security tools без доступа к реальному ТС.

Добавлен 13.07.2026 · Обновлён 13.07.2026 · Hardware & Industrial
Установка
git clone https://github.com/zombieCraig/UDSim
cd UDSim && pip install -r requirements.txt
./udsim.py vcan0
переведено ИИ

UDSim

Симулятор и фаззер UDS

Симулятор Диагностических Услуг (Unified Diagnostic Services)

UDSim — это графический симулятор, который может эмулировать различные модули в автомобиле и отвечать на UDS-запросы. Он был разработан как учебный инструмент для работы в паре с ICSim. Он также обладает некоторыми уникальными обучающими возможностями и может использоваться для тестирования безопасности дилерских или других инструментов, которые подключаются к OBD-разъему.

ПРИМЕЧАНИЕ: Это полная переработка uds-server.

Скриншот UDSim

Возможности

UDSim принимает следующие аргументы командной строки:

  Usage: udsim [options] <can-if>
     -c <config file>    Configuration file for simulator
     -l <logfile>        Parse candump log to generate learning DB
     -f                  Fullscreen
     -v                  Increase verbosity

Единственный обязательный аргумент — CAN-интерфейс. В папке src есть несколько примеров скриптов инициализации CAN для настройки интерфейсов canX и vcanX, если они вам понадобятся.

UDSim имеет три режима: Обучение, Симуляция и Атака

Синтаксис и параметры файла конфигурации

Каждый файл — это обычный текстовый файл, разделенный на секции, с записями конфигурации в стиле ключ=значение. Пробелы непосредственно перед или после "=" игнорируются. Пустые строки и строки, начинающиеся с ";", игнорируются, их можно использовать для комментариев.

[UDS_ID] - Разделитель секций; UDS_ID — это шестнадцатеричный CAN-идентификатор; каждая секция определяет UDS-сервер или UDS-клиент.

pos - координаты x,y в GUI для привязки графического элемента этого ECU

responder - установите в '1', если это UDS-сервер, или в '0', если это UDS-клиент

positiveID - идентификатор арбитража для отслеживания позитивных UDS-ответов

negativeID - идентификатор арбитража для отслеживания негативных UDS-ответов

{Packets} - Разделитель подсекций; Packets — это постоянная строка; последующие строки содержат наблюдаемые пакеты, отформатированные в стиле can-utils (см. parse_canframe)

Пример файла конфигурации

Полезен, если вы просто хотите начать работать на виртуальной CAN-шине, не имея доступа к автомобилю или существующему файлу конфигурации. Поддерживает только SID 0x10 DiagnosticSessionControl.

[7e0]
pos = 300,131
responder = 0
positiveID = 7e8
negativeID = 7e8
{Packets}
7e0#0210030000000000

[7e8]
pos = 350,181
responder = 1
{Packets}
7e8#0650030096177000

Обучение

По умолчанию UDSim слушает активность на указанном CAN-интерфейсе и автоматически определяет модули с поддержкой UDS в автомобиле на основе реального сетевого трафика. Для сбора данных вам следует подключить какое-либо диагностическое устройство и запустить его на вашем автомобиле, пока UDSim отслеживает CAN-шину.

Нажмите на значок диска, чтобы сохранить изученную информацию. При нажатии "Сохранить" создается файл конфигурации с именем config_data.cfg. Это довольно простой для чтения файл, содержащий сводку UDS CAN-пакетов, оформленную в формате INI. Возможно, вы захотите скопировать этот файл и присвоить ему определенное имя после сохранения, чтобы случайно не перезаписать его. Этот файл может быть использован позже, если передать UDSim параметр -c.

UDSim также может учиться из записанного сетевого трафика. Если предоставить UDSim файл журнала через параметр -l, он разберет всю информацию из журнала, а затем автоматически переключится в режим симуляции после завершения. Файлы журнала должны быть в формате candump.

Поскольку UDSim использует сетевую коммуникацию для изучения модулей в автомобиле, способных взаимодействовать по UDS, ему не нужен какой-либо предварительный опыт работы с автомобилем. Он может работать с любым автомобилем, использующим ISO-TP. Он обладает некоторыми базовыми знаниями о распространенных UDS-командах, но не полагается на них и должен работать даже с новыми автомобилями или автомобилями с нестандартными UDS-командами.

Симуляция

Когда вы убедитесь, что UDSim достаточно узнал, вы можете нажать кнопку MODE, чтобы переключить состояние в режим Simulation (Симуляция). В этот момент UDSim будет эмулировать автомобиль. Вы можете отсоединить UDSim от реального автомобиля, и ваши диагностические инструменты по-прежнему должны функционировать и получать информацию, как если бы вы были подключены к реальному автомобилю.

Примечание для докладчиков: UDSim отлично подходит для демонстрации атак без прямого показа автомобиля или устройства. Вы можете записать сессию атаки с помощью UDSim (или любого CAN-логгера), и после того, как UDSim отслеживает трафик, вы можете сохранить и изменить файл конфигурации, чтобы скрыть виновника. Затем вам нужно взять на сцену только UDSim и файл конфигурации, и вы сможете воссоздать атаку в живом интерактивном режиме.

Режим симуляции также полезен для тестирования инструментов, связанных с CAN, или проведения занятий. Пожалуйста, обратите внимание, что режим симуляции (в текущей версии) не будет генерировать трафик, которого он никогда не видел. Поэтому не ожидайте возможности запросить информацию в режиме симуляции для которой не было замечено сетевого трафика.

Параметры симуляции

На карточке информации о модуле доступны два варианта: Fake Responses (Поддельные ответы) и Ignore (Игнорировать). Ignore достаточно очевиден. Если вы установите модуль в режим игнорирования, он не будет отвечать на входящие запросы.

Fake Responses использует поведение, аналогичное uds-server, пытаясь создать ответ на любой запрос, даже если он не learns, как работает этот запрос (т.е., никогда его не видел). Он делает это, используя стандартный синтаксис UDS для ответов и просто подставляя какие-то значения по умолчанию или случайные значения для ответа. Это в основном полезно только для того, чтобы увидеть, с чем пытается общаться инструмент, или если вам нужен модуль, который использует смесь изученного поведения и симулируемого поведения для любых отсутствующих UDS-запросов.

Атака

UDSim имеет встроенный фаззер. Это очень ограниченная система фаззинга по сравнению с полноценным фреймворком для фаззинга. Тем не менее, он может быть полезен для быстрого и легкого фаззинга устройства, и он понимает и уважает протокол ISO-TP (если только вы не хотите, чтобы он этого не делал).

Параметры атаки

Карточка информации о модуле имеет два варианта: Fuzz VIN (Фаззинг VIN) и Fuzz Level (Уровень фаззинга).

Когда вы фаззите модуль, часто полезно не менять VIN. Многие автомобильные инструменты используют только VIN для определения, что они действительно общаются с ожидаемым автомобилем. Поэтому, если вы не тестируете входные данные VIN диагностических инструментов, лучше оставить эту опцию отмеченной.

Fuzz Level. Когда ползунок находитсяfar left, это отключает фаззинг и заставляет модуль работать в режиме симуляции. Это может быть полезно, если вы хотите, чтобы некоторые модули фаззились, а другие работали корректно. Эта шкала первоначально была разработана для работы с уровнями фаззинга uds-server, но в настоящее время мы пересматриваем план фаззинга. На данный момент уровни следующие:

  • 0 - Без фаззинга, включена симуляция
  • 1 - Фаззинг части данных в ответах
  • 2 - TBD (Будет определено) - Текущий план, фаззинг переменной длины
  • 3 - TBD
  • 4 - TBD - Текущий план, фаззинг также ISO-TP, полный рандом

На данный момент используйте уровень фаззинга 1 или 0. Скорее всего, мы реализуем уровень 2, как запланировано, и если появятся лучшие идеи для уровней 3 и 4, дайте нам знать. Для более сложного фаззинга вам следует использовать Peach Fuzzer.

Peach Fuzzer

При первоначальном проектировании UDSim планировалось использовать встроенную систему фаззинга, во многом похожую на предшественника uds-server. Однако позже было решено, что лучше передать фаззинг более полному движку. По этой причине мы решили экспортировать изученную информацию в другую утилиту с открытым исходным кодом — Peach Fuzzer. В пользовательском интерфейсе по-прежнему есть виджеты для фаззинга, которые в настоящее время ничего не делают. Это потому, что мы все еще решаем, является ли этот подход правильным. Мы можем использовать ползунок для изменения способа фаззинга в Peach, а можем полностью отказаться от Peach.

Целью режима атаки UDSim является фаззинг ответов от (эмулируемого) автомобиля. Это очень полезно для тестирования на уязвимости в дилерских инструментах и инструментах аудита безопасности. Мы хотим сделать UDSim простым в использовании, но при этом обеспечить гибкость, которая понадобится исследователю для более глубокого погружения в свои исследования.

XML-файлы Peach сохраняются в fuzz_can.xml и могут быть дополнительно изменены для ваших собственных целей тестирования.

На данный момент считайте режим Attack (Атака) очень ранней альфа-версией.

ПРИМЕЧАНИЕ: В настоящее время есть проблема с Mono для CAN-издателя. В исходном коде Mono для UnixSocket у Mono есть функция, которая может проверить, доступна ли сокет для записи. Он делает это, записывая 0-байтовый кадр в сокет. Это вызывает ошибку в CAN-сокете, что, в свою очередь, заставляет Mono пометить сокет как недоступный для записи, установив флаг. Даже если вы позже отправите кадр с допустимой длиной, Mono даже не попытается отправить пакет из-за этого флага.

Проблема находится здесь: https://github.com/mono/mono/blob/master/mcs/class/Mono.Posix/Mono.Unix/UnixStream.cs#L63

            long write = Native.Syscall.write (fileDescriptor, IntPtr.Zero, 0);
            if (write != -1)
                canWrite = true; 

Есть несколько способов обойти это. Мы можем написать другой издатель, который использует socketcand, или еще более "хакнутую" версию, которая обращается к can-utils.

Я ищу экспертов по фаззингу Peach, которые могли бы поделиться обратной связью о лучшем направлении для работы с этим. Пока файл fuzz_can.xml находится в режиме ожидания, пока мы не узнаем, какой тип данных будет проще всего для издателя обрабатывать.

Компиляция

# Install dependencies
apt-get install libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev

# Build UDSim
cd ./src
make

Для фаззинга атак

Целью UDSim является передача фаззинга реальному движку фаззинга. Peach Fuzzer был выбран как хороший движок с открытым исходным кодом для фаззинга.

Комьюнити-версию можно получить здесь: http://community.peachfuzzer.com/

Вам нужно скопировать папки из UDSim в исходный код Peach.

  cp Peach.Core.OS.Linux/Publishers/* <your peach source folder>/Peach.Core.OS.Linux/Publishers/

В папке peach вам нужно будет скомпилировать новую версию peach:

  ./waf install --variant=linux_x86_64_debug

Обратите внимание, что на момент написания этой документации существовала ошибка, при которой для компиляции peach на 64-битном Linux также требовалось удалить файл: Peach.Core.Analysis.Pin.BasicBlocks/wscript_build.

После компиляции поместите скрипт peach в свой путь поиска. UDSim предполагает, что peach находится в пути поиска (PATH).

Комментарии
Войдите, чтобы оставить комментарий