Симулятор ECU для тестирования UDS (Unified Diagnostic Services) — стандартного протокола диагностики автомобилей (ISO 14229). Эмулирует ответы ECU на UDS-запросы: ReadDataByIdentifier, SecurityAccess, RoutineControl. Используется для разработки automotive security tools без доступа к реальному ТС.
git clone https://github.com/zombieCraig/UDSim cd UDSim && pip install -r requirements.txt ./udsim.py vcan0
Симулятор и фаззер UDS
UDSim — это графический симулятор, который может эмулировать различные модули в автомобиле и отвечать на UDS-запросы. Он был разработан как учебный инструмент для работы в паре с ICSim. Он также обладает некоторыми уникальными обучающими возможностями и может использоваться для тестирования безопасности дилерских или других инструментов, которые подключаются к OBD-разъему.
ПРИМЕЧАНИЕ: Это полная переработка uds-server.

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, но в настоящее время мы пересматриваем план фаззинга. На данный момент уровни следующие:
На данный момент используйте уровень фаззинга 1 или 0. Скорее всего, мы реализуем уровень 2, как запланировано, и если появятся лучшие идеи для уровней 3 и 4, дайте нам знать. Для более сложного фаззинга вам следует использовать 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).