[Перевод] Конференция DEFCON 27. Твой автомобиль – мой автомобиль. Часть 2

Конференция DEFCON 27. Твой автомобиль — мой автомобиль. Часть 1

В конце видео вы услышали щелчок — это сработала разблокировка механического замка рулевого колеса, которую мы не можем обойти с помощью электроники. Нужно использовать что-то механическое, сломать цилиндр замка вручную или проделать нечто подобное, чего я не собирался делать с ее машиной. Все прошивки, продемонстрированные в этих видео, будут доступны на GitHub после моего выступления, так что вы просто заходите по адресу, указанному на слайде, и скачиваете файл OpenRemoteStart.

Давайте поговорим о том, что именно происходит, когда мы добавляем интернет в эту систему, потому что это должно пойти на пользу, не так ли? Как я уже сказал, я приобрел модуль дистанционного управления сигнализацией под названием MyCar. Он выпускается в различных модификациях, у меня была модель Linkr LT-1.

uzj7vq0oiy7yd7o_v4idoec3uoi.jpeg

MyCar — всего лишь бренд, и такие модули продаются под названиями Linkr LT-1, MyCar KIA, Visions MyCar, Carlink (CL6) и т.д. Как оказалось, какое-то время дилерские центры KIA в Канаде устанавливали на автомобили эту систему или, по крайней мере, приложение под названием MyCar KIA. Интересно, что это приложение больше не доступно для скачивания в AppStore. Я также хочу отметить, что остановил свой выбор на продукции Fortin и MyCar, но согласно отзывам пользователей на тематических форумах внештатной автосигнализации, другие системы ведут себя не лучше и имеют аналогичные проблемы.

У меня возник важный вопрос: почему на вторичном рынке автомобильной сигнализации продается продукт с проблемами безопасности, и это никого не волнует? Поэтому если кого-то из вас заинтересуют системы дистанционного стартера, обратите внимание на пару важных обстоятельств. Во-первых, как я уже упоминал ранее, если система ДС неправильно установлена на автомобиль с механической трансмиссией, вполне возможно, что после дистанционного запуска двигателя автомобиль просто поедет без водителя, если в коробке включена какая-то передача. Это действительно опасно. Вторая опасность состоит в том, что если кто-то запарковал автомобиль в пристроенном к дому гараже и у него случайно дистанционно включился двигатель, можно задохнуться от накопившегося угарного газа. Так что если у вас есть система ДС и пристроенный гараж, вы определенно должны иметь детекторы угарного газа.

Если вы используете системы ДС, никогда не пытайтесь запустить двигатель машины, не зная точно, где она находится, потому что последствия могут быть катастрофичными.

Устройство MyCar, маленькая черная коробочка с двумя выходящими из нее проводками, имеет 8 портов, два из которых предназначены для интерфейса отладчика. Подключение к этому интерфейсу показало, что устройство работает под управлением Linux, о чем производитель умалчивает. Попасть в оболочку прошивки элементарно с помощью пароля oelinux 123, но вы можете и без входа в систему использовать АЕ Engine, который позволяет вводить AT-команды из командной строки, в том числе команду изменить IP-адрес устройства, с которым связывается данный модуль.

gapu4wmwqb2qldoh8yg5o-fllxi.jpeg

Если мы посмотрим на строки внизу, можно увидеть IP-адрес сервера, с которого модуль MyCar получает обновления прошивки. Устройство снабжено L-портом, который позволяет «прослушивать» команды, получаемые модулем. Используя АЕ Engine и меняя IP сопряженного устройства, я смог определить, что это устройство общается с ДС по незашифрованному протоколу UDP.

Я не особо в это вникал, но думаю, что это довольно значимый и интересный факт. Если вас интересует дополнительная информация об этом устройстве, взгляните на этот слайд — здесь указано напряжение питания 3,3В, скорость передачи данных 115200 бод, адрес сервера для обновления прошивки, root-пароль и ссылка на руководство пользователя.

idcfqg76qkvacfv5n3vjqaf0cvq.jpeg

Устройство может «терпимо» относиться и к более высокому напряжению питания.

Как я уже сказал, у нас бывает довольно холодно. Примерно через месяц после того, как я подарил эту систему своей подруге, я решил вытащить блок из машины и поработать с ним как следует. Дело в том, что весь этот месяц я гнал от себя мысли об уязвимости этого устройства. На следующую неделю обещали мороз до -30F°, так что мне пришлось спешить. Я подсоединился к оболочке и заставил ее работать, но поскольку сотовая связь в моей домашней лаборатории не слишком хороша, я решил поработать с блоком на другом компьютере. Устройство FTDI, которое я использую, имеет короткий шнур, поэтому я нашел другой, большей длины, подсоединил его к блоку ДС, подключил к компьютеру, и как только включил питание, мой модуль задымил!

Из этого можно извлечь такой урок: если вы занимаетесь аппаратным взломом, имейте наготове запасной блок! Моя девушка сформулировала мораль этой истории так: если твоя вторая половинка — хакер, не позволяй ему играть с твоими рождественскими подарками! А теперь давайте посмотрим на программное обеспечение, думаю, здесь ничего дымить не станет.

3m_b-x5tnvrmdivelvewqqblkk0.jpeg

Я запустил прокси-сервер типа «человек посередине», отключил проверку SSL на своем телефоне и стал смотреть, какой трафик отправляется приложением на серверную часть. При регистрации я заметил, что система берет мой адрес электронной почты и отправляет его веб-сервису, чтобы удостовериться, что этот адрес привязан к существующей учетной записи. Интересно, что при этом система использовала базовую аутентификацию, потому что я еще не создал учетную запись. Я не знал, что мне делать с этой информацией, поэтому просто записал ее в блокнот и двинулся дальше. Я создал свою учетную запись и вошел в систему, а первое, что делает приложение при авторизации — это вызывает веб-сервис для проверки текущего пользователя. Поэтому я просто вызвал этот веб-сервер с помощью учетных данных, которые видел раньше, и которые были использованы для проверки того, существует ли мой адрес электронной почты, и в ответ получил доступ Mycar Admin.

wj76f0upp2w-cksqwmpk2-tes1q.jpeg

Я сомневался, что это была учетная запись настоящего администратора системы, потому что, несмотря на громкое звучание, она обладала низкими привилегиями. В конце концов, все мы знаем таких людей.

Поэтому я создаю еще один запрос — команду EngineStart, чтобы завести с этого аккаунта машину, нажимаю «Send», получаю в ответ статус команды — »200 ОК», и примерно через три секунды моя машина трогается с места.

ua-evli2akyku7oukkdbcaj3hgm.jpeg

Как оказалось, учетная запись Mycar Admin действительно была аккаунтом администратора, жестко закодированным в мобильное приложение. Но это еще не все. На одном из предыдущих слайдов вы видели такую штуку, как API key. Опять же из мониторинга трафика моего фальшивого прокси-сервера я узнал, что эти ключи API можно использовать вместо имени пользователя и пароля. Если использовать в качестве имени пользователя «API» и один из этих ключей, вы можете аутентифицировать пользователя.

sbsb7znn891e00_cd7aow8guboo.jpeg

Поэтому я скопировал содержимое строки «APIKey», вставил его в строку Password приложения POST и нажал кнопку «Send».

fuiymnmis74llx9lagaawx52-a8.jpeg

Однако это не сработало, и я в течение долгих 5 минут не мог понять, почему. Наконец, до меня дошло, что я забыл вырезать кавычки и запятую в скопированном ключе API, о чем мне и было сообщено: «Вы сделали ошибку в синтаксисе SQL». Мне стало ясно, что можно просто использовать базовую SQL-инъекцию для обхода всего процесса входа в систему и стать администратором или любым пользователем, каким захотите. Не думаю, что кто-либо пытался угнать автомобиль с помощью SQL-инъекции, так что давайте попробуем это сделать.

k_gtkksr3fmgw5jbpvmf6swu940.jpeg

ziiiwgebvcsfejg4uo0tz0ag45q.jpeg

В общем, я зашел под своей учетной записью, нажал «Send» и получил в ответ статус »200 ОК». На этот раз я сообразил записать видео. Оно немного темное, потому что я снимал поздним вечером из окна моего офиса. Итак, я ввожу команду, и вы видите через окно, что внизу во дворе у машины вспыхивают фары. Сначала их свет слабый, но потом фары начинают светить на полную мощность — это включился двигатель. Итак, я завел автомобиль с помощью SQL-инъекции (аплодисменты аудитории).

Но это еще не все. SQL-инъекцию можно использовать не только для авторизации, но и для замены других параметров, таких как URL, параметры тела строки запроса и т.д. Фактически эта система везде использует SQL-инъекции. Глядя на сообщения об ошибках можно увидеть, что то, что мы вводим в качестве пароля, сравнивается непосредственно со столбцом password в базе данных.

