данные или код для входа предоставленные по протоколу oauth недействительны
Двухфакторная аутентификация в Фортнайт
Автор: Admin · Опубликовано 11/12/2018 · Обновлено 15/12/2018
С каждым днём открывается всё больше магазинов аккаунтов, а это значит, что всё больше людей лишаются своих учетных записей из-за невнимательности. Мы убедительно рекомендуем Вам настроить двухфакторную аутентификацию Epic Games, чтобы защитить свой аккаунт от различных видов взлома. Кстати, двойная аутентификация нужна и для многих функций клиента Epic Games, например для отправки подарков в фортнайт.
Двухфакторная аутентификация фортнайт — это система защиты, при которой у пользователя запрашивают короткий код для подтверждения личности пользователя. На данный момент существует 2 метода двухфакторной аутентификации: отправка сообщения на электронную почту или на специальное приложение. Метод Вы выбираете сами.
Система запрашивает код в следующих ситуациях:
Чтобы включить двойную аутентификацию нужно:
Далее подробно рассмотрим оба варианта.
Мобильный аутентификатор фортнайт
1. Для начала Вам следует установить на мобильный одну из следующих программ. Их можно найти в AppStore или Play Market Google.
2. Нажимаете на кнопку «Включить аутентификатор»
3. Перед вами появляется окно с QR кодом. Откройте приложение которое Вы выбрали в пункте 1, нажмите в нём на кнопку добавить и подведите камеру к QR коду.
4. В приложение появится новая строчка с постоянно меняющимися цифрами. Введите эти цифры в поле «Код безопасности»
Внимание! Если Вам говорят, что код не верный, проверьте включена ли на телефоне автоматическая синхронизация времени по сети.
5. Если Вы всё сделали верно и увидели данное окно — скорее заходите в игру, там Вас ждёт новая эмоция!
Почтовый аутентификатор фортнайт
1. Выберите пункт «Включить аутентификацию по почте»
2. На почту вашего аккаунта сразу будет отправлен код, который необходимо ввести в это окно.
3. Если вы всё сделали верно, то увидите это окно, а в фортнайте найдёте новую эмоцию!
Итог: Теперь при попытке входа на Ваш аккаунт с другого устройства клиент игры будет запрашивать код из приложения или код который выслан на почту. Украсть такой аккаунт очень сложно, так что вы надёжно защищены.
Важно. Никому не сообщайте код, который Вам присылают.
Описание ошибок протокола OAuth 2.0
В данном разделе приводится описание ошибок, возникающих при выполнении запросов в рамках протокола OAuth 2.0 и OpenId Connect 1.0.
В случае возникновения ошибок сервер возвращает информацию в двух полях:
Далее будет представлена информация по кодам ошибок.
Ошибки конечной точки /authorize
invalid_request
В запросе не передан обязательный параметр, либо значения переданного параметра некорректно, либо параметр пристутствует в запросе несколько раз, либо весь запрос имеет неправильный формат.
Возможные причины
unauthorized_client
Клиент с указанным в запросе идентификатором не зарегистрирован, отключён, либо клиенту запрещено получения маркера доступа в рамках данного сценария.
Возможные причины
unsupported_response_tpe
Тип ответа не поддерживается.
Указанный в запросе response_type не поддерживается.
Возможные причины
invalid_scope
Неправильная область использования.
Указанный в запросе scope не зарегистрирован на сервере.
Возможные причины
login_required
Запрос не может быть выполнен в интерактивном режиме (с указанием параметра prompt со значением none ).
Возможные причины
Ошибки конечной точки /token
invalid_request
В запросе не передан обязательный параметр, либо значения переданного параметра некорректно, либо параметр пристутствует в запросе несколько раз, либо весь запрос имеет неправильный формат.
Возможные причины
invalid_client
Не удалось осуществить аутентификацию клиента.
Возможные причины
invalid_grant
Разрешение, используемое клиентом, не является действительным.
Возможные причины
unauthorized_client
Клиент с указанным в запросе идентификатором не зарегистрирован, отключён, либо переданы неверные учётные данные клиента.
Возможные причины
usupported_grant_type
Неподдерживаемый тип разрешение.
Разрешение, используемое клиентом, не поддерживается сервером.
Возможные причины
Тонкости авторизации: обзор технологии OAuth 2.0
Информационная система Dodo IS состоит из 44 различных сервисов, таких как Трекер, Кассы ресторана или Базы знаний и многих других. Чтобы не отвлекаться на несколько аккаунтов, 3 года назад мы написали сервис Auth для реализации сквозной аутентификации, а сейчас пишем уже вторую версию, в основе которого лежит стандарт авторизации OAuth 2.0. Этот стандарт довольно сложный, но если у вас сложная архитектура с множеством сервисов, то OAuth 2.0 вам пригодится при разработке своего сервиса аутентификации. В этой статье я постарался рассказать о стандарте максимально просто и понятно, чтобы вы сэкономили время на его изучение.
Задача Auth
Проблема авторизации в десятках сервисов встречалась ещё несколько лет назад — в начале «эпохи распила монолита». Эту проблему решили новым сервисом, который назвали – Auth. Он помог реализовать бесшовную аутентификацию в различных сервисах и перенести данные о пользователях в отдельные базы данных.
У сервиса Auth есть три основные задачи:
Проблемы
Первая версия Auth — часть монолита. Он использует свой собственный протокол общения с сервисами. Такая «схема» была необходима в тот момент, но за несколько лет работы проявились проблемы.
Auth — часть монолита. Следовательно, сервис привязан к релизному циклу, что лишает возможности независимой разработки и деплоя. Кроме того, придется разворачивать весь монолит, если захотелось развернуть Auth, например, при масштабировании сервиса.
Dodo IS зависит от Auth. В старой реализации внешние сервисы обращаются к Auth при каждом действии пользователя, чтобы валидировать данные о нём. Настолько сильная привязка может привести к остановке работы всей Dodo IS, если Auth «приляжет» по какой-то причине.
Auth зависит от Redis. Притом достаточно сильно — неисправность работы Redis’а приведёт к падению Auth’а. Мы используем Azure Redis, для которого заявленный SLA 99,9%. Это значит, что сервис может быть недоступен до 44 минут в месяц. Такие простои не позволительны.
Текущая реализация Auth использует свой протокол аутентификации, не опираясь на стандарты. В большинстве своих сервисов мы используем C# (если говорим о backend) и у нас нет проблем с поддержкой библиотеки для нашего протокола. Но если вдруг появятся сервисы на Python, Go или Rust, разработка и поддержка библиотек под эти языки потребует дополнительных затрат времени и принесет дополнительные сложности.
Текущий Auth использует схему Roles Based Access Control, которая базируется на ролях. Обычно с ролью выдаётся полный доступ к определённому сервису, вместо привязки к конкретному функционалу. Например, в пиццериях есть заместители управляющего, которые могут вести определенные проекты: составлять графики или учитывать сырьё. Но у нас нет выдачи прав на конкретные компоненты системы. Приходится выдавать полный доступ к сервису, чтобы сотрудники могли получить доступ к составлению графиков или настройкам какого-либо компонента учёта.
Проблемы подтолкнули к тому, чтобы спроектировать и написать новую версию Auth. На старте проекта мы потратили 3 недели только на изучение стандартов авторизации и аутентификации OAuth 2.0 и OpenID Connect 1.0.
Примечание. Утрированно, статья — это пересказ RFC, который приходилось перечитывать несколько раз, чтобы понять, что происходит вокруг. Здесь я постарался уйти от этой сложности и рассказать всё максимально просто, структурировано, кратко и без описания сложных вещей, например, какие символы может содержать в себе ответ сервиса. В отличии от RFC, прочитав это один раз, можно во всём разобраться. Надеюсь, статья будет полезна и сэкономит время при выборе решения для реализации сервиса аутентификации, а может, кого-то заставит задуматься о его необходимости.
Что такое ОAuth2.0?
Разработку нового Auth мы решили начать с изучения доступных протоколов и технологий. Самый распространённый стандарт авторизации — фреймворк авторизации OAuth2.0.
Стандарт был принят в 2012 году, и за 8 лет протокол меняли и дополняли. RFC стало настолько много, что авторы оригинального протокола решили написать OAuth 2.1, который объединит все текущие изменения по OAuth 2.0 в одном документе. Пока он на стадии черновика.
Актуальная версия OAuth описанна в RFC 6749. Именно его мы и разберем.
OAuth 2.0 — это фреймворк авторизации.
Он описывает, как должно реализовываться взаимодействие между сервисами для обеспечения безопасной авторизации. Многие нюансы описаны достаточно подробно, например, flow взаимодействия узлов между собой, но некоторые отдаются на откуп конкретной реализации.
В OAuth 2.0 определены четыре роли:
Важно: клиент должен быть заранее зарегистрирован в сервисе. Как это сделать?
Регистрация клиента
Способ регистрации клиента, например, ручной или service discovery, вы выбираете сами, в зависимости от фантазии конкретной реализации. Но при любом способе при регистрации, кроме ID клиента, должны быть обязательно указаны 2 параметра: redirection URI и client type.
Redirection URI — адрес, на который отправится владелец ресурса после успешной авторизации. Кроме авторизации, адрес используется для подтверждения, что сервис, который обратился за авторизацией, тот, за кого себя выдаёт.
Client type — тип клиента, от которого зависит способ взаимодействия с ним. Тип клиента определяется его возможностью безопасно хранить свои учётные данные для авторизации — токен. Поэтому существует всего 2 типа клиентов:
Токены
Токен в OAuth 2.0 — это строка, непрозрачная для клиента. Обычно строка выглядит как случайно сгенерированная — её формат не имеет значения для клиента. Токен — это ключ доступа к чему-либо, например, к защищённому ресурсу (access token) или к новому токену (refresh Token).
У каждого токена своё время жизни. Но у refresh token оно должно быть больше, т.к. он используется для получения access token. Например, если срок жизни access token около часа, то refresh token можно оставить жить на целую неделю.
Refresh token опционален и доступен только для confedential клиентов. Пользуясь опциональностью токена, в некоторых реализациях время жизни access token сделано очень большим, а refresh token вообще не используется, чтобы не заморачиваться с обновлением. Но это не безопасно. Если access token был скомпрометирован, его можно обнулить, а сервис получит новый Access token с помощью refresh token. В случае, если refresh token нет, то потребуется проходить процесс авторизации заново.
За access token закреплён определённый набор прав доступа, который выдаётся клиенту во время авторизации. Давайте разберёмся, как выглядят права доступа в OAuth 2.0.
Права доступа
Права доступа выдаются клиенту в виде scope. Scope – это параметр, который состоит из разделённых пробелами строк — scope-token.
На этапе регистрации клиента, в настройках сервиса авторизации клиенту выдаётся стандартный scope по умолчанию. Но клиент может запросить у сервера авторизации scope, отличный от стандартного. В зависимости от политик на сервере авторизации и выбора владельца ресурса, итоговый набор scope может выглядеть совсем иначе. В дальнейшем, после авторизации клиента, владелец ресурсов может отобрать часть прав без повторной авторизации сервиса, но, чтобы выдать дополнительные разрешения, потребуется повторная авторизация клиента.
Абстрактный OAuth 2.0. Flow c применением Access token
Мы рассмотрели роли, рассмотрели виды токенов, а также как выглядят scope. Посмотрим на flow предоставления доступа к сервису.
Ниже представлена абстрактная схема (или flow) взаимодействия между участниками. Все шаги на данной схеме выполняются строго сверху вниз. Разберём детальнее.
Абстрактный OAuth 2.0. Flow c применением Refresh token
Первый и второй шаги опущены из данной схемы — они ничем не отличаются от схемы абстрактного flow выше.
Что такое grant?
Grant — это данные, которые представляют из себя успешную авторизацию клиента владельцем ресурса, используемые клиентом для получения access token.
Например, когда мы где-либо аутентифицируемся с помощью Google, перед глазами всплывает уведомление. В нём говорится, что такой-то сервис хочет получить доступ к данным о вас или к вашим ресурсам (выводятся запрашиваемые scope-token). Это уведомление называется «Consent Screen».
В момент, когда нажимаем «ОК», в базу данных попадает тот самый grant: записываются данные о том, что такой-то пользователь дал такие-то доступы такому-то сервису. Клиент получает какой-то идентификатор успешной аутентификации, например строку, которая ассоциируется с данными в базе данных.
Существует 4 + 1 способа получения grant — grant type:
Client credentials grant flow
Имеет самый простой flow, напоминающий обычную авторизацию на любом сервисе. Она выполняется с помощью учётных данных клиента, которые представляют собой client id и client secret — аналог логина и пароля для пользователя. Так как для аутентификации требуется client secret, который должен соответствующе храниться, данный flow могут использовать только confedential клиенты.
Схема проста: клиент аутентифицируется на сервере авторизации передавая client id и client secret. В ответ получает access token, с которым уже может получить доступ к нужному сервису.
Этот flow требуется, когда клиент пытается получить доступ к своим ресурсам или ресурсам, заранее согласованным с сервером авторизации. Например, сервису А нужно время от времени ходить в сервис Б и актуализировать там данные о количестве пиццерий в сети.
Resource owner password credentials flow
По текущим рекомендациям безопасности описанных в данном RFC, данный flow не рекомендуется использовать вовсе из-за явных проблем с безопасностью.
Resource owner передаёт свой логин и пароль клиенту, например, через формы на клиенте. Клиент, в свою очередь, с помощью него получает access token (и, опционально, refresh token).
Здесь есть проблема. Resource owner просто берёт и отдаёт в открытом виде свой логин и пароль клиенту, что не безопасно. Изначально он был сделан только для клиентов, которым вы доверяете или тех, что являются частью операционной системы. Позже он был разрешён только для миграции с аутентификации по логину и паролю на OAuth 2.0. Текущие рекомендации по безопасности запрещают его использование.
Authorization code
Самый распространённый flow на данный момент. В основном используется для confidential клиентов, но с появлением дополнительной проверки с помощью PKCE, может применяться и для public-клиентов.
В данном flow взаимодействие client с resource owner проходит через user-agent (браузер). К user-agent есть одно требование: он должен уметь работать с HTTP-редиректами. Без этого resource owner не сможет попасть к серверу авторизации и вернуться обратно с grant.
Данный flow сложнее, чем предыдущие, поэтому будем разбирать по шагам. Для начала представим, что мы — resource owner и перешли на страницу сервиса онлайн-обучения, который хочет сохранять результаты обучения к нам в облако. Ему требуется получить доступ к нашему ресурсу, например, определённой директории в облаке. Мы нажимаем на «Авторизоваться» и начинается путешествие по Authorization code grant flow:
Следующий flow построен на основе этого.
Implicit grant
Это оптимизация Authorization code grant flow для public-клиентов, которые умеют работать с redirection URI. Например, для браузерных приложений на JavaScript, или мобильных приложений. Требование к user-agent, с помощью которого взаимодействуют клиент и resource owner, сохраняется: он должен уметь работать с HTTP-редиректами.
Между authorization code и implicit есть основное отличие: вместо получения authorization code и access token по нему, мы сразу получаем access token после успешной авторизации resource owner. Кроме того, здесь не используется client secret из соображений безопасности — приложение можно дизассемблировать и получить его. Подлинность проверяется только по redirection URI.
Многие шаги из данной схемы похожи на шаги из authorization code, но предлагаю их разобрать также подробно. Представим, что некое браузерное приложение хочет сохранять свои настройки в нашем Git-репозитории. Мы нажимаете «Войти в GitHub» и на этом этапе начинается работа Implicit flow:
Device authorization (RFC 8628)
С 2012 до 2019 появилось много умных устройств, на которых неудобно авторизоваться. Например, неудобно вводить сложный логин и пароль на телевизоре каждый раз при открытии ресурса. На некоторых устройствах это невозможно, например на серверных ОС без графического интерфейса. В августе 2019 этот flow появился как раз для таких сценариев.
Есть, как минимум, 3 требования к устройствам, чтобы работа с помощью Device authoraztion grant flow была возможна:
Возможно, схема кажется сложной из-за обилия стрелок. Разберём её также пошагово, как и разбирали сложные flow до него.
Представим, что мы пытаемся авторизоваться на web-сервисе с помощью телевизора. Мы видим кнопку «Авторизоваться как устройство» и нажимаем. В этот момент начинается наш Device flow:
Вместо вывода
В этой статье я опустил много подробностей, чтобы максимально просто и доступно рассказать о самом важном. Например, типы запросов, как и в каком виде передавать параметры, какие символы допустимы в качестве значений для того.
Если хотите погрузиться в тематику детальнее, то рекомендую в RFC 6749 (для OAuth 2.0) и RFC 8628 (для Device Flow). Кроме того, следить за актуальными версиями RFC можно на ресурсе, посвящённому OAuth.
Если статья была полезна и захотите подробностей — пишите в комментариях, и в следующих статьях расскажу о PKCE, о протоколе аутентификации OpenID Connect 1.0, о нашей реализации сервера аутентификации и многом другом.
Как это работает: вход на сайты через соцсети
Всё дело в единой авторизации.
Часто на сайтах вам могут предложить войти с помощью Google, Facebook или ВКонтакте. Если у вас есть аккаунт в одном из этих сервисов, вам не нужно будет регистрироваться с нуля: заполнять имя, почту и ставить свою фотографию — всё это будет сделано автоматически. Разберёмся, как это работает и насколько это безопасно.
Это история о технологии OAuth2.
В Яндекс можно войти через Гугл. Как тебе такое, юзернейм?
Для чего это нужно
Каждый сайт заинтересован в новых посетителях, потому что им можно потом продать платную подписку или показать рекламу. Поэтому сайтам выгодно, чтобы регистрация была как можно проще, в идеале — по нажатию одной кнопки (а то и вообще без регистрации). Если пользователи должны регистрироваться вручную и вводить все свои данные, есть шанс, что они отвалятся.
Параллельно с этим в интернете есть сервисы, которыми пользуются все: Яндекс, Гугл, фейсбук или Вконтакте. Почему бы не брать данные о пользователе с этих сервисов?
Для этого и придумали OAuth.
OAuth — это как договор между сайтами
Яндекс, Гугл или любой другой сервис, который разрешает пользоваться своим пропуском, должны принять единый протокол обмена данных. Если по-простому, то они должны договориться:
«Мы даём друг другу данные вот в таком формате, мы принимаем их в этом формате, мы друг другу доверяем».
Эти договорённости закрепили в едином стандарте авторизации — OAuth. В нём написано, как выдавать пропуска, как их проверять и что делать в разных случаях.
Как работает единая авторизация
Для пользователя всё выглядит просто: нажал «Войти через Яндекс», подтвердил Яндексу своё желание войти на нужный сайт, и всё — вы уже зарегистрировались на новом сайте и можете им пользоваться. Но что происходит под капотом?
Когда посетитель, например, сайта о программировании, нажимает «Войти через Яндекс», этот сайт отправляет в Яндекс запрос и говорит: «Тут кто-то хочет войти на мой сайт через ваш сервис, можете разобраться?»:
Когда Яндекс получает такой запрос, ему нужно понять, что за посетитель пришёл на сайт и есть ли у него аккаунт Яндекса. Для этого он показывает всплывающее окно, где посетитель может войти в свой Яндекс-аккаунт. Это нужно, чтобы сервис понимал, на чьё имя выдавать пропуск для сайта. Если пользователь уже залогинен в Яндексе, его сразу узнают.
Как только посетитель вводит свой логин и пароль, Яндекс узнаёт его и спрашивает, доверяет ли он этому сайту о программировании и может ли Яндекс поделиться с сайтом данными о его имени и почте:
Дальше Яндекс отдаёт ваши данные сайту, он вас узнаёт, и готово:
Насколько это безопасно
Каждый сайт, который использует OAuth, сам определяет, какие данные о пользователе они хотят увидеть. Например, одному сайту достаточно знать ваше имя и почту, а другому хочется скачать вашу фотографию и узнать дату рождения.
Когда вы будете входить через OAuth, сервис вам скажет: «Вот какие данные у меня запрашивают. Давать доступ?». Когда вы разрешите доступ, эти данные перейдут на сайт. Откажетесь — не перейдут.
✅ Сайты, которые используют OAuth, не смогут прочитать вашу почту или личные сообщения. Но есть и другие технологии — например приложения в социальных сетях, — и уже они могут делать гораздо больше.
✅ Через OAuth нельзя отправить сообщения от вашего имени или сделать пост в вашей ленте новостей. Но, опять же, если это не OAuth, а отдельное приложение для фейсбука или VK, то возможно и такое. Помните все эти игры, которые постят от имени игроков «Я собрал капусту на своей ферме»? Вот это они.
✅ Через OAuth точно не передаётся ваш пароль от Яндекса, Гугла и других сервисов. Сервисы хранят пароли в зашифрованном виде, поэтому даже при всём желании не смогли бы его передать.
Можно ли этому доверять?
Скорее нет, чем да. С OAuth есть проблема: вы никогда не знаете, действительно ли это OAuth или это хакеры сделали штуку, похожую на OAuth, которая хочет украсть ваш пароль. На всякий случай вот техника безопасности:
⚠️ Во всех важных сервисах включайте двухфакторную авторизацию: чтобы не только вводить пароль, но и получать СМС.
⚠️ Если сервис поддерживает приложение-аутентификатор — используйте его. Например, в Яндексе есть «Ключ», а в Гугле — Authenticator. Это специальные приложения, которые создают дополнительный слой защиты поверх вашего логина и пароля.
⚠️ Если вы только что пользовались сервисами Яндекса или Гугла и тут вас просят вновь ввести логин и пароль — закройте эту страницу. Яндекс и Гугл помнят вас и не попросят пароль лишний раз.
Уязвимости в OAuth. Глава из книги «Ловушка для багов. Полевое руководство по веб-хакингу»
Содержание статьи
Несмотря на множество разновидностей, мы сделаем акцент на случаях, когда уязвимость в OAuth позволяет похитить аутентификационные токены и получить доступ к информации о жертве на сервере ресурса.
На момент написания у OAuth есть две версии, 1.0a и 2.0, которые несовместимы друг с другом. По OAuth написаны целые книги, но эта глава фокусируется на OAuth 2.0 и базовом рабочем процессе OAuth.
О книге
Перед тобой — 17-я глава из книги «Ловушка для багов. Полевое руководство по веб‑хакингу», которую мы публикуем с разрешения издательства «Питер».
Эта книга поможет в совершенствовании скиллов работы с вебом и рассказывает о методологии этичного веб‑хакинга. Читается она отлично, словно детективный рассказ. Каждая описываемая уязвимость имеет параметры: сложность, атакованный URL, URL страницы, где хакер описал проведенную атаку, дата подачи отчета и сумма выплаченного хакеру вознаграждения. Среди прочего есть описание удачного взлома PornHub.com.
Если бы здесь было только описание совершенных атак, то книга бы не имела практического применения. Поэтому автор анализирует каждое действие взломщика, выполненное им для достижения результата. Читателю не составит труда повторить описанные операции.
Для самых зеленых хакеров в книге есть глава, в которой целиком описывается операция проведения взлома веб‑ресурса, разобран каждый этап, среди которых: разведка перед атакой, составление списка поддоменов, сканирование портов, обнаружение содержимого, определение стека технологий и прочее.
А на сладкое припасены два приложения. В первом приведено описание используемых хакером приложений, а во втором даются ссылки на дополнительные видео и текстовые материалы по взлому сайтов.
Принцип работы OAuth
В процессе аутентификации на основе OAuth участвуют три стороны:
В ответ на этот HTTP-запрос клиент перенаправляет вас к серверу ресурса, используя код 302. URL-адрес страницы перенаправления содержит следующие параметры, участвующие в процессе аутентификации:
URL-адрес, инициирующий процедуру OAuth с помощью Facebook, выглядит примерно так:
Получив ответ с кодом перенаправления 302, браузер отправляет серверу ресурса GET-запрос. Войдя на сервер ресурса, вы увидите диалоговое окно, с помощью которого можно одобрить области видимости, запрашиваемые клиентом. На рис. 17.2 показано, как веб‑сайт Quora (клиент) запрашивает доступ к информации у Facebook (сервера ресурса) от имени владельца ресурса.
Нажатие кнопки Continue as John (Продолжить как Джон) приводит к одобрению запроса сайта Quora на получение доступа к перечисленным областям видимости, включая профиль, список пользователей, дату рождения, родной город владельца ресурса и прочие сведения. Когда владелец нажмет кнопку, Facebook вернет HTTP-ответ с кодом 302, который перенаправит браузер обратно к странице с URL-адресом, указанным в параметре redirect_uri. Этот адрес также содержит токен и параметр state. Адрес перенаправления из Facebook в Quora может выглядеть так (изменено в целях демонстрации):
Сервер Facebook вернул токен access_token, с помощью которого клиент Quora мог сразу же получить доступ к информации о владельце ресурса. На этом участие владельца в процедуре OAuth завершено. Теперь клиент может напрямую обращаться к Facebook API за нужной ему пользовательской информацией.
Владелец сможет дальше использовать клиент, не зная о его взаимодействии с API-интерфейсом.
Рис. 17.2. Вход в Quora через Facebook с авторизацией областей видимости
То, насколько серьезной является уязвимость в OAuth, зависит от одобренных областей видимости, связанных с токеном. В этом вы сами убедитесь на следующих примерах.
Похищение OAuth-токенов на сайте Slack
Чтобы этим воспользоваться, злоумышленнику было достаточно создать подходящий поддомен на своем вредоносном сайте. Если жертва открывала зараженный URL-адрес, сервер Slack передавал OAuth-токен сайту злоумышленника. Хакер мог инициировать запрос от имени жертвы, встроив во вредоносную веб‑страницу тег img> вроде такого:
Это позволило бы автоматически сделать HTTP-запрос типа GET при отображении страницы.
Выводы
Прохождение аутентификации с паролем по умолчанию
Поиск уязвимостей в любой реализации OAuth подразумевает исследование всей процедуры аутентификации, от начала и до конца. Для этого в том числе необходимо распознать HTTP-запросы, которые не являются частью стандартного процесса; их наличие часто сигнализирует о том, что разработчик изменил механизм аутентификации и, возможно, сделал его уязвимым. Джек Кейбл столкнулся с подобной ситуацией в работе с программой Bug Bounty от Yahoo, в которую входил аналитический сайт Flurry.com.
Чтобы начать тестирование, Кейбл зарегистрировал учетную запись на сайте Flurry, используя свой адрес электронной почты @yahoo. com и реализацию OAuth от Yahoo. После того как Flurry и Yahoo согласовали OAuth-токен, заключительный POST-запрос к сайту Flurry выглядел так: