Введение
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 |
Чтобы лучше разобраться в данных, я экспортировал историю местонахождения 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-летний сотрудник из Техаса может запрашивать платёжную информацию о машине в Калифорнии и что это не приведёт ни к каким аварийным уведомлениям. Это часть его повседневной работы. Все сотрудники имеют доступ к куче личной информации, а вся система построена на доверии.
Похоже, очень сложно обезопасить такие системы, если в них по умолчанию встроен такой широкий доступ.
Благодарности
Выражаю огромную благодарность людям, помогавшим в написании и вычитке этого поста:
- Gren (https://bsky.app/profile/nop.codes).
- Иэну Кэрроллу (https://x.com/iangcarroll).
- Джастину Райнхарту (https://twitter.com/sshell).
- Джозефу Тэкеру (https://x.com/rez0).
- Бретту Бурхаусу (https://x.com/bbuerhaus).
- Мэйку Роберту (https://x.com/xehle).
- Джоэлю Марголису (https://x.com/0xteknogeek).
Telegram-канал со скидками, розыгрышами призов и новостями IT ?
Комментарии (3)
koreychenko
03.02.2025 13:18Т.е. там было настолько дыряво, что можно было отправить запрос на смену пароля зная только email сотрудника? Во всех нормальных системах тебе на указанную почту приходит ссылка на восстановления с токеном.
jhoag
Дубль: https://habr.com/ru/companies/kaspersky/articles/876968/
ru_vds Автор
Добрый день! Это не дубль, а перевод оригинальной статьи, на которую ссылаются в новости по вашей ссылке. Наш перевод интересен в первую очередь подробностями.