hffejsqkxicafdeu5ogpctuxjba.jpeg

Это значит, что у них используются простые текстовые пароли в SQL-инъекции. Как говорится, «это совсем не хорошо, а даже очень плохо!». Но хватит про SQL, давайте посмотрим, что еще можно сделать, чтобы дистанционно завести автомобиль. Вы просто отправляете команду «EngineStart» и в ответ получаете целочисленный идентификатор, представляющий собой идентификатор данной команды, в данном случае это ID = 3. Зная идентификатор, можно «вытянуть» службу, которая сообщит статус данной команды.

iqzeojxgkdmeab2i16iocitqcn8.jpeg

Таким образом, увеличивая или уменьшая значение ID, я «вытягиваю» статус любой команды, которая когда-либо была отправлена в этой системе.

1h90dwmu_bnbjovq7feigjom-fq.jpeg

Однако в этом нет ничего особо интересного, и я задумываюсь, а нет ли здесь прямого указания на объект, которое я могу использовать, чтобы завести свою машину. Поэтому я запустил команду «EngineStart» от имени законного пользователя с моего аккаунта, а затем попробовал вызвать ее через учетную запись другого пользователя, которая не должна иметь доступа к системе. В ответ я получил сообщение об ошибке: «Данный аккаунт находится вне контекста иерархии». Так что, возможно, данный способ взлома не сработает. Однако если вы посмотрите на этот API, то увидите, что он дублирует информацию — адрес электронной почты пользователя сопоставим с ID его учетной записи.

yopc1jibsrjkskqhw0ku3mt3yiy.jpeg

Если вы разрабатываете API или взламываете API, подобное дублирование информации, которое мы видим в этом URL, может стать источником ошибок. В этом случае баги API могут проявить себя это четырьмя различными способами.

ojlkvzq6aeketumr2srnilj_wvk.jpeg

Если рассмотреть случаи 2 и 3, обведенные красной рамкой, можно увидеть прямые ссылки на объект. В обоих случаях система не проверяет, уполномочены ли вы выполнять данную команду. Я попробовал случай 2, и он не сработал, а как насчет случая 3? Здесь мы просто должны заменить идентификатор учетной записи USER_EMAIL в URL- адресе, так как он напрямую связан с идентификатором аккаунта ACCOUNT_ID. Ранее мы использовали идентификатор учетной записи жертвы, а теперь используем учетную запись злоумышленника. Поэтому я использовал идентификатор учетной записи хакера и идентификатор устройства жертвы, отправил команду и ожидаемо получил статус команды »200 ОК» и получил контроль над приложением MyCar.
Таким образом, с помощью трех различных векторов атаки мы смогли сделать все то, что может сделать законный пользователь приложения. Это значит, что можно найти в городе любую машину, задать в приложении ее марку и модель, а затем дистанционно разблокировать автомобиль и завести его. Мы можем выключить или включить сигнализацию, внести изменения в сервисное меню автомобиля и проверить статус любой команды. И все это можно сделать тремя разными способами.

0w_6jr3rr2ssjcvsmfa0vovkcg0.jpeg

Очевидно, что разработчики MyCar попытались каким-то образом пофиксить баги системы. Так, в случае с жестко закодированными паролями они просто поставили обратный прокси-сервер перед приложением, чтобы скрыть учетные данные, которые используются для авторизации. Проблема в том, что обратные прокси не являются магией и не способны исправить все проблемы. Они сохранили SQL-инъекцию в сторонней службе, так что даже без пароля я все равно могу использовать ее через процедуру проверки пользователя.

kt4h5jnwxiojaqrw9me2netal6g.jpeg

Я решил повнимательней рассмотреть структуру URL. Возможно, вы заметили, что все используемые системой адреса содержат m2m. Решив, что это какой — то тип внутреннего взаимодействия для механизма авторизации в приложении MyCar, я ввел эти буквы в Google и обнаружил сайт M2M Suite. Единственное что вам остается сделать, увидев эту форму — это вставить туда пару одиночных кавычек и посмотреть, что произойдет. А произойдет то, что вы получите нужную SQL-инъекцию (аплодисменты аудитории).

aj5gr8vfoiarsuvtbb8ps8kamxm.jpeg

gffzb3dmad58g_56ixsvfugradc.jpeg

И это происходит через несколько месяцев после того, как разработчики сообщили о возникновении проблемы с SQL-инъекцией. Если в приложении имеются подобные проблемы, их необходимо исправить как можно скорее, но, как видите, разработчики ничего не сделали. Такое наплевательское отношение к пользователям я считаю оскорбительным.

