Всем привет! Недавно решил протестировать аппаратный OTP токен с возможностью перепрошивки по NFC, подключив его к своей учетке в vk.com. При этом наткнулся на недоработки в системе двухфакторной аутентификации Вконтакте, которые показались мне довольно существенными. Хочу поделиться своими наблюдениями с вами, так как в самом VK ошибок не признали. Возможно, я немного параноик? Интересно, что скажете вы.
Оговорюсь, что перед тем, как приступить к работе над статьей, все свои наблюдения я изложил на HackerOne. Ни один из описанных багов Вконтакте не признали. Но когда перед публикацией статьи я решил сделать подтверждающие скриншоты, оказалось, что один из багов все-таки был исправлен. То, что к моим словам прислушались, не может не радовать. Жаль только, что ребята даже “спасибо” не сказали.
Итак, ошибка №1. Статичный секретный ключ.
Чтобы подключить к своему аккаунту приложение для генерации OTP, пользователь вводит пароль, после чего перед ним открывается страница с секретным ключом, необходимым для выпуска программного токена. Пока все правильно.
Но если по какой-либо причине пользователь не активировал программный токен сразу (например, отвлекся на важный звонок, или просто передумал и вернулся на главную страницу), то когда через некоторое время он все-таки решит получить токен, ему опять предложат тот же секретный ключ.
Усугубляет ситуацию еще и то, что в течение получаса после ввода пароля, даже если вы перешли на главную страницу или вышли из аккаунта, а потом снова вошли, перед показом QR кода с секретом повторно пароль не запрашивается.
Чем это опасно?
Токен Вконтакте, как и любой другой TOTP токен работает по достаточно простому принципу: генерирует одноразовые пароли по алгоритму на основании двух параметров — времени и секретного ключа. Как вы сами понимаете, единственное, что нужно для компрометации второго фактора аутентификации — это знать СЕКРЕТНЫЙ КЛЮЧ.
Подобная уязвимость оставляет злоумышленнику две лазейки:
- Если пользователь отойдет от компьютера, у злоумышленника будет достаточно времени, чтобы скомпрометировать его секретный ключ.
- Завладев паролем пользователя, злоумышленник легко может подсмотреть его секретный ключ наперед.
Решить вопрос элементарно просто. Секретный ключ должен менятся каждый раз после обновления страницы, как это происходит, например, в Facebook.
Ошибка №2. Новый токен после перевыпуска использует тот же секретный ключ.
На момент публикации статьи этот недостаток был устранен.
Ситуация, описанная выше, усугубляется тем, что при повторном выпуске токена, Вконтакте не предложит вам новый секретный ключ. По сути, к вашей странице привязывается 1 секретный ключ и сменить его вы уже не сможете.
Чем это опасно?
Если вы узнали, что ваш секретный ключ скомпрометирован (например, при первом выпуске токена, как описано в первом пункте), двойная аутентификация Вконтакте больше вам не нужна. Смело отключайте второй фактор и подберите пароль посильней. Перевыпустить токен с новым секретом не представляется возможным.
Если Вы потеряли телефон, на котором был установлен токен, можете сделать то же самое. Тот, к кому в руки попал ваш смартфон, сможет спокойно использовать его для входа в ваш аккаунт. Осталось узнать только пароль. При этом вся суть двухфакторной аутентификации теряется. Понятно, что если пользователь заметит дискредитацию своего аккаунта, он может связаться с суппортом, но на это будет потрачено драгоценное время, которого у него может не быть.
Ошибка № 3. Отключение второго фактора без запроса одноразового пароля.
Здесь все понятно из названия. При отключении второго фактора, достаточно ввода пароля, OTP не запрашивается.
Чем это опасно?
Если для отключения двойной аутентификации Вконтакте достаточно только ввода пароля, теряется сама суть двухфакторной аутентификации. А суть двухфакторной аутентификации заключается в том, что недостатки одного фактора перекрываются преимуществами другого. В vk.com это фактор знания (пароль) и фактор владения (телефон). Это было придумано для того, чтобы компрометации одного из факторов не было достаточно для получения доступа к аккаунту. Если у злоумышленника есть ваш пароль, для взлома аккаунта ему не будет хватать одноразового пароля, и наоборот, если он завладел вашим телефоном, то ему нужно будет дополнительно узнать пароль.
Здесь же получается, что достаточно узнать пароль пользователя, чтобы попросту отключить второй фактор аутентификации. По сути, это превращает двухфакторную аутентификацию Вконтакте в однофакторную.
Вконтакте предлагает своим пользователям очень удобную функцию “Снять подтверждение с текущего браузера”. Я уверен, что функция пользуется популярностью и пользователи отключают подтверждение, как минимум, дома, и на работе. Более того, у большинства пользователей пароли сохранены в браузерах, где их можно легко просмотреть и скопировать.
Представим такую ситуацию, ваш коллега решил над вами подшутить. Пока вас не было на рабочем месте, он зашел к вам на компьютер, посмотрел в браузере сохраненные пароли, вошел в VK и отключил 2FA. Теперь он сможет заходить в ваш аккаунт до тех пор, пока вы не заметите перемен, что может произойти совсем не скоро. Вы и раньше не вводили одноразовый пароль на тех устройствах, которыми чаще всего пользуетесь, значит для вас ничего не поменяется. А шутник-коллега получит полный доступ к вашему аккаунту, и никто не знает к чему это может привести.
Если бы не был исправлен баг с перевыпуском токена, когда при повторном выпуске токена секретный ключ не менялся, ситуация могла бы стать еще интересней! Ваш коллега, уже зная пароль, мог бы отключить 2FA, после чего опять подключить двухфакторную аутентификацию, увидел бы при этом секретный ключ, выпустил бы себе токен, идентичный вашему, и мог бы читать ваши сообщения до тех пор, пока жив ваш аккаунт.
Выводы
При подключении двухэтапной аутентификации к аккаунту Вконтакте, появляется памятка, которая гласит “Даже если злоумышленник узнает Ваш логин, пароль и использованный код подтверждения, он не сможет попасть на Вашу страницу со своего компьютера."
К сожалению, выяснилось, что это не совсем правда. При определенных обстоятельствах посторонний сможет узнать чужой токен Вконтакте или даже полностью отключить второй фактор, зная ваш пароль. Жду ваших мнений.
Автор: Walis