Статья The Car Hacker's Handbook: A Guide For Penetration Testing - Глава 3, Часть 1

Глава 3 Приступаем к кодингу

Когда вы начнете использовать CAN для связи с автомобилем, вы вполне можете найти его как мешанину различных драйверов и программных утилит. Идеальным было бы объединить CAN-инструменты и их различные интерфейсы в общий интерфейс, чтобы мы могли легко обмениваться информацией между инструментами. К счастью, есть набор инструментов с общим интерфейсом, и это бесплатно! Если у вас Linux или установлена Linux на виртуальной машине (VM), у вас уже есть этот интерфейс. Интерфейс, называемый SocketCAN, был создан на сайте разработки Open Source BerliOS в 2006 году. Сегодня термин SocketCAN используется для обозначения реализации CAN-драйверов в качестве сетевых устройств, таких как карты Ethernet, и для описания доступа приложений к шине CAN через интерфейс сетевого сокета.

В этой главе мы создадим SocketCAN, чтобы мы могли легко общаться с автомобилем.Volkswagen Group Research внесла свой вклад в реализацию оригинальной реализации SocketCAN, которая поддерживает встроенные CAN-чипы и драйверы карт, внешние USB-устройства и последовательные CAN-устройства, а также виртуальные CAN-устройства. Пакет can-utils предоставляет несколько приложений и инструментов для взаимодействия с сетевыми устройствами CAN, CAN-специфическими протоколами и возможностью настройки виртуальной среды CAN. Чтобы проверить многие примеры из этой книги, установите последнюю версию в виртуальной машине Linux в вашей системе. Новейшие версии Ubuntu могут использовать в своих стандартных хранилищах. SocketCAN связывается с сетевым стеком Linux, что упрощает создание инструментов для поддержки CAN. Приложения SocketCAN могут использовать стандартные вызовы сокетов C(язык программирования) с пользовательским семейством сетевых протоколов, PF_CAN. Эта функциональность позволяет ядру обрабатывать драйверы CAN-устройств и взаимодействовать с существующим сетевым оборудованием, чтобы обеспечить общий интерфейс и утилиты для пользовательского пространства. На рисунке 3-1 сравнивается реализация традиционного программного обеспечения CAN с объединенным SocketCAN.

Рисунок 3-1.jpg


С традиционным ПО CAN, приложение имеет свой собственный протокол, который обычно разговаривает с символьным устройством, например, с последовательным драйвером, а затем с фактическим аппаратным драйвером. Слева от рисунка SocketCAN реализован в ядре Linux. Создавая собственный семейство CAN-протоколов, SocketCAN может интегрироваться с существующими драйверами сетевых устройств, что позволяет приложениям обрабатывать интерфейс шины CAN, как если бы это был общий сетевой интерфейс.


Настройка can-utils на устройства Connect to Can

Чтобы установить can-utils, вы должны запускать дистрибутив Linux с 2008 года или позже или один из ядер Linux 2.6.25 или выше. Сначала мы установим can-utils, а затем рассмотрим, как настроить его для вашей конкретной настройки.

Установка can-utils

Вы можете использовать диспетчер пакетов для установки can-utils. Вот пример Debian / Ubuntu:
Bash:
$  sudo apt-get install can-utils
Если у вас нет приложений в вашем диспетчере пакетов, установите его из источника с помощью команды git:
Bash:
$  git clone https://github.com/linux-can/can-utils
На момент написания этой статьи, can-utils настраивает, создает и создает файлы установки, но в более старых версиях вы просто вводите make для установки из источника.


Настройка встроенных наборов микросхем

