[Из песочницы] После логаута пользователя VK можно получить управление его страницей

Решил попробовать себя в работе с API Вконтакте и наткнулся на интересную особенность.

Один из способов авторизации в API — это OAuth. Вкратце всё происходит так: создаёте приложение ВК, получаете его ID, а затем отправляете браузер пользователя на адрес:

				https://oauth.vk.com/authorize"
					+ "?client_id=123"    // ID вашего приложения
					+ "&display=page"
					+ "&redirect_uri=https://oauth.vk.com/blank.html"    // URL, на который попадёт пользователь после успешной авторизации. ВК требует указания этого сайта в настройках приложения и только для приложения типа Сайт. Для остальных работает только указанный УРЛ, в целях безопасности
					+ "&scope= права доступа"
					+ "&response_type=token"
					+ "&v=5.52"
					+ "&state=1CtoVK"

Если пользователь залогинен, ему будет сразу предложено установить приложение, если нет — вначале залогиниться, а уже потом устанавливать. Если приложение уже установлено, то идёт сразу переход на страницу, в хэше которой будет токен. Дальше идёт работа с API.

Самое интересное начинается после выхода из ВК. Ваше приложение может иметь ссылку на выход вида vk.com/login.php? op=logout. Это стандартная ссылка на выход из VK. Но после выхода пользователя из VK куки остаются рабочими.

Таким образом, если опять показать страницу авторизации, ввести совершенно другой логин и пароль — вы всё равно сможете пользоваться страницей первого пользователя.

Самое смешное то, что вы можете использовать в вашем приложении самые безобидные права. То есть не нужно пугать пользователя тем, что вы просите доступ к фоткам, аудио, видео, сообщениям и всему остальному. Можно оставить только базовые — и всё. Куки при этом всё равно будет полностью рабочими, используя их вы попадёте прямиком на страницу пользователя.

Можно ли считать данную особенность уязвимостью — думайте сами. По-моему, это как минимум не то, чего ожидает пользователь, нажимая на кнопку «Выход» и надеясь на то, что теперь уж его страница в безопасности.

При написании данной заметки ни один пользователь ВК не пострадал.

UPD. При авторизации использовался браузер IE7.
В поддержку я писал задолго до того, как опубликовал статью на здесь. Собственно, публикация статьи здесь и произошла в результате того, что поддержка данный сигнал проигнорировала в духе «это не баг, а фича, но, возможно, что-то изменится в будущем».

Комментарии (11)

  • 25 июля 2016 в 08:40

    +1

    А разве у ВК нет программы оплаты за найденные уязвимости?
    Ваша заметка как раз похожа на такое.
    • 25 июля 2016 в 08:54

      0

      Они ещё и перманентно банят тех, кто не пишет им, а эксплуатирует и публично распостраняет
      • 25 июля 2016 в 09:15

        +2

        Никаких специальных окошек для обращения за оплатой за баги я не нашёл. В поддержке же (куда я обратился задолго до этой публикации) мне сказали, что это не баг, а фича. Поэтому «умываю руки».
        • 25 июля 2016 в 10:17

          0

          Плохо искали: hackerone.com/vkcom. Полгода назад получил $200 за весьма несерьёзную уязвимость. Правили долго, правда.
          • 25 июля 2016 в 10:18

            +1

            Как наивный пользователь, я полагал, что окно с описанием уязвимостей находится на самом сайте ВК.
  • 25 июля 2016 в 09:02

    0

    Здесь нет бага. Вы путаете два не связанных механизма.
    OAuth для авторизации сторонних приложений и авторизацию/разлогин самого сайта.

    Фактически сайт ВК это такое же приложение и вы разлогинитесь в нем, вместо своего.

    Чтобы сделать разлогин для токена вам нужно использовать методы API с указанием токена, если такие там предусмотрены.

    • 25 июля 2016 в 09:25

      0

      Но почему тогда при попытке повторного логина через API же я получаю окошко логина? Если у них мухи отдельно от котлет, тогда и куки, по идее, должны быть как-то тоже разделены и не иметь областей взаимодействия. Но область взаимодействия здесь как раз есть — логин осуществляется через браузер и для браузерного просмотра, и для работы с API.

      Не претендую на экспертное техническое мнение, но мне кажется, что если я разлогинился, то я не должен иметь доступ к информации аккаунта, тем более чужого. А в приведённом в статье примере я разлогиниваюсь, при запросах к API получаю предложение авторизоваться, но когда авторизуюсь, получаю полный доступ к аккаунту пользователя, который был авторизован до меня. Причём как из своего приложения, так и просто через браузер.

      • 25 июля 2016 в 09:41

        0

        В приведенном коде авторизации вы используете Implicit flow. Иными словами это локальная авторизация приложения. Access_token который вы получили, хранится у вас в браузере и сервер или кто угодно еще не имеют к нему доступа. При попытке повторной авторизации вы инициируете создание ЕЩЕ одного токена.

        Так как у вас в статье нет ни какой подробной информации о последующем доступе к странице пользователя, уверен, что дальше базовых прав, которые вы дали токену при его создании, вы не получите. Это основной принцип OAuth.

        • 25 июля 2016 в 09:47

          0

          Более того, неправильно обвинять кого-то в уязвимости управления страницей после разлогина, не предоставив подробного описания с приведенными доказательствами и тем более писать не им, а публично. А то, что OAuth создавался в том числе и для управлять — это да.
        • 25 июля 2016 в 09:51

          0

          В том-то и весь сыр-бор — я получаю полный доступ, причём через браузер.

          Авторизуюсь под пользователем П1 через API.
          Разлогин под пользователем П1.
          Дальше любые попытки отправить запрос в API или зайти через браузер оканчиваются требованием авторизоваться.
          Авторизуемся под пользователем П2 через API.
          Заходим в браузер (через который авторизовывались) и получаем полный доступ к аккаунту пользователя П1 (не П2, под которым заходили)! Даже не смотря на то, что авторизовались якобы для использования API и даже могли самые скромные права затребовать для своего приложения.

  • 25 июля 2016 в 10:07

    0

    Таким образом, если опять показать страницу авторизации, ввести совершенно другой логин и пароль — вы всё равно сможете пользоваться страницей первого пользователя.

    Вот и сошлось. Я думал, это только у меня такие странности ИНОГДА происходят. У меня и у жены есть аккаунты в ВК. Она обычно не выходит, а просто браузер закрывает (firefox). А мне приходится при открытии ВК нажимать «выход» и потом логиниться под собой. Так вот, уже много раз было так, что после ввода своего логина и пароля я попадаю в её аккаунт. Со всеми правами. При этом к своему аккаунту уже не имею доступа. Не помогает ни обновление страницы, ни чистка кэша/куков. Повторно выхожу-захожу — опять то же самое. Помогает чаще всего выход, чистка куков и смена внешнего IP (выключить-включить роутер). Иногда просто нужно подождать какое-то время.
    Но это далеко не всегда происходит. В последние месяцев 4–5 не замечал такого, но ранее — как минимум раз в месяц попадалось.

© Habrahabr.ru