Двойная аутентификация Вконтакте — секс или имитация?

Всем привет! Недавно решил протестировать аппаратный OTP токен с возможностью перепрошивки по NFC, подключив его к своей учетке в vk.com. При этом наткнулся на недоработки в системе двухфакторной аутентификации Вконтакте, которые показались мне довольно существенными. Хочу поделиться своими наблюдениями с вами, так как в самом VK ошибок не признали. Возможно, я немного параноик? Интересно, что скажете вы, хабровчане.


53ecdfc1ee2e4d049a9e01067a400dd6.jpg

Оговорюсь, что перед тем, как приступить к работе над статьей, все свои наблюдения я изложил на HackerOne. Ни один из описанных багов Вконтакте не признали. Но когда перед публикацией статьи я решил сделать подтверждающие скриншоты, оказалось, что один из багов все-таки был исправлен. То, что к моим словам прислушались, не может не радовать. Жаль только, что ребята даже «спасибо» не сказали.


Итак, ошибка №1. Статичный секретный ключ.


9d1a656b5cdc449ea3743eb6e560f38b.png

Чтобы подключить к своему аккаунту приложение для генерации OTP, пользователь вводит пароль, после чего перед ним открывается страница с секретным ключом, необходимым для выпуска программного токена. Пока все правильно.


a6b4e7adbe3946758605c77831ff30a6.jpg

Но если по какой-либо причине пользователь не активировал программный токен сразу (например, отвлекся на важный звонок, или просто передумал и вернулся на главную страницу), то когда через некоторое время он все-таки решит получить токен, ему опять предложат тот же секретный ключ.


Усугубляет ситуацию еще и то, что в течение получаса после ввода пароля, даже если вы перешли на главную страницу или вышли из аккаунта, а потом снова вошли, перед показом QR кода с секретом повторно пароль не запрашивается.


e6bfb18dc1ed4f1bb5190340b7471a6a.jpg
51d10de43ed04020a8aa02befca227b1.jpg

Чем это опасно?


Токен Вконтакте, как и любой другой TOTP токен работает по достаточно простому принципу: генерирует одноразовые пароли по алгоритму на основании двух параметров — времени и секретного ключа. Как вы сами понимаете, единственное, что нужно для компрометации второго фактора аутентификации — это знать СЕКРЕТНЫЙ КЛЮЧ.


Подобная уязвимость оставляет злоумышленнику две лазейки:


  1. Если пользователь отойдет от компьютера, у злоумышленника будет достаточно времени, чтобы скомпрометировать его секретный ключ.
  2. Завладев паролем пользователя, злоумышленник легко может подсмотреть его секретный ключ наперед.

b934934478ff4a4bb8bf08bf1c12eeec.jpg

Решить вопрос элементарно просто. Секретный ключ должен менятся каждый раз после обновления страницы, как это происходит, например, в Facebook.


Ошибка №2. Новый токен после перевыпуска использует тот же секретный ключ.


177b035ff03641628cb9974229f45797.png

На момент публикации статьи этот недостаток был устранен.


Ситуация, описанная выше, усугубляется тем, что при повторном выпуске токена, Вконтакте не предложит вам новый секретный ключ. По сути, к вашей странице привязывается 1 секретный ключ и сменить его вы уже не сможете.


Чем это опасно?


Если вы узнали, что ваш секретный ключ скомпрометирован (например, при первом выпуске токена, как описано в первом пункте), двойная аутентификация Вконтакте больше вам не нужна. Смело отключайте второй фактор и подберите пароль посильней. Перевыпустить токен с новым секретом не представляется возможным.


Если Вы потеряли телефон, на котором был установлен токен, можете сделать то же самое. Тот, к кому в руки попал ваш смартфон, сможет спокойно использовать его для входа в ваш аккаунт. Осталось узнать только пароль. При этом вся суть двухфакторной аутентификации теряется. Понятно, что если пользователь заметит дискредитацию своего аккаунта, он может связаться с суппортом, но на это будет потрачено драгоценное время, которого у него может не быть.


Ошибка № 3. Отключение второго фактора без запроса одноразового пароля.


