Один из способов авторизации в 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=123456"
Это авторизация методом Implicit flow.
Если пользователь залогинен, ему будет сразу предложено установить приложение, если нет — вначале залогиниться, а уже потом устанавливать. Если приложение уже установлено, то идёт сразу переход на страницу, в хэше которой будет токен. Дальше идёт работа с API.
Самое интересное начинается после выхода из ВК. Ваше приложение может иметь ссылку на выход вида vk.com/login.php?op=logout. Это стандартная ссылка на выход из VK. Но после выхода пользователя из VK куки остаются рабочими.
Таким образом, если опять показать страницу авторизации, ввести совершенно другой логин и пароль — вы всё равно сможете пользоваться страницей первого пользователя.
Т.е. работа ведётся следующим образом — пользователь П1 авторизуется ВКонтакте через приложение. В приведённом примере я использую standalone-приложение, но, возможно, получится и с другими видами приложений. Дальше пользователь П1 нажимает на ссылку выхода из ВК, приведённую выше. После этого ни через браузер, ни через приложение зайти в ВК без авторизации не получится. Дальше пользователь П2 авторизуется через приложение. Затем, уже через браузер пользователь попадает на страницу пользователя П1, вместо своей страницы П2. И может делать с этой страницей абсолютно всё, что угодно, приложение на данном этапе уже не нужно и не играет никакой роли.
Самое смешное то, что вы можете использовать в вашем приложении самые безобидные права. То есть не нужно пугать пользователя тем, что вы просите доступ к фоткам, аудио, видео, сообщениям и всему остальному. Можно оставить только базовые — и всё. Куки при этом всё равно будет полностью рабочими, используя их вы попадёте прямиком на страницу пользователя.
Можно ли считать данную особенность уязвимостью — думайте сами. По-моему, это как минимум не то, чего ожидает пользователь, нажимая на кнопку «Выход» и надеясь на то, что теперь уж его страница в безопасности.
При написании данной заметки ни один пользователь ВК не пострадал.
UPD. При авторизации использовался браузер IE7.
В поддержку я писал задолго до того, как опубликовал статью на здесь. Собственно, публикация статьи здесь и произошла в результате того, что поддержка данный сигнал проигнорировала в духе «это не баг, а фича, но, возможно, что-то изменится в будущем».
Комментарии (75)
dmx102
25.07.2016 09:02+3Здесь нет бага. Вы путаете два не связанных механизма.
OAuth для авторизации сторонних приложений и авторизацию/разлогин самого сайта.
Фактически сайт ВК это такое же приложение и вы разлогинитесь в нем, вместо своего.
Чтобы сделать разлогин для токена вам нужно использовать методы API с указанием токена, если такие там предусмотрены.prohodil_mimo
25.07.2016 09:25Но почему тогда при попытке повторного логина через API же я получаю окошко логина? Если у них мухи отдельно от котлет, тогда и куки, по идее, должны быть как-то тоже разделены и не иметь областей взаимодействия. Но область взаимодействия здесь как раз есть — логин осуществляется через браузер и для браузерного просмотра, и для работы с API.
Не претендую на экспертное техническое мнение, но мне кажется, что если я разлогинился, то я не должен иметь доступ к информации аккаунта, тем более чужого. А в приведённом в статье примере я разлогиниваюсь, при запросах к API получаю предложение авторизоваться, но когда авторизуюсь, получаю полный доступ к аккаунту пользователя, который был авторизован до меня. Причём как из своего приложения, так и просто через браузер.dmx102
25.07.2016 09:41-1В приведенном коде авторизации вы используете Implicit flow. Иными словами это локальная авторизация приложения. Access_token который вы получили, хранится у вас в браузере и сервер или кто угодно еще не имеют к нему доступа. При попытке повторной авторизации вы инициируете создание ЕЩЕ одного токена.
Так как у вас в статье нет ни какой подробной информации о последующем доступе к странице пользователя, уверен, что дальше базовых прав, которые вы дали токену при его создании, вы не получите. Это основной принцип OAuth.dmx102
25.07.2016 09:47-1Более того, неправильно обвинять кого-то в уязвимости управления страницей после разлогина, не предоставив подробного описания с приведенными доказательствами и тем более писать не им, а публично. А то, что OAuth создавался в том числе и для управлять – это да.
prohodil_mimo
25.07.2016 09:51+5В том-то и весь сыр-бор — я получаю полный доступ, причём через браузер.
Авторизуюсь под пользователем П1 через API.
Разлогин под пользователем П1.
Дальше любые попытки отправить запрос в API или зайти через браузер оканчиваются требованием авторизоваться.
Авторизуемся под пользователем П2 через API.
Заходим в браузер (через который авторизовывались) и получаем полный доступ к аккаунту пользователя П1 (не П2, под которым заходили)! Даже не смотря на то, что авторизовались якобы для использования API и даже могли самые скромные права затребовать для своего приложения.GlebkaF
25.07.2016 12:28+1Токен пользователя П1 в куках разве не перезаписывается токеном пользователя П2? Подменой кук на валидные «ломается» любой oAuth, тут ничего не поделать
avost
25.07.2016 12:39Разве старый токен не должен инвалидироваться на сервере после логаута?
GlebkaF
25.07.2016 12:54-2Конечно должен, проблема в том, что автор статьи делает логаут просто на сайте вк :
vk.com/login.php?op=logout
А для логаута из vk oAuth нужно использовать другой адрес, что-нибудь вроде такого:
https://oauth.vk.com/logout
В целом, все выглядит логично, пользователь может продолжать использовать какой то ресурс, на котором авторизовался с помощью oAuth, даже если непосредственно сам контакт, использует другой человек. Собственно в документации vk написано следующее:
Доверенные приложения могут получить неограниченный по времени access token для доступа к API, передав логин и пароль пользователя.
Выдаваемый access token не привязан к IP-адресу пользователя, поэтому его достаточно для последующей работы с API без повторения процедуры авторизации.avost
25.07.2016 13:41+2Ок, давайте по-другому — при логине второго пользователя, куки и сессии прежнего разве не должны очищаться?
GlebkaF
25.07.2016 13:42-1То есть вы логинитесь на одном сайте (vk.com), а куки и сессии чистятся на другом сайте (ваше приложение которое использует vk api)?
avost
25.07.2016 14:59+2Вторым пользователем мы логинимся на vk.com и получаем _там_ (на вк, а не в приложении) сессию первого пользователя. При логине на вк надо очищать все возможные куки и токены от предыдущих логинов. Я так понимаю, предыдущий токен не чистится, вк получает И куку новой сессии И старый токен. И считает токен приоритетнее. Тут вообще не должно быть важно разлогинивался пользователь в приложении или нет и каким способом тоже. Не?
Dionis_mgn
25.07.2016 15:18-1Каким образом вк получает старый токен? Токен к кукисам браузера не привязан. Токен — он для приложения. Куки — для браузера. Приложение получает токен с помощью переадресации браузера. На этом пути куки и токена расходятся навсегда (так задумано, по крайней мере).
Автор рассказал слишком мало, чтобы можно было хоть о чём-то говорить.
upd.: Нет, при разлогировании пользователя в браузере, в приложении его токен не должен быть «деактивирован». У токена есть своё время жизни, не зависящее от куков и сессии пользователя в браузере.avost
25.07.2016 15:55+1Понятия не имею как у них так получается. Возможно, api.vk запихал токен в куку с доступом *.vk. возможно приложение как-то умудрилось запихать его в куку с именем, которое случайно совпало с вк-шным и кука пролезла на соседний сайт :). Возможно даже пользователь зашёл на вк с прописанным в урле параметром с этим токеном. Это не так сильно важно. Но логично же, что при логине нового пользователя должны очищаться _все_ возможные прежние аутентификационные и авторизационные метки. Я даже не говорю, что их логично очищать и при разлогине (тем более, что это делается как раз на сайте vk), но при новом логине просто обязательно.
Да, автору хорошо было бы дать побольше информации — просто интересно в каком месте информация просачивается с одного сайта на другой.boblenin
26.07.2016 05:40Очищать где? В браузере, на сервере, в приложении?
avost
26.07.2016 06:14В браузере.
На сервере тоже можно инвалидировать предыдущую сессию — она уже не понадобится.
Приложение вк не контролирует, там всё, как есть, оно ни чему не помешает — свой токен, живёт отдельной жизнью.
Dionis_mgn
26.07.2016 09:56Еще раз повторю: при «разлогивании» человека в браузере, ни один токен деактивироваться не должен. Так задуман OAuth. И именно это — логично. Потому как я хочу разлогиниться на ВК, а не на хабре, например.
Давайте посмотрим на реализацию от GitHub: Логинимся на GitHub. Идём на dubblet.com и логинимся через GitHub OAuth. Разлогиниваемся в GitHub. Возвращаемся в dubblet, создаём новый документ, сохраняем его. И удивляемся тому, что в GitHub появился новый gist. Хотя мы были разлогинены в GitHub!avost
26.07.2016 11:07+1И что, вы когда в гитхабе логинитесь новым юзером получаете при этом доступ к данным старого? Вот то-то и оно!
Dionis_mgn
26.07.2016 11:35-1А вы считаете, что автор получает доступ к данным старого аккаунта именно по вине vk? Вы вообще смогли понять, какую проблему обнаружил автор? Он ОЧЕНЬ куцо описал проблему. Никаких выводов сделать нельзя. Я месяц назад реализовывал авторизацию средствами vk OAuth и ничего подобного не наблюдал.
Ниже люди жалуются на «подобные» проблемы. Но при этом OAuth в их рассказах не упоминается. Возникает вопрос: при чем тут OAuth? Даже если проблема есть, очевидно, он тут ни при чем. Проблемы, с которыми столкнулся автор, могут быть вызваны самим автором. Если бы он описал подробно, кто какие запросы в каком порядке шлёт — можно было бы о чем-то говорить.avost
26.07.2016 12:11+1>А вы считаете, что автор получает доступ к данным старого аккаунта именно по вине vk?
В общем, да, я считаю, что после логнина второго пользователя доступ к данным первого должен быть прекращён. А OAuth или не OAuth рояли не играет.
>Проблемы, с которыми столкнулся автор, могут быть вызваны самим автором.
Нет, так быть не должно. То, что автор не использовал этот сценарий в плохих целях не значит, что этого не сделает кто-нибудь другой.Dionis_mgn
26.07.2016 12:16-1Почему на остальное не отвечаете? Вы смогли понять, с какой проблемой столкнулся автор? Если да — поведайте, пожалуйста. Если нет — я по-прежнему не понимаю, о чём тут можно говорить.
Сейчас я склонен считать, что автор и вовсе не выходил из аккаунта.avost
26.07.2016 12:39+1Да не важно ведь выходил он или не выходил. Что там происходит с его приложением не важно. Важно, что он залогинился в вк вторым пользователем, а получил данные первого. Вот _этого_ не должно происходить. Но происходит просто судя по ответу техподдержки (не бага, а фича). То есть они признали, что так и происходит.
prohodil_mimo
26.07.2016 16:36Всю процедуру я описал. Что конкретно Вас интересует?
Что касается виновника — OAuth или не OAuth — я этого знать не могу. Я просто описал, каким образом обнаружил баг. Когда я пытался проделать весь этот фокус без участия API, через браузер (Opera) — у меня не получилось. Но я не исключаю возможности того, что есть какой-то способ провернуть это всё без участия API и OAuth. Но и утверждать могу только то, что видел своими глазами.
Что касается подробного описания процесса и отправляемых запросов — не было никаких запросов, кроме запроса на авторизацию, самого первого. Его я и привёл в статье. Отправляю запрос на авторизацию, разлогиниваюсь через указанную ссылку, отправляю запрос на авторизацию, вхожу в аккаунт другого пользователя и пользуюсь страницей первого. Всё. Это все запросы и весь порядок — в статье он описан.GlebkaF
26.07.2016 17:20-1Что именно вы подразумеваете под «пользуюсь страницей первого»? Вы пользуетесь ей в своем приложении или на вк.ком? Если в приложении, то какими именно возможностями вы располагаете?
Имхо, проблема действительно описана очень размыто.
Вообще, мне кажется я понял в чем дело, авторизация через oAuth происходит условно в два этапа:
1. Юзер авторизовывается на vk.com
2. Юзер авторизовывается в вашем приложении через oAuth. Здесь вам, как разработчику, дают access token для дальнейшей работы с данными пользователя.
Когды вы пытаетесь разлогинить пользователя, вы даете ему выйти из аккаунта на vk.com (Но не в вашем приложении!). Таким образом, access token продолжает храниться на вашей стороне, и, по всей видимости, когда новый юзер авторизовывается, второго этапа авторизации в вашем приложении не происходит, т.к. у вашего приложения уже есть действительный access token предыдущего юзера. Т.е. проблема безопастности исключительно на вашей стороне, вы не позаботились о том, что бы после завершения сессии пользователя почистить все его данные авторизации.
Поправьте меня если я не прав и не могли бы вы показать ваш запрос в ТП и их ответ?
prohodil_mimo
26.07.2016 17:57Пользуюсь именно через браузер.на вк.ком.
Описанная Вами гипотеза была бы, возможно, верна, если бы пользоваться чужим аккаунтом можно было только через приложение. Но, как я уже несколько раз писал выше — дальнейшее использование аккаунта происходит именно в браузере, под полными правами, вне зависимости от затребованных приложением прав, даже при выключенном или даже удалённом приложении.
Про размытость описания я уже несколько раз читал в комментариях, но так и не понял, что ещё нужно описать. Весь процесс, как я его видел, я описал в статье и немножко дополнил в комментариях (в том числе в том, на который Вы только что ответили).
Как я уже несколько раз писал в статье и в комментариях я даю выйти пользователю именно в моём приложении!
Как я уже несколько раз писал, после этого любая попытка воспользоваться вк.ком через браузер или апи через приложение, вызывает страницу с требованием авторизоваться. Захотите ли Вы войти в вк.ком просто так или через моё приложение — вы получите страницу авторизации. Т.е. разлогин произошёл и в моём приложении, и на сайте! После этого, если авторизоваться через приложение под вторым пользователем, можно пользоваться страницей первого пользователя.
Если честно — я восхищаюсь Вашим упорством. Даже после того, как официальные представители ВК признали наличие бага и пообещали его закрыть — Вы всё равно в довольно категоричной форме строите предположения о том, что это моё кривое приложение (оно действительно ещё довольно кривое) выдаёт глюки, а не ВК.
Переписку с ТП я выкладывать не буду. Во-первых, ВК дал официальный комментарий, поэтому доказывать наличие запросов от меня в ТП и их содержание бессмысленно. Во-вторых, там довольно большой объём текста. Ну и в-третьих, всё-таки это переписка, не знаю, насколько корректно это будет по отношению к сотрудникам.
Суть же моего запроса и суть ответа на него я привёл в статье — я описал довольно подробно свои действия, ответил на парочку уточняющих вопросов и получил ответ о том, что таково поведение системы и таким оно должно быть, но, может быть, когда-нибудь, что-нибудь изменится, целуем, подпись.Dionis_mgn
26.07.2016 18:09-1«Даже после того, как официальные представители ВК признали наличие бага» — можете ссылочкой поделиться?
Какой именно метод авторизации использовался?
Dionis_mgn
26.07.2016 17:54-1Вы не описали ровным счётом ничего, что позволило бы понять суть проблемы.
Я понял только, что Ваше приложение получило токен для пользователя. А дальше: Что за приложение (веб-сайт/десктоп/что-то еще)? Какой именно метод авторизации используется? КТО отправил запрос на завершение сессии в вк? Браузер? Ваше приложение? В любом случае, ссылка неправыильная, так чего Вы ожидали? Вы убедились, что разлогирование действительно произошло?
Как связаны права, которые запрашивает приложение к доступу к вк через браузер? Браузер о токене для Вашего приложения ничего не знает.
Расскажите подробно (желательно, в посте), что именно и в какой последовательности какие запросы слало на сервера ВК и какие ответы получало. Вот тогда можно будет говорить о чём-то. А так — каждый понял ситуацию как ему ближе и в итоге развели непонятно что.prohodil_mimo
26.07.2016 18:32Метод авторизации описан в статье и, в принципе, понятен из ссылки на авторизацию (параметр response_type).
Связь браузера и токена описана в статье.
Убедился ли я в разлогировании — описано в статье.
Тип приложения я добавил в статью.
Все запросы, которые я отсылаю (точнее, один запрос), описаны в статье и дополнительно описаны специально для Вас (потому что ответ был на ваш комментарий) в комментарии, на который вы только что ответили.
Статью немножко поправил, добавил пояснения, хотя вся процедура настолько проста, что даже не знаю, что ещё тут пояснять.
Завершение сессии отправляется из приложения — как мы уже убедились, такой ссылки больше нигде на сайте ВК нет, поэтому она может существовать только в приложении.
В любом случае, ссылка неправыильная, так чего Вы ожидали?
Сразу вспомнился анекдот — утерянный пистолет Макарова серии 1234321 считать недействительным. Т.е. взлом по неправильной ссылке считать недействительным?
kowack
28.07.2016 12:46-1prohodil_mimo
28.07.2016 13:54вау! срыв покровов!
Моя статья вообще не вышла бы в свет, если бы поддержка не послала меня.
Она и задумывалась как способ привлечь внимание поддержки.
Не думал, что у кого-то так сильно подгорит от неё. Не думал, что на хабре есть люди, которым какие-то циферки в рейтингах, особенно чужих, делают так больно. Даже неудобно себя чувствую.
prohodil_mimo
28.07.2016 13:58И да, мне кажется, что спамить комменты своими ссылками — это неэтично. Особенно, если это даже не прошедший модерацию материал.
Dionis_mgn
28.07.2016 14:15-1Человек ответил на мой комментарий (за что ему большое спасибо). Потому что его пост отвечает на все мои вопросы. Вместо того, чтобы истекать желчью, лучше бы взяли с него пример: именно так посты писать и надо. Хорошо во всём разобраться. Отбросить истерики и бессмысленные громкие заявления. Излагать чётко и целостно. Так что его ссылка на не прошедший модерацию материал — очень даже к месту.
И да, человеку наплевать на цифорки и рейтинги (у нас с ним их попросту нет). Человек хочет помочь остальным разобраться в ситуации (и очень помог в этом мне лично, например). Вы — не хотите. Он — молодец. Вы — редиска.
Удачи!prohodil_mimo
28.07.2016 14:43Человек (как, кстати, и Вы) пришёл и начал со всей категоричностью заявлять, что я — дурак, а он — молодец. При том, что я просто описал то, что вижу. Не претендуя ни на что. Просто — увидел, написал в поддержку, был послан, написал сюда. Неужели так сложно прочитать и понять — это просто описание увиденного? НЕ экспертное мнение, НЕ гипотеза, НЕ претензия, НЕ интерпретация — просто увиденное своими глазами поведение системы. Проверенное несколько раз.
Самое главное, что разработчики мне написали и поблагодарили за то, что подсказал этот небольшой косячок. Техподдержка мне написала и извинилась за то, что проигнорировала моё обращение. Никто из них не написал, что я — дурак и всё придумал.
Но на хабре есть люди, которые точно и определённо знают, как всё было на самом деле. Они точно знают, что я — дурак и выдумщик, и они уже приготовили весь жирный шрифт, чтобы вывести меня на чистую воду. Вы из какого цирка, господа? Меня не надо выводить никуда — я написал то, что видел, и отошёл в тень. Никаких лавров у меня нет. Никаких денег мне на заплатили. Никаких предложений от гугла стать СЕО мне не поступило. И я вот вообще не понимаю — где и чему тут завидовать? Зачем приходить и изливать свою желчь фразами «да я уже давно всё это знаю, только никому не рассказал», «да вы тут всё на заблуждениях придумали, а я точно знаю, как всё было», «Щас я тут напишу свою разоблачающую статью, начну её с поливания грязью, а дальше отведу душу и соберу все рейтинги!»
Я бы на вашем месте, господа, с присущей мне корректностью, построил бы диалог по-другому. Я бы написал, что наблюдал совершенно другое наблюдение. Когда автор мне напомнил бы, что он видел что-то другое, я бы заметил, что, возможно, поведение системы уже изменилось или же произошло что-то, чего я не знаю (так бывает). Ну нет у меня такого свойства — забегать в комменты и сразу начинать всех обзывать дураками. Ну не могу я обвинять во лжи человека, которого не знаю, и которого на лжи точно и определённо не поймал. Но мы с вами, видимо, из разного теста. Ваше тесто, видимо, подразумевает непреложную веру в своё абсолютное знание.
И то, что этот ваш «бескорыстный» человек хочет помочь разобраться — да честь ему и хвала! Одна из целей моей публикации была — спросить компетентного мнения и самому разобраться в том, что происходит. Только зачем начинать разбирательства с обвинений (скрытых и явных). Если я написал, что видел такое поведение — значит я его видел. А отвечать мне в духе «камни с неба падать не могут, потому что их там нет» — отличный способ во всём разобраться.
Пока что из ваших «бескорыстных» комментариев я понял только, что я дурак и враль, и совершенно не понял, что произошло с системой. Но так как ваши мнения о моей личности мне не совсем интересны, то я заключаю, что пока что ничего полезного вы в эту историю не внесли.
П.С. вот уж не думал, что на хабре можно попасть в ситуацию, когда придётся отгавкиваться от чьих-то личных мнений, как будто я куда-то в комменты какой-нибудь смехогруппы вконтакте попал.Dionis_mgn
28.07.2016 15:01-1Дураком Вас никто не называл. Никто не говорил Вам, что Вы всё придумали. Вас никто ни в чем не обвинял. Вы написали пост. Его оказалось недостаточно для понимания ситуации. Попытки прояснить ситуацию Вы восприняли в штыки. Теперь вон вообще строчите огромные комментарии (чуть ли не больше самого поста), просто чтобы доказать незнакомому человеку, что он — редиска.
Человек пришёл и доходчиво объяснил, что именно Вы наблюдали. Вы вот сами в ситуации не разобрались, решили просто рассказать сообществу, что что-то видели. Человек разобрался и высказал свои выводы (как Вы говорите, честь ему и хвала за это, верно?). Сообществу. Потому что для того оно и задумывалось. И всё. Чем Вас это задевает?
Я предлагаю закрыть эту бессмысленную демагогию.prohodil_mimo
28.07.2016 15:20На все вопросы об уточнениях я ответил. На те, конечно, где было написано, чего конкретно не хватает.
А в штыки я начал воспринимать только неприятные лично мне категорические заявления.
«4. Баг (не фича) в том, что какие бы вы данные не ввели в форму, вас просто перебросит на ранее авторизованную станицу, даже если вы ввели валидные авторизационные данные для другого аккаунта.» Это заявление, на котором комментатор и построил все свои дальнейшие рассуждения и обвинения. На самом деле они не соответствовали действительности в моём случае. Потому что это означало бы, что перейди я на любую другую страницу без ввода авторизации, я бы мог без проблем туда попость. Между тем никакой переход ни на какую страницу не мог быть осуществлён без ввода авторизационных данных. В описываемом мною случае. Но Остапа уже понесло — не разобравшись в описываемых событиях он уже начал обвинять в том, что кто-то другой в чём-то не разобрался.
А сейчас он уже даже придумал, что я пост переписал более, чем полностью. Да, реально ответ профессионала, собирающегося беспристрастно разобраться в поведении системы.
Закрытие бессмысленной демагогии я поддерживаю.
prohodil_mimo
28.07.2016 14:10Кстати, я на хабре пару дней, ещё не освоился — тут есть какой-то способ передавать рейтинг и карму другим пользователям? Я вижу что вам ооочень надо, я бы с вами, как с особо нуждающимся в циферках на экране, тешащих ущемлённое самолюбие, поделился бы — лишь бы не видеть этого самоунижения и «изкожилезенья» ради «славы» (даже смешно это слово в данном контексте применять).
kowack
28.07.2016 15:16-1Сейчас пост вами отредактированный более чем полностью, содержит другие формулировки и дополнительную информацию, из-за чего часть комментариев выглядит теперь странно.
Мой пост прошёл модерацию, но остался в песочнице.prohodil_mimo
28.07.2016 15:23Что мною отредактировано:
Добавлено
«Т.е. работа ведётся следующим образом — пользователь П1 авторизуется ВКонтакте через приложение. В приведённом примере я использую standalone-приложение, но, возможно, получится и с другими видами приложений. Дальше пользователь П1 нажимает на ссылку выхода из ВК, приведённую выше. После этого ни через браузер, ни через приложение зайти в ВК без авторизации не получится. Дальше пользователь П2 авторизуется через приложение. Затем, уже через браузер пользователь попадает на страницу пользователя П1, вместо своей страницы П2. И может делать с этой страницей абсолютно всё, что угодно, приложение на данном этапе уже не нужно и не играет никакой роли.»
Это добавлено из моего комментария по просьбе читающих внести ясность.
И
"Это авторизация методом Implicit flow."
Добавлено по той же причине.
Это и есть отредактированный более чем полностью пост?
«Не смог докопаться, так хоть уйду, хлопнув дверью»Dionis_mgn
28.07.2016 15:38-1Да. Это и есть. Это единственный параграф, который хоть что-то проясняет.
kowack
28.07.2016 15:54-1Это не единственные правки, но хорошо, попробуйте прочитать статью без этого абзаца) Складывается впечатление что виной всему OAuth и при помощи приложения можно получить доступ к посторонней странице, что является очень серьёзной уязвимостью. Это то, что я понял прочитав утром ваш пост. Но позже смог убедился что дела обстоят совсем иначе.
prohodil_mimo
28.07.2016 16:10Это единственные правки, не считая последний абзац, который я добавил почти сразу после публикации, когда у статьи было, по-моему, едва пара тысяч просмотров, после первых комментариев о том, что мне нужно было обращаться вначале в поддержку.
Но вам, конечно, виднее, какие у меня в посте правки.
Но самое главное, что абсолютно все эти правки уже были на момент вашего комментария на тему «скандалы, интриги, расследования». Т.е. с данными правками ваши комментарии были уже неактуальны? Зачем же вы их публиковали? Если же они актуальны и этими правками, т.е. и сейчас, тогда почему же вы пишете, что после (вами придуманного) «полного переписывания» моего поста, многие комментарии потеряли актуальность?
П.С. два пользователя, зарегистрированные с разницей в месяц одновременно поочерёдно пишут мне почти одинаковые по содержанию и некоторым семантическим особенностям «обличающие» комментарии. Совпадение — не думаю) Несложно перелогиниваться?
AVX
25.07.2016 10:07+9Таким образом, если опять показать страницу авторизации, ввести совершенно другой логин и пароль — вы всё равно сможете пользоваться страницей первого пользователя.
Вот и сошлось. Я думал, это только у меня такие странности ИНОГДА происходят. У меня и у жены есть аккаунты в ВК. Она обычно не выходит, а просто браузер закрывает (firefox). А мне приходится при открытии ВК нажимать «выход» и потом логиниться под собой. Так вот, уже много раз было так, что после ввода своего логина и пароля я попадаю в её аккаунт. Со всеми правами. При этом к своему аккаунту уже не имею доступа. Не помогает ни обновление страницы, ни чистка кэша/куков. Повторно выхожу-захожу — опять то же самое. Помогает чаще всего выход, чистка куков и смена внешнего IP (выключить-включить роутер). Иногда просто нужно подождать какое-то время.
Но это далеко не всегда происходит. В последние месяцев 4-5 не замечал такого, но ранее — как минимум раз в месяц попадалось.GoldGoblin
25.07.2016 12:43+6Сообщал им об этом чуть более года назад. Ответили что этого не может быть и у меня едет крыша.
AVX
25.07.2016 13:00Потому и не пишу им, обзовут дураком и засудят ещё (скажут что это я поломал).
Да, это тянется уже не один год.
Plesser
25.07.2016 12:47только сегодня с этим столкнулся впервые.
дал девушке планшет поиграться, она не вышла.
нажал выход — ввел свои данные и попал на ее страницу.
снова вышел — снова зашел — результат тот же.
подумал что заглючил планшет (но не планшет а сам хром) — хотя куки сносил несколько раз.
через несколько часов снова повторил эксперимент, результат тот же. потыкал по ссылкам и в какой то момент меня благополучно катапультировало на мою страничку.
boblenin
26.07.2016 05:38Могу потеоритезировать. Возможно у них access_token живет не в сессии, а например в localdb.
alifar
25.07.2016 12:52интересная фича. работает только с того ПК, где происходила первая авторизация?
Tsivarev
25.07.2016 16:46Самое интересное начинается после выхода из ВК. Ваше приложение может иметь ссылку на выход вида vk.com/login.php?op=logout. Это стандартная ссылка на выход из VK. Но после выхода пользователя из VK куки остаются рабочими.
А где Вы нашли эту «стандартную» ссылку для выхода?prohodil_mimo
25.07.2016 16:59Из кнопки «Выход» на сайте ВК.
Tsivarev
25.07.2016 17:09Но в кнопке «Выход» везде ссылка такого вида «https://login.vk.com/?act=logout...». Или где-то есть другие ссылки?
prohodil_mimo
25.07.2016 17:20Да… странно. Может уже поменяли. Ссылку точно брал из кнопки Выйти, только не помню точно с какой страницы — из обычного пользовательского интерфейса или со страницы установки приложения. Там и сейчас отличаются между собой ссылки, но той, которая у меня описана, нет теперь ни там, ни там.
perfect_genius
25.07.2016 19:16После выхода остаются пиктограммы тех, с кем чатился, можно просмотреть имена и фамилии. Интересно, это тоже фича а не баг?
kowack
27.07.2016 17:22-1Объясняю как всё на самом деле:
1. Автор поста из стороннего приложения переходит по ссылке https://vk.com/login.php?op=logout
2. На сайте ВК такая ссылка сопровождается хешем https://vk.com/login.php?op=logout&hash=abcdefgh
3. Фича (не баг) в том, что при невалидном (пустом) хеше выход из аккаунта не происходит, а автор видит страницу которую и запрашивал (/login.php)
4. Баг (не фича) в том, что какие бы вы данные не ввели в форму, вас просто перебросит на ранее авторизованную станицу, даже если вы ввели валидные авторизационные данные для другого аккаунта.
p.s.: репортил пару лет назад, сказали не баг, а для удобства глупеньких)prohodil_mimo
27.07.2016 20:12И опять человек, который знает «как было на самом деле». Как было «на самом деле» я описал в статье.
kowack
27.07.2016 20:47-1При всём уважении, статья строится на заблуждении.
И да, я повторил описанные вами действия.
Самое интересное начинается после выхода из ВК. Ваше приложение может иметь ссылку на выход вида vk.com/login.php?op=logout. Это стандартная ссылка на выход из VK.
Это не так. Переход по ссылке https://vk.com/login.php?op=logout не завершает сессию пользователя.
Ссылка не действительна без параметра «hash».
Дальше пользователь П2 авторизуется через приложение.
Это не так. Запросите с полученным токеном данные текущего пользователя. Это П1.
После этого ни через браузер, ни через приложение зайти в ВК без авторизации не получится.
Это не так. Любая страница требующая авторизацию работает с данными П1, к примеру, https://new.vk.com/improhodil_mimo
27.07.2016 20:58При всём уважении, Ваше заявление строится на невнимательности. В статье описано, что после перехода на данную ссылку, происходит логаут. Никакое действие после данного перехода не может быть выполнено без авторизации. Об этом в статье написано. Т.е. логаут всё же происходит. Повторюсь в который раз — ни одно действие после перехода по указанной ссылке не могло быть произведено без авторизации — ни запросы из приложения, ни переходы по ссылкам ВК в браузере. Что ещё считать логаутом, как не перманентное требование авторизации?
И ещё не забывайте о том факте, что почти сразу же ВК отреагировали (мне в личку и здесь, и в ВК писали разработчики), поэтому абсолютно не исключено и даже наверняка, сейчас всё описанное в статье уже не работает, а работает очень даже скорее всего так, как Вы описали. НО — на момент публикации всё было так, как описано в статье. И было так на протяжении длительного времени — после моего обращения в поддержку по этому вопросу, после подтверждения поддержкой данной «функциональности» и дальнейшего отказа от реагирования, до публикации прошло, кажется, дней пять.kowack
27.07.2016 21:16-1Как я писал ранее, этот баг с многолетней выдержкой.
Сами перейдите по ссылке https://vk.com/login.php?op=logout.
Вы увидите форму авторизации.
Если теперь перейти по ссылке https://vk.com или https://vk.com/habr вы всё ещё видите форму авторизации.
Но если же перейти по ссылке https://vk.com/im, которая требует обязательную авторизацию, то вы вдруг окажитесь залогинены.
Так было годами ранее, так есть и сейчас.prohodil_mimo
27.07.2016 21:34Про многолетнюю выдержку — я даже не сомневаюсь. Собственно, если бы он не был с многолетней выдержкой — о нём бы сейчас и не говорили. На право первородства совершенно не претендую. Увидел баг, сообщил куда следует, был послан, опубликовал. Вас задевает конкретно факт того, что я написал о том, о чём Вы уже давно знаете?
kowack
27.07.2016 22:33-1Ни в коем случае. После прочтения вашего поста не до конца ясна суть проблемы, комментарии тому подтверждение. Я попытался разъяснить что к чему, не более.
К тому же вы используете ряд ошибочных допущений, ещё и выделяете главное заблуждение жирным. И пользователь П2 тут не нужен, причина в неправильной ссылке выхода и последующем дурацком поведении ВК при невалидном (в вашем случае пустом) параметре hash.prohodil_mimo
28.07.2016 10:21Общение с человеком, который и без тебя знает, как всё на самом деле, априори бессмысленно.
Как в ещё одном анекдоте — «сейчас ты будешь верить своим бесстыжим глазам, а не любимой жене».
Поведение, с которым я столкнулся, описано в статье, некоторые дополнения даны в комментариях. Честно говоря, не знаю, что ещё добавить. Признаться, что я — дурак с галлюцинациями, а Вы — великий учёный, вычисливший Нептун на кончике карандаша — извините, пока не убедили. Своим бесстыжим глазам я пока ещё верю.kowack
28.07.2016 12:25-1Я ни коим образом не хотел задеть ваше ЧСВ. Каюсь если так вышло.
Вы указываете OAuth и П2 как часть бага, которые тут ни при чём.
Проблема исключительно в ссылке выхода без обязательного параметра.
Это я и пытаюсь вам объяснить)prohodil_mimo
28.07.2016 12:41По-моему, это ваше ЧСВ задето. Кто-то написал о баге, о котором я знаю много-много лет, надо срочно написать, что он не прав и рассказать народам мира «как всё было на самом деле». В сотый раз повторяю — поведение системы, которое я наблюдал, я описал в статье. Там же я указал, что не берусь судить о том, является это багом или уязвимостью или и правда «фича».
Но тут появился герой нашего времени в духе «падумаешь, да я уже сто лет об этом знаю, просто держал в секрете и вообще всё было не так», который точно знает, как было на самом деле, и для которого самое важное — доказать, что кто-то в интернете неправ.
Гипотезы, обсуждение, спор — это нормально, но когда приходит человек и говорит — вы все дураки, а я точно знаю, как было на самом деле, щас я вам тут все ваши заблуждения жирным шрифтом-то повыделяю — ну это, как мне кажется, немножко неправильная постановка вопроса. Особенно после того, как сами разработчики сказали, что подлатают, и теперь уже ничего, наверное, не докажешь — ну да, быть самым умным задним числом — это, наверное, кого-то согревает холодными зимними вечерами.
В общем, описание того, что я видел своими глазами — в статье. Вашу версию «точного знания как всё было» вы тоже описали. Можно я пойду?
ifaustrue
А разве у ВК нет программы оплаты за найденные уязвимости?
Ваша заметка как раз похожа на такое.
kovalevsky
Они ещё и перманентно банят тех, кто не пишет им, а эксплуатирует и публично распостраняет
prohodil_mimo
Никаких специальных окошек для обращения за оплатой за баги я не нашёл. В поддержке же (куда я обратился задолго до этой публикации) мне сказали, что это не баг, а фича. Поэтому «умываю руки».
Dionis_mgn
Плохо искали: hackerone.com/vkcom. Полгода назад получил $200 за весьма несерьёзную уязвимость. Правили долго, правда.
prohodil_mimo
Как наивный пользователь, я полагал, что окно с описанием уязвимостей находится на самом сайте ВК.
Arslanbekov
Ну вроде как это логично, а вообще они выплачивают по bug bounty
atrolov
Больше года висит бага, им ваще на эту программу…