Специалист по безопасности из Дели Бхавук Джайн обнаружил 0day в системе авторизации «Вход с Apple». Уязвимость действительно значительная. Как продемонстрировал хакер, для авторизации в чужой учётной записи достаточно только идентификатора электронной почты жертвы, причём эксплоит очень простой.

Баг может привести к полному захвату чужих аккаунтов на сторонних платформах, которые установили кнопку «Войти с Apple» (Spotify, Dropbox и др.), независимо от того, использует человек электронную почту Apple или нет.

Технические детали


Функция «Войти с Apple» работает аналогично OAuth 2.0. Существует два возможных способа аутентификации пользователя: либо с помощью JWT (JSON Web Token), либо с помощью кода, сгенерированного сервером Apple. Затем этот код используется для создания JWT. На приведённой ниже диаграмме показано, как работает создание и проверка JWT.



На втором этапе при авторизации Apple предоставляет пользователю возможность либо поделиться идентификатором электронной почты Apple со сторонним приложением, либо нет. Если пользователь решил скрыть идентификатор электронной почты, Apple генерирует собственный промежуточный Email ID для пользователя. В зависимости от выбора пользователя, после успешной авторизации Apple создаёт JWT с этим Email ID, который затем используется сторонним приложением для входа в стороннее приложение.

Декодированная полезная нагрузка 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, связав с ним любой идентификатор электронной почты и получив доступ к учётной записи жертвы.

Пример запроса (второй шаг):

POST /XXXX/XXXX HTTP/1.1
Host: appleid.apple.com

{"email":"contact@bhavukjain.com"}

Здесь при передаче любого адреса электронной почты Apple генерирует действительный JWT (id_token) для этого конкретного Email ID.

Пример ответа:

{
  "authorization" : {
    "id_token" : "eyJraWQiOiJlWGF1bm1MIiwiYWxnIjoiUlMyNTYifQ.XXXXX.XXXXX",
    "grant_code" : "XXX.0.nzr.XXXX",
    "scope" : [ "name", "email" ]
  },
  "authorizedData" : {
    "userId" : "XXX.XXXXX.XXXX"
  },
  "consentRequired" : false
}

Влияние этой уязвимости было весьма критическим, поскольку она позволяла полностью захватить учётную запись. Многие разработчики интегрировали вход в систему с Apple, который является обязательным для приложений, поддерживающих другие аналогичные кнопки. Apple активно продвигает эту систему и буквально навязывает её сайтам. В последнее время такие кнопки поставили у себя Dropbox, Spotify, Airbnb, Giphy (теперь приобретённый Facebook) и многие другие приложения. Судя по всему, все они были уязвимы для полного захвата учётной записи, если при авторизации не было реализовано никаких других мер безопасности по проверке пользователя.

Вознаграждение


Когда Apple анонсировала эту функцию на Всемирной конференции разработчиков в июне 2019 года, то назвала её «более приватным способом простого и быстрого входа в приложения и веб-сайты» (цитата). Идея была и остается хорошей: заменить социальные логины, которые используются социальными сетями для сбора персональных данных, безопасной системой аутентификации, подкреплённой обещанием Apple не профилировать пользователей или их активность в приложениях.

Одним из плюсов, который привлек большое внимание в то время, была возможность для пользователя подписаться на сторонние приложения и сервисы, не раскрывая свой электронный адрес Apple ID. Неудивительно, что он позиционировался как более конфиденциальный вариант, чем использование аккаунта Facebook или Google.

Критическая уязвимость в системе была обнаружена в апреле 2020 года, а компания Apple выплатила Бхавуку вознаграждение $100 000 по своей программе bug bounty.

После исправления бага на сервере Бхавук Джайн опубликовал информацию об уязвимости 30 мая.

Сообщество ИБ считает эту уязвимость удивительной по нескольким причинам. В том числе и потому, что сама Apple не уловила такой критический баг в процессе разработки и тестирования: «Я ожидал бы лучшего тестирования от такой компании, как Apple, особенно когда она пытается создать себе репутацию ориентированной на конфиденциальность», — сказал Шон Райт, ведущий специалист по безопасности приложений SME в ImmersiveLabs.

Apple провела внутреннее расследование и не обнаружила скомпрометированных аккаунтов пользователей в связи с этим багом.