Следующий шаг зависит от вашего оборудования. Если вы ищете сниффер CAN, вы должны проверить список поддерживаемых драйверов Linux, чтобы обеспечить совместимость вашего устройства. На момент написания этой статьи встроенные CAN-драйверы Linux поддерживали следующие чипсеты:
  • Atmel AT91SAM SoCs
  • Bosch CC770
  • Карты ESD CAN-PCI / 331
  • Freescale FlexCAN
  • Freescale MPC52xx SoCs (MSCAN)
  • Intel AN82527
  • Microchip MCP251x
  • NXP (Philips) SJA1000
  • Контроллеры SoCs CAN от TI, такие как SJA1000, обычно встроены в карты ISA, PCI и PCMCIA или другие встроенные аппаратные средства.
Например, драйвер карты PCMCIA EMS реализует доступ к его чипу SJA1000. Когда вы вставляете карту EMS PCMCIA в ноутбук, модуль ems_pcmcia загружается в ядро, которое затем требует загрузки модуля sja1000 и модуля can_dev. Модуль can_dev предоставляет стандартные интерфейсы конфигурации, например, для установки скорости передачи бит для CAN-контроллеров. Модульная концепция ядра Linux также применима к драйверам аппаратных средств CAN, которые подключают CAN-контроллеры через аппаратные средства шины, такие как kvaser_pci, peak_pci и т. Д. Когда вы подключаете поддерживаемое устройство, эти модули должны автоматически загружаться, и вы должны видеть их при вводе команды lsmod. USB-драйверы, такие как usb8dev, обычно реализуют собственный протокол связи USB и, следовательно, не загружают драйвер контроллера CAN. Например, когда вы подключаете адаптер PCAN-USB PEAK-System, загружается модуль can_dev, и модуль peak_usb завершает свою инициализацию. Используя команду отображения dmesg, вы увидите аналогичный результат:
Bash:
$  dmesg
--snip--
[ 8603.743057] CAN device driver interface
[ 8603.748745] peak_usb 3-2:1.0: PEAK-System PCAN-USB adapter hwrev 28 serial     FFFFFFFF (1 channel)
[ 8603.749554] peak_usb 3-2:1.0 can0: attached to PCAN-USB channel 0 (device     255)
[ 8603.749664] usbcore: registered new interface driver peak_usb
Вы можете проверить правильность загрузки интерфейса ifconfig и убедиться, что теперь присутствует интерфейс can0:
Bash:
$  ifconfig can0
can0
Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
UP RUNNING NOARP  MTU:16  Metric:1           
RX packets:0 errors:0 dropped:0 overruns:0 frame:0           
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0           
collisions:0 txqueuelen:10           
RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
Теперь установите скорость шины CAN. (Более подробную информацию о скорости шины вы найдете в главе 5.) Ключевым компонентом, который необходимо установить, является скорость передачи данных. Это скорость шины. Типичное значение для высокоскоростной CAN (HS-CAN) составляет 500 Кбит / с. Значения 250 Кбит / с или 125 Кбит / с типичны для низкоскоростных шин CAN.
Bash:
$  sudo ip link set can0 type can bitrate 500000
$  sudo ip link set up can0
Как только вы откроете устройство can0, вы сможете использовать инструменты из can-utils в этом интерфейсе. Linux использует netlink для обмена данными между ядром и инструментами пользовательского пространства. Вы можете получить доступ к netlink с помощью команды ip link. Чтобы просмотреть все параметры netlink, введите следующее:
Bash:
$  ip link set can0 type can help
Если вы начнете видеть нечетное поведение, такое как отсутствие захвата пакетов и ошибки пакетов, интерфейс может быть остановлен. Если вы работаете с внешним устройством, просто отключите или перезагрузите его. Если устройство является внутренним, запустите эти команды для его сброса:
Bash:
$  sudo ip link set canX type can restart-ms 100
$  sudo ip link set canX type can restart
Конфигурирование последовательных CAN-устройств

Внешние CAN-устройства обычно обмениваются данными через последовательный порт. На самом деле даже USB-устройства на транспортном средстве часто общаются через последовательный интерфейс - обычно это чип FTDI от Future Technology Devices International, Ltd. Известно, что следующие устройства работают с SocketCAN:
  • Любое устройство, поддерживающее протокол LAWICEL
  • CAN232 / CANUSB последовательные адаптеры
  • VSCOM USB-последовательный адаптер
  • CANtact
Заметим: Если вы используете Arduino или создаете свой собственный сниффер, вы должны реализовать протокол LAWICEL, также известный как протокол SLCAN, в вашей прошивке, чтобы ваше устройство работало. Для получения дополнительной информации см. и ЗДЕСЬlinux-can/can-misc
linux-can/can-misc

Чтобы использовать один из USB-последовательных адаптеров, вы должны сначала инициализировать как серийное оборудование, так и скорость передачи данных на шине CAN:
Bash:
$  slcand -o -s6 -t hw -S 3000000 /dev/ttyUSB0
$  ip link set up slcan0
Демон slcand предоставляет интерфейс, необходимый для перевода последовательной связи на сетевой драйвер slcan0. В slcand могут быть переданы следующие параметры:

  • -o Открывает устройство
  • s6 Устанавливает скорость и скорость передачи CAN-шины (см. Таблицу 3-1)
  • -t hw Определяет управление последовательным потоком, будь то HW (аппаратное обеспечение) или SW (программное обеспечение)
  • -S 3000000 Устанавливает последовательный бод или скорость передачи данных, скорость
/dev/ttyUSB0 Устройство USB FTDI

В таблице 3-1 перечислены номера, переданные на -s и соответствующие скорости передачи.

Таблица 3-1.jpg


Как вы можете видеть, ввод -s6 подготавливает устройство для связи с сетью CAN-шины 500 Кбит / с. С этими параметрами вы должны теперь иметь устройство slcan0. Чтобы подтвердить, введите следующее:
Bash:
$  ifconfig slcan0
slcan0   
Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00           
NOARP  MTU:16  Metric:1           
RX packets:0 errors:0 dropped:0 overruns:0 frame:0           
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0           
collisions:0 txqueuelen:10           
RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
Большая часть информации, возвращаемой ifconfig, устанавливается на общие значения по умолчанию, которые могут быть все 0s. Это нормально. Мы просто следим за тем, чтобы мы могли видеть устройство с ifconfig. Если мы увидим устройство slcan0, мы знаем, что мы должны использовать наши инструменты для связи через последовательный порт с контроллером CAN.
Заметим:На данный момент, может быть хорошо видеть, есть ли у вашего физического устройства сниффера дополнительные огни. Часто сниффер CAN имеет зеленый и красный огни, чтобы обозначить, что он может правильно общаться с шиной CAN. Ваше устройство CAN должно быть подключено к вашему компьютеру и автомобилю, чтобы эти лампы работали должным образом. Не все устройства имеют эти огни. (Проверьте руководство по эксплуатации устройства.)
Настройка виртуальной сети CAN

Если у вас нет аппаратного обеспечения CAN для исследований, не бойтесь. Вы можете настроить виртуальную сеть CAN для тестирования. Для этого просто загрузите модуль vcan.
Bash:
$  modprobe vcan
Если вы проверите dmesg, вы не увидите гораздо больше, чем такое сообщение:
Bash:
$  dmesg
[604882.283392] vcan: Virtual CAN interface driver
Теперь вы просто настроили интерфейс, но без указания скорости передачи для виртуального интерфейса
Bash:
$  ip link add dev vcan0 type vcan
$  ip link set up vcan0
Чтобы проверить настройки, введите следующее:
Bash:
$  ifconfig vcan0
vcan0     
Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00           
UP RUNNING NOARP  MTU:16  Metric:1         
RX packets:0 errors:0 dropped:0 overruns:0 frame:0           
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0           
collisions:0 txqueuelen:0           
RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
Пока вы видите vcan0 на выходе, вы готовы к работе.


Набор утилит Can

С помощью нашего CAN-устройства, давайте посмотрим на can-utils на высоком уровне. Они перечислены и описаны здесь кратко; мы будем использовать их во всей книге, и мы рассмотрим их более подробно, когда мы их используем.
______________________________________________________________
asc2log Этот инструмент анализирует ASCII CAN-дампы в следующем виде в стандартный формат журнала SocketCAN:
Код:
0.002367 1 390x Rx d 8 17 00 14 00 C0 00 0
____________________________________________________________________________________________
bcmserver Ян-Никлас Мейер (Rc), управляющий сервером трансляций, принимает команды, подобные следующим:
Код:
vcan1 A 1 0 123 8 11 22 33 44 55 66 77 88
По умолчанию он прослушивает порт 28600. Его можно использовать для обрабатывать некоторые занятые работы при работе с повторяющимися сообщениями CAN.
______________________________________________________________

canbusload Этот инструмент определяет, какой идентификатор является наиболее ответственным за размещение самого трафика на шине и принимает следующие аргументы:
Код:
interface @ bitrate
Вы можете указать столько интерфейсов, сколько захотите, и иметь canbusload, отображающий гистограмму наихудших нарушителей полосы пропускания.
______________________________________________________________
can-calc-bit-timing Эта команда вычисляет скорость передачи битов и соответствующие значения регистра для каждого набора микросхем CAN, поддерживаемого ядром.
______________________________________________________________
candump Эта утилита сбрасывает CAN-пакеты. Он также может принимать фильтры и лог-пакеты
______________________________________________________________
canfdtest Этот инструмент выполняет тесты отправки и получения по двум CAN-шинам.
_______________________________________________________________
cangen Эта команда генерирует CAN-пакеты и может передавать их с установленными интервалами. Он также может генерировать случайные пакеты. cangw Этот инструмент управляет шлюзами между различными шинами CAN, а также может фильтровать и изменять пакеты перед отправкой их на следующую шину.
______________________________________________________________________
canlogserver Эта утилита прослушивает порт 28700 (по умолчанию) для CAN-пакетов и записывает их в стандартном формате в стандартный вывод. canplayer Эта команда повторяет пакеты, сохраненные в стандартном компактном формате SocketCAN. cansend Этот инструмент отправляет один CAN-кадр в сеть.
______________________________________________________________________
cansniffer Этот интерактивный снифер группирует пакеты по ID и выделяет измененные байты.
_______________________________________________________________________
isotpdump Этот инструмент выгружает ISO-TP CAN-пакеты, которые объясняются в разделе «Отправка данных с помощью ISO-TP и CAN» на стр. 55.
_______________________________________________________________________
isotprecv Эта утилита принимает ISO-TP CAN-пакеты и выходы в stdout.
________________________________________________________________________
isotpsend Эта команда отправляет ISO-TP CAN-пакеты, которые отправляются по каналу из stdin.
________________________________________________________________________
isotpserver Этот инструмент реализует мосты TCP / IP в ISO-TP и принимает пакеты данных в формате 1122334455667788.
_______________________________________________________________________
isotpsniffer Этот интерактивный сниффер похож на cansniffer, но предназначен для пакетов ISO-TP.
__________________________________________________________________________________________________________
isotptun Эта утилита создает сетевой туннель через сеть CAN.
___________________________________________________________________________
log2asc Этот инструмент преобразуется из стандартного компактного формата в следующий формат ASCII:
Код:
0.002367 1 390x Rx d 8 17 00 14 00 C0 00 08 00
____________________________________________________________________________
log2long Эта команда преобразует из стандартного компактного формата в читаемый пользователем формат.
_____________________________________________________________________________
slcan_attach Это инструмент командной строки для последовательных CAN-устройств.
______________________________________________________________________________
slcand Этот демон обрабатывает CAN-устройства последовательной линии. slcanpty Этот инструмент создает интерфейс psuedoterminal Linux (PTY) для связи с последовательным интерфейсом CAN.
______________________________________________________________________________


Во 2 части мы приступим к кодингу приложений SocketCAN на Си
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!