e8e5b0cec71440c19cf5008162256c37.png

Здесь все понятно из названия. При отключении второго фактора, достаточно ввода пароля, OTP не запрашивается.


4b6e292bb90c41d9beb760bf08f978b1.jpg
2868c0074d654a49955290e660e37fb6.jpg

Чем это опасно?


Если для отключения двойной аутентификации Вконтакте достаточно только ввода пароля, теряется сама суть двухфакторной аутентификации. А суть двухфакторной аутентификации заключается в том, что недостатки одного фактора перекрываются преимуществами другого. В vk.com это фактор знания (пароль) и фактор владения (телефон). Это было придумано для того, чтобы компрометации одного из факторов не было достаточно для получения доступа к аккаунту. Если у злоумышленника есть ваш пароль, для взлома аккаунта ему не будет хватать одноразового пароля, и наоборот, если он завладел вашим телефоном, то ему нужно будет дополнительно узнать пароль.


Здесь же получается, что достаточно узнать пароль пользователя, чтобы попросту отключить второй фактор аутентификации. По сути, это превращает двухфакторную аутентификацию Вконтакте в однофакторную.


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


Представим такую ситуацию, ваш коллега решил над вами подшутить. Пока вас не было на рабочем месте, он зашел к вам на компьютер, посмотрел в браузере сохраненные пароли, вошел в VK и отключил 2FA. Теперь он сможет заходить в ваш аккаунт до тех пор, пока вы не заметите перемен, что может произойти совсем не скоро. Вы и раньше не вводили одноразовый пароль на тех устройствах, которыми чаще всего пользуетесь, значит для вас ничего не поменяется. А шутник-коллега получит полный доступ к вашему аккаунту, и никто не знает к чему это может привести.


Если бы не был исправлен баг с перевыпуском токена, когда при повторном выпуске токена секретный ключ не менялся, ситуация могла бы стать еще интересней! Ваш коллега, уже зная пароль, мог бы отключить 2FA, после чего опять подключить двухфакторную аутентификацию, увидел бы при этом секретный ключ, выпустил бы себе токен, идентичный вашему, и мог бы читать ваши сообщения до тех пор, пока жив ваш аккаунт.


Выводы


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


2f4472fec26d4e4eb7b7b039105347b3.jpg

К сожалению, выяснилось, что это не совсем правда. При определенных обстоятельствах посторонний сможет узнать чужой токен Вконтакте или даже полностью отключить второй фактор, зная ваш пароль. Жду ваших мнений.

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

  • 22 ноября 2016 в 17:09

    +1

    А какой токен вы использовали?
    • 22 ноября 2016 в 17:18

      0

      Я использовал Protectimus Slim mini.
  • 22 ноября 2016 в 17:09

    0

    Вывод, который я сделал, прочитав материал, — двухфакторную аутентификацию к своей странице в VK нужно подключать дома и сразу (лучше, в полном одиночестве). Тогда бояться нечего.
    • 22 ноября 2016 в 17:21

      0

      Чтобы точно ничего не бояться, не снимайте подтверждение входа ни с одного браузера. А еще лучше подключите 2FA, после чего отключите и выпустите новый токен с новым секретом. Так Вы сможете быть уверенным, что никто не успел скопировать Ваш секрет до того, как Вы решили усилить безопасность аккаунта.
  • 22 ноября 2016 в 17:27

    0

    Насколько я понимаю, все это касается варианта с использованием приложения для генерации одноразовых паролей. А если пользоваться SMS?
    • 22 ноября 2016 в 17:35

      0

      Да, все правильно, я наткнулся на все эти нюансы, когда собирался подключить к аккаунту токен, правда перепрошиваемый аппаратный. Общеизвестно, что аппаратные токены надежней SMS или программных. Но в случае с Вконтактом законы логики бессильны, потому получается, что перевес действительно на стороне SMS. С другой стороны, теперь, когда вторая ошибка исправлена и при переподключении токена секретный ключ меняется, можно использовать эту «фичу» для обновления секрета. Подключаете токен, отключаете 2FA, потом опять переподключаете токен, получая при этом свеженький секрет, и спите спокойно.

© Habrahabr.ru