Захват управления. Как получить полный контроль и удаленно управлять автомобилем
Эксплойт
В мире, где любой человек может вызвать автомобиль прямо к порогу своего дома и безопасно добраться до места назначения, крайне важно, чтобы они предоставили своим пассажирам доступ к управлению основными функциями автомобиля с заднего сиденья, поскольку сейчас не за горами день, когда уже не будет водителя-человека.
Введение в CAN
Современный автомобиль имеет тонны систем управления, функционирующих во многих отношениях, как микросервисы в веб-разработке. Подумайте о подушках безопасности, торможении, круиз-контроле, электроусилителе руля, аудиосистемах, электростеклоподъемниках, дверях, регулировке зеркал, аккумуляторах и системах подзарядки для электромобилей. Эти системы должны быть в состоянии общаться и читать состояние друг от друга. В 1983 году команда Bosch приступила к разработке шины CAN (Controller Area Network) для решения этой сложной проблемы.
Думайте о шине CAN как о простой сети, в которой любая система в автомобиле может прослушивать и отправлять команды. Он элегантно интегрирует все эти сложные компоненты, что позволяет использовать многие из современных функций, которые мы все любим в автомобилях сегодня.
Автомобили с автономным управлением и как они связаны с CAN
Поскольку темпы развития автомобилей с самостоятельным вождением резко возросли, CAN стало популярным.
Почему?
Большинство автомобильных компаний не производят свои собственные транспортные средства с нуля, и им необходимо найти способы программного управления автомобилем.
Путем обратного инжиниринга, CAN позволяет подавать команды на автомобиль с помощью ПО.
Самыми необходимыми командами являются управление (угол поворота), ускорение и торможение.
Используя такие датчики, как LIDAR, автомобиль может видеть мир. ПК внутри авто может принимать решения о подаче команд на CAN для управления, ускорения, торможения и многого другого.
Не каждый автомобиль готов к самостоятельному вождению, и есть причина, по которой команда Voyage выбрала Ford Fusion.
Взлом Ford Fusion
Чтобы перед хаком климат-контроля в Ford Fusion, я открыл свою любимую книгу (The Car Hacker's Handbook) и приступил к работе.
Прежде чем мы углубимся в автомобиль, давайте взглянем на главу «Руководства хакера», чтобы описать три важных понятия: протоколы шины, шина CAN и кадры CAN.
Шина CAN
CAN был стандартом для легковых и легких грузовых автомобилей США с 1994 года, но он не стал обязательным до после 2008. Он работает на двух проводах: CAN высокий (CANH) и CAN низкий (CANL). CAN использует дифференциальную сигнализацию, что означает, что когда поступает сигнал, CAN повышает напряжение на одной линии и сбрасывает другую линию на равную величину. Дифференциальная сигнализация используется в средах, которые должны быть устойчивы к помехам, например, в автомобильных системах и на производстве.

При этом пакеты, которые передаются по шине CAN нестандартны.
Каждый пакет шины CAN содержит четыре ключевых элемента:
Арбитражный идентификатор - это широковещательное сообщение, которое идентифицирует идентификатор устройства, пытающегося установить связь, хотя любое одно устройство может отправить несколько арбитражных идентификаторов. Если два пакета CAN отправляются по шине одновременно, выигрывает пакет с более низким идентификатором арбитража.
Расширение идентификатора (IDE) Этот бит всегда равен o для стандартного CAN.
Код длины данных (DLC) - это размер данных, который варьируется от 0 до 8 байтов.
Данные. Собственно, данные. Максимальный размер может составлять до 8 байтов.
Формат стандартных пакетов CAN

Фреймы
Чтобы включить или выключить кондиционер, нам нужно найти правильную шину CAN (в машине может быть несколько).
Ford Fusion имеет как минимум 4 задокументированные шины, 3 из которых работают на скорости 500 кбит / с (высокоскоростная CAN), а одна - на 125 кбит / с (среднескоростная CAN).
Порт OBD-II предоставляет две из этих шин: HS1 и HS2, но они защищены брандмауэром на этом автомобиле и не позволяют вам подделывать команды.
С помощью Алана из Voyage мы вывернули проблему наизнанку и обнаружили свободный доступ к HS1, HS2, HS3 и MS.
Решение было в задней части порта OBD-II, куда все эти шины поступают на устройство, называемое шлюз-модулем.

Поскольку A / C может быть изменен через автомобильный медиаинтерфейс (SYNC), мы пошли прямо к шине MS.
Но как сделать так, чтобы наш компьютер мог читать и записывать CAN-пакеты?
Ответ - SocketCAN, набор драйверов CAN с открытым исходным кодом и сетевым стек, предоставленный Volkswagen Research для ядра Linux.
Мы можем подключить 3 провода от автомобиля: GND, MSCANH, MSCANL к Kvaser Leaf Light HSv2 (300 долларов на Amazon) или к CANable (25 долларов на Tindie) и получить компьютер с последним ядром Linux для загрузки шины CAN в качестве сетевого устройства.
modprobe can modprobe kvaser_usb ip link set can0 type can bitrate 1250000 ifconfig can0 up
После загрузки мы можем использовать Candump Can0 и начать смотреть на трафик:

Однако это равносильно просмотру амплитуды звукового сигнала - очень сложно охарактеризовать происходящее и обнаружить закономерности.
Нам нужен эквивалент частотного анализа для этой проблемы, и, к счастью, он существует и называется cansniffer.
Cansniffer показывает список идентификаторов и помогает сосредоточиться только на том, что меняется в разделе данных кадра CAN. Когда мы разбираемся с конкретными идентификаторами, мы можем использовать их, чтобы отфильтровать то, что нам не нужно, и включить только то, что, по нашему мнению, связано с нашей проблемой.
Вот пример cansniffer на шине MS. Мы отфильтровываем все и только позволяем CAN идентификаторам 355, 356 и 358 показываться. Тем временем я нажимаю кнопки регулировки температуры на автомобиле, и мы видим, что 001C00000000, представляющий нажатие кнопки, всплывает в самом конце.

Следующим шагом является подключение функции A / C к нашему ПК, работающему внутри автомобиля.
ПК работает под управлением Robot Operating System (ROS), и, к счастью, есть модуль, который облегчает нам эту задачу, поскольку мы используем SocketCAN. socketcan_bridge превращает наш кадр CAN в сообщение в теме ROS. Отлично!
Вот пример того, как выполняется декодирование:
if frame.id == 0x356:
raw_data = unpack ('BBBBBBBB', frame.data)
fan_speed = raw_data [1] / 4
driver_temp = parse_tempera (raw_data [2: 4])
passenger_temp = parse_tempera (raw_data [4: 6])
Полученные данные хранятся в CelsiusReport.msg:
bool auto bool system_on bool unit_on bool dual bool max_cool bool max_defrost bool recirculation bool head_fan bool feet_fan bool front_defrost bool rear_defrost string driver_temp string passenger_temp
После нажатия всех соответствующих кнопок в машине мы получаем список:

И тогда мы можем просто отправить команды на узел ROS и заставить его преобразовать его в конкретные коды автомобиля:
rostopic pub /celsius_control celsius/CelsiusControl ac_toggle
Результат
Теперь мы можем выдавать те же коды CAN на шину CAN, как будто мы по настоящему нажимаем на кнопки!
Это дает нам возможность удаленно изменять температуру автомобиля, находясь в приложении, сидя на заднем сиденье. Успех!
