Всем привет! Недавно решил протестировать аппаратный OTP токен с возможностью перепрошивки по NFC, подключив его к своей учетке в vk.com. При этом наткнулся на недоработки в системе двухфакторной аутентификации Вконтакте, которые показались мне довольно существенными. Хочу поделиться своими наблюдениями с вами, так как в самом VK ошибок не признали. Возможно, я немного параноик? Интересно, что скажете вы, хабровчане.
Оговорюсь, что перед тем, как приступить к работе над статьей, все свои наблюдения я изложил на HackerOne. Ни один из описанных багов Вконтакте не признали. Но когда перед публикацией статьи я решил сделать подтверждающие скриншоты, оказалось, что один из багов все-таки был исправлен. То, что к моим словам прислушались, не может не радовать. Жаль только, что ребята даже “спасибо” не сказали.
Итак, ошибка №1. Статичный секретный ключ.
Чтобы подключить к своему аккаунту приложение для генерации OTP, пользователь вводит пароль, после чего перед ним открывается страница с секретным ключом, необходимым для выпуска программного токена. Пока все правильно.
Но если по какой-либо причине пользователь не активировал программный токен сразу (например, отвлекся на важный звонок, или просто передумал и вернулся на главную страницу), то когда через некоторое время он все-таки решит получить токен, ему опять предложат тот же секретный ключ.
Усугубляет ситуацию еще и то, что в течение получаса после ввода пароля, даже если вы перешли на главную страницу или вышли из аккаунта, а потом снова вошли, перед показом QR кода с секретом повторно пароль не запрашивается.
Чем это опасно?
Токен Вконтакте, как и любой другой TOTP токен работает по достаточно простому принципу: генерирует одноразовые пароли по алгоритму на основании двух параметров — времени и секретного ключа. Как вы сами понимаете, единственное, что нужно для компрометации второго фактора аутентификации — это знать СЕКРЕТНЫЙ КЛЮЧ.
Подобная уязвимость оставляет злоумышленнику две лазейки:
- Если пользователь отойдет от компьютера, у злоумышленника будет достаточно времени, чтобы скомпрометировать его секретный ключ.
- Завладев паролем пользователя, злоумышленник легко может подсмотреть его секретный ключ наперед.
Решить вопрос элементарно просто. Секретный ключ должен менятся каждый раз после обновления страницы, как это происходит, например, в Facebook.
Ошибка №2. Новый токен после перевыпуска использует тот же секретный ключ.
На момент публикации статьи этот недостаток был устранен.
Ситуация, описанная выше, усугубляется тем, что при повторном выпуске токена, Вконтакте не предложит вам новый секретный ключ. По сути, к вашей странице привязывается 1 секретный ключ и сменить его вы уже не сможете.
Чем это опасно?
Если вы узнали, что ваш секретный ключ скомпрометирован (например, при первом выпуске токена, как описано в первом пункте), двойная аутентификация Вконтакте больше вам не нужна. Смело отключайте второй фактор и подберите пароль посильней. Перевыпустить токен с новым секретом не представляется возможным.
Если Вы потеряли телефон, на котором был установлен токен, можете сделать то же самое. Тот, к кому в руки попал ваш смартфон, сможет спокойно использовать его для входа в ваш аккаунт. Осталось узнать только пароль. При этом вся суть двухфакторной аутентификации теряется. Понятно, что если пользователь заметит дискредитацию своего аккаунта, он может связаться с суппортом, но на это будет потрачено драгоценное время, которого у него может не быть.
Ошибка № 3. Отключение второго фактора без запроса одноразового пароля.
Здесь все понятно из названия. При отключении второго фактора, достаточно ввода пароля, OTP не запрашивается.
Чем это опасно?
Если для отключения двойной аутентификации Вконтакте достаточно только ввода пароля, теряется сама суть двухфакторной аутентификации. А суть двухфакторной аутентификации заключается в том, что недостатки одного фактора перекрываются преимуществами другого. В vk.com это фактор знания (пароль) и фактор владения (телефон). Это было придумано для того, чтобы компрометации одного из факторов не было достаточно для получения доступа к аккаунту. Если у злоумышленника есть ваш пароль, для взлома аккаунта ему не будет хватать одноразового пароля, и наоборот, если он завладел вашим телефоном, то ему нужно будет дополнительно узнать пароль.
Здесь же получается, что достаточно узнать пароль пользователя, чтобы попросту отключить второй фактор аутентификации. По сути, это превращает двухфакторную аутентификацию Вконтакте в однофакторную.
Вконтакте предлагает своим пользователям очень удобную функцию “Снять подтверждение с текущего браузера”. Я уверен, что функция пользуется популярностью и пользователи отключают подтверждение, как минимум, дома, и на работе. Более того, у большинства пользователей пароли сохранены в браузерах, где их можно легко просмотреть и скопировать.
Представим такую ситуацию, ваш коллега решил над вами подшутить. Пока вас не было на рабочем месте, он зашел к вам на компьютер, посмотрел в браузере сохраненные пароли, вошел в VK и отключил 2FA. Теперь он сможет заходить в ваш аккаунт до тех пор, пока вы не заметите перемен, что может произойти совсем не скоро. Вы и раньше не вводили одноразовый пароль на тех устройствах, которыми чаще всего пользуетесь, значит для вас ничего не поменяется. А шутник-коллега получит полный доступ к вашему аккаунту, и никто не знает к чему это может привести.
Если бы не был исправлен баг с перевыпуском токена, когда при повторном выпуске токена секретный ключ не менялся, ситуация могла бы стать еще интересней! Ваш коллега, уже зная пароль, мог бы отключить 2FA, после чего опять подключить двухфакторную аутентификацию, увидел бы при этом секретный ключ, выпустил бы себе токен, идентичный вашему, и мог бы читать ваши сообщения до тех пор, пока жив ваш аккаунт.
Выводы
При подключении двухэтапной аутентификации к аккаунту Вконтакте, появляется памятка, которая гласит “Даже если злоумышленник узнает Ваш логин, пароль и использованный код подтверждения, он не сможет попасть на Вашу страницу со своего компьютера."
К сожалению, выяснилось, что это не совсем правда. При определенных обстоятельствах посторонний сможет узнать чужой токен Вконтакте или даже полностью отключить второй фактор, зная ваш пароль. Жду ваших мнений.
Комментарии (28)
tgilartem
22.11.2016 17:09Вывод, который я сделал, прочитав материал, — двухфакторную аутентификацию к своей странице в VK нужно подключать дома и сразу (лучше, в полном одиночестве). Тогда бояться нечего.
Walis
22.11.2016 17:21+2Чтобы точно ничего не бояться, не снимайте подтверждение входа ни с одного браузера. А еще лучше подключите 2FA, после чего отключите и выпустите новый токен с новым секретом. Так Вы сможете быть уверенным, что никто не успел скопировать Ваш секрет до того, как Вы решили усилить безопасность аккаунта.
DonRydell
22.11.2016 17:27Насколько я понимаю, все это касается варианта с использованием приложения для генерации одноразовых паролей. А если пользоваться SMS?
Walis
22.11.2016 17:35+1Да, все правильно, я наткнулся на все эти нюансы, когда собирался подключить к аккаунту токен, правда перепрошиваемый аппаратный. Общеизвестно, что аппаратные токены надежней SMS или программных. Но в случае с Вконтактом законы логики бессильны, потому получается, что перевес действительно на стороне SMS. С другой стороны, теперь, когда вторая ошибка исправлена и при переподключении токена секретный ключ меняется, можно использовать эту “фичу” для обновления секрета. Подключаете токен, отключаете 2FA, потом опять переподключаете токен, получая при этом свеженький секрет, и спите спокойно.
Gray_Wolf
22.11.2016 21:19+4С учётом недавних историй когда непонятные люди в сотнях километров от вас получали копию вашей SIM, якобы по вашим документам, SMS уже не кажется таким надёжным методом защиты.
ColorPrint
22.11.2016 22:50+1Причем эта «услуга» уже в открытую на специализированных форумах предлагается и относительно недорого :(
nevzorofff
29.11.2016 22:01Симкарты, оформленные на организации так же безпроблемно сделают?
ColorPrint
29.11.2016 22:05Кто ж их знает. Теоретически, доверенность от организации нарисовать тоже никто не мешает. Даже паспорт «владельца» сим-карты не нужен.
ColorPrint
29.11.2016 22:06Юрлица целиком вон уводят по поддельным документам в налоговую (вместе со всеми активами), а тут замена сим-карты какой-то всего лишь.
sazhnikoff
23.11.2016 12:38+3Я в начале этого года, просто так заполучил новую симку от своего номера (в «центральном офисе» г. Тулы, но не буду говорить какого оператора, дабы не чернить) и, по-моему, даже имя не спросили. Просто номер. Без паспорта. А Вы про поддельные документы говорите :)
Germanets
23.11.2016 14:45Недавно пришлось менять одну старую симкарту с 3г на 4г, симкарта зарегистрирована на родственника.
Судя по диалогу и действиям в салоне оператора — никаких ограничений для того чтобы выпустить новую симку у представителей в салоне нет — достаточно иметь на руках сим-карту с номером, указанным на ней.
Каких либо подтверждений при этом не требуется, кроме подтверждения «да, приходил хозяин симкарты», даже подписи вашей никто не запрашивает, да и паспорт не берёт, все необходимые данные и так видны представителям салона.sumanai
23.11.2016 17:08Нужно проверить, а то моей симке уже 9 год идёт, а тот, на кого регистрировал, к сожалению умер.
Gray_Wolf
22.11.2016 21:24-1Здесь все понятно из названия. При отключении второго фактора, достаточно ввода пароля, OTP не запрашивается.
OTP и не должен запрашиваться при его отключении.
OTP может быть утерян и для отключения данной проверки у пользователя необходимо запросить пароль и секретный ключ.Walis
23.11.2016 13:14ad1Dima пишет правильно, при утере токена нужно обращаться в службу поддержки. Откуда Вы узнаете свой секретный ключ, если потеряли токен? На всякий случай запишите на стикер и приклеите к монитору?
Gray_Wolf
23.11.2016 14:54Обращаться то можно куда угодно, но эта самая служба поддержки должна запросить у вас либо секретный ключ, либо большой набор документов вместо него, дабы гарантировать что обращение пришло от реального владельца аккаунта.
На всякий случай запишите на стикер и приклеите к монитору?
Т.е. пароль вы именно там храните?
Существуют менеджеры паролей которые позволяют довольно надёжно хранить свои пароли, БД от этих менеджеров можно держать в папке которая синхронизируется с dropbox, iCloud, yaDrive и пр.
xalkin
24.11.2016 15:35Классически эта проблема решается фиксированными одноразовыми кодами, которые сообщаются пользователю при генерации ключа токена. Посмотрите как это сделано у того же гугла.
plartem
23.11.2016 12:38По поводу 3:
1) С таким же успехом ваш коллега-юморист может взять ваш телефон и получить токен.
2) Как при потере телефона вы сможете отключить двухфакторную авторизацию, если вк будет просить код, который на него вышлет?Kenya-West
23.11.2016 13:25+1Резервные коды идут на помощь! Я обычно их печатаю на внутренней стороне своей шапочки из фольги:
ilyamodder
23.11.2016 13:261) На телефон тоже можно пароль поставить;
2) Восстановить симку и получить смс.
shifttstas
23.11.2016 14:33+2Вы тут двухфакторную аутентификацию для VK настраивает а надо профиль сносить в данной соц-сети ради безопастности…
Germanets
23.11.2016 14:48+4/параноик_мод
На самом деле, надо было даже и не заводить. Да и вообще не оставлять данные о себе в интернете.
Andrusha
24.11.2016 00:28+1В VK она ещё более-менее логично реализована. Вот Facebook при входе предлагает выбрать привязанный номер телефона, причём в половине случаев отправляет SMS. Коды генерируются различные, но оба (что из приложения, что из SMS) подходят.
istui
А какой токен вы использовали?
Walis
Я использовал Protectimus Slim mini.