Модуль MyCar имеет блок GPS, так что может отслеживать местоположение вашего автомобиля и отображать его в приложении. Но, как выяснилось, они хранят не только текущее местоположение автомобилей. Они хранят чертовски много информации, намного больше, чем нужно для того, чтобы отслеживать текущее местоположение машины. В моем случае за 13 дней использования приложения они накопили чуть меньше двух тысяч точек геолокации мест, в которых побывал мой автомобиль. В политике конфиденциальности компании-разработчика MyCar о таком сборе информации не говориться ни слова.

Однако дальше становится еще хуже. Вы можете возразить, что это всего лишь побочный эффект реализации службы геолокации. Но дело в том, что вместо простого создания списка мест, в которых бывает ваш автомобиль, они используют еще один API, анализирующий эти данные и определяющий места, в которых ваша машина бывает чаще всего. Опять же, насколько мне известно, в политике конфиденциальности нет никакого намека на подобную функцию. Возможно, это не так уж удивительно, потому что после кучи поисков я нашел материнскую компанию MyCar под названием Procon Analytics, зашел на их сайт и посетил раздел FAQ. Здесь я наткнулся на вопрос: «Как вы обеспечиваете безопасность данных?». Ответ компании был следующим: «В отличие от общедоступных облачных сред, которые сражаются за приоритет в области хранения данных, Procon Analytics использует собственное виртуальное облако, которое используется исключительно для пользователей нашего приложения и защищено от вмешательства других пользователей. Это особая облачная среда с высокой степенью защиты, которая обеспечивает легкую доступность и быстроту доставки услуг. Сотрудничая с Procon Analytics, вы можете быть уверены, что ваши данные надежно защищены». Даже не знаю, что на это сказать…

johmfuvjcs88wn_m_mopyhv5glq.jpeg

Если зайти на их страницу на Facebook, можно узнать еще больше интересного. Здесь они прямо так и пишут: «Защита сведений о вашем транспортном средстве жизненно важна!». Что же, мне остается только согласиться с подобным высказыванием.

Итак, вернемся к вопросу, с которого я начал: «Как такое происходит и как этого можно избежать»? И что более важно, каким образом мы, как сообщество, можем предотвратить подобное?

На этом мой доклад окончен, но я еще смогу ответить на пару вопросов (аплодисменты аудитории).

Вы спрашиваете, все ли они исправили? На данный момент я думаю, что они пофиксили все баги, о которых я им сообщил, за исключением недостатков политики конфиденциальности, о которых я упомянул в конце выступления. В последний раз, когда я ее проверял, все было без изменений. На вопрос, могу ли я редактировать подобным образом параметры электронного блока управления двигателем автомобиля ECU, отвечу, что моей задачей было редактирование параметров автомобиля только в приложении MyCar. В нем сохраняется цифровое представление автомобиля, которое редактируется с помощью прямого обращения к объекту, SQL-инъекции или другого вектора атаки.

Последний вопрос звучит так: есть ли у меня в автомобиле бесключевая система запуска двигателя кнопкой «Start» и как в этом случае обстоит дело с блокировкой рулевого колеса? Отвечу, что MyCar имеет такую кнопку, поэтому у этой системы отсутствует блокировка руля. Я подозреваю, что если вы установите эту систему, то определенно не сможете полагаться на замок, блокирующий рулевое колесо.


Немного рекламы :)


Спасибо, что остаётесь с нами. Вам нравятся наши статьи? Хотите видеть больше интересных материалов? Поддержите нас, оформив заказ или порекомендовав знакомым, облачные VPS для разработчиков от $4.99, уникальный аналог entry-level серверов, который был придуман нами для Вас: Вся правда о VPS (KVM) E5–2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps от $19 или как правильно делить сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40GB DDR4).

Dell R730xd в 2 раза дешевле в дата-центре Equinix Tier IV в Амстердаме? Только у нас 2 х Intel TetraDeca-Core Xeon 2x E5–2697v3 2.6GHz 14C 64GB DDR4 4×960GB SSD 1Gbps 100 ТВ от $199 в Нидерландах! Dell R420 — 2x E5–2430 2.2Ghz 6C 128GB DDR3 2×960GB SSD 1Gbps 100TB — от $99! Читайте о том Как построить инфраструктуру корп. класса c применением серверов Dell R730xd Е5–2650 v4 стоимостью 9000 евро за копейки?

© Habrahabr.ru