0day в авторизации с Apple
Moody
Что, если я скажу, что ваш почтовый идентификатор - это все, что мне нужно для получения доступа над вашей учетной записью на любом любимым вами веб-сайте или приложении. Звучит страшно, правда? Это то, что я мог сделать из - за бага в авторизации через Apple.
В апреле месяце я обнаружил 0day в авторизации через Apple - это коснулось сторонних приложений, которые его использовали без собственных дополнительных мер безопасности. Эта ошибка могла привести к полному захвату учетных записей пользователей в сторонних приложениях, независимо от того, был ли у жертвы действительный Apple ID или нет.
За эту уязвимость Apple заплатила 100 000 долларов в рамках программы Apple Security Bounty.
Технические детали
Вход через Apple работает аналогично OAuth 2.0. Существует два возможных способа аутентификации пользователя: с помощью JWT (JSON Web Token) или кода, сгенерированного сервером Apple. Который затем используется для генерации JWT. На диаграмме ниже показано, как работает создание и проверка JWT.

На 2-м шаге, при авторизации, Apple предлагает пользователю выбор: поделиться Apple Email ID со сторонним приложением или нет. Если пользователь решил скрыть идентификатор электронной почты, Apple создает свой собственный relay-идентификатор электронной почты. В зависимости от выбора пользователя, после успешной авторизации Apple создает JWT, который содержит этот идентификатор электронной почты, использующийся в дальнейшем сторонним приложением для входа в систему пользователя.
Полезная нагрузка декодированного JWT выглядит так:
{
"iss": "https://appleid.apple.com",
"aud": "com.XXXX.weblogin",
"exp": 158XXXXXXX,
"iat": 158XXXXXXX,
"sub": "XXXX.XXXXX.XXXX",
"c_hash": "FJXwx9EHQqXXXXXXXX",
"email": "contact@bhavukjain.com", // or "XXXXX@privaterelay.appleid.com"
"email_verified": "true",
"auth_time": 158XXXXXXX,
"nonce_supported": true
}
** ОШИБКА **
Я обнаружил, что могу запросить JWT для любого идентификатора электронной почты у Apple. С использованием открытого ключа Apple, я проверил подпись этих токенов, и они оказались действительными. Это означает, что злоумышленник может подделать JWT, связав с ним любой идентификатор электронной почты и получить доступ к учетной записи жертвы.
Пример запроса (2-й шаг)
POST /XXXX/XXXX HTTP/1.1
Host: appleid.apple.com
{"email":"contact@bhavukjain.com"}
Здесь, при передаче любого электронного письма, Apple генерирует действительный JWT (id_token) для этого конкретного идентификатора электронной почты.
Образец ответа
{
"authorization" : {
"id_token" : "eyJraWQiOiJlWGF1bm1MIiwiYWxnIjoiUlMyNTYifQ.XXXXX.XXXXX",
"grant_code" : "XXX.0.nzr.XXXX",
"scope" : [ "name", "email" ]
},
"authorizedData" : {
"userId" : "XXX.XXXXX.XXXX"
},
"consentRequired" : false
}
Эта уязвимость критична, поскольку может привести к полному поглощению любой учетной записи. Многие разработчики интегрировали вход в систему через Apple, поскольку это обязательно для приложений, поддерживающих другие социальные учетные записи. Вот несколько приложений, которые поддерживают такую авторизацию - Dropbox, Spotify, Airbnb, Giphy. Я не тестировал наличие уязвимости на этих приложениях, но они могли быть уязвимы, если бы при проверке пользователя не было никаких других мер безопасности.
Apple также провела исследование их журналов и определила, что эта уязвимость еще никем не была использована.
Огромное спасибо Apple Security Team.
Прочитать оригинал этого материала на английском можно здесь.
Cybred - канал об информационной безопасности и конкурентной разведке, вдохновленный идеями олдскульных андеграундных интернет-сообществ о свободе распространения информации в сети и всеобщей взаимопомощи.