Мне было интересно посмотреть некоторые закономерности и для этой цели я взял базу данных паролей, утёкших в 2014 году – от Яндекса, Гугла и Мейлру, объемом 6 миллионов записей.
Обработка данных
Добытые данные представляли собой три текстовых файла, в которых в стандартной форме login@domain.ru:passwd содержались логины и пароли от различных почтовых служб. Общее число записей около 6 миллионов.
Обработка такого огромного массива данных представляла нетривиальную задачу: к примеру, любой символ, который я думал сделать разделителем в текстовом файле, встречался среди логинов или паролей. Да, там встречались все виды кавычек, спецсимволы, не имеющиеся на клавиатуре (например такой: §), и даже символы табуляции.
Вообще, так как и в логинах и в паролях встречаются знаки @ и «:», точный парсинг файлов для разделения на поля «логин», «домен» и «пароль» мне придумать не удалось. К примеру, как автоматически распарсить строки такого типа:
user@mail.ru@gmail.com:123123 (здесь первый @ относится к логину, второй к домену)
user:123@mail.ru:@123123 (а здесь первый @ относится к домену, второй к паролю)
Данные были сгруппированы по доменам. Всего у меня оказалось 7423 домена. Более миллиона раз встречаются gmail.com, mail.ru, yandex.ru
Из интересного: домен gmail.com777 встречается 295 раз. Много раз встречаются домены gmail.com и несколько семёрок. Причина этого остается для меня загадкой. Почему именно цифра 7 – непонятно.
Далее все домены были сгруппированы в четыре группы: GMAIL MAILRU YANDEX OTHER. В одну группу попали домены, которые принадлежат или принадлежали раньше этой почтовой службе (к примеру, в мейлру попали домены mail.ru, bk.ru, list.ru, inbox.ru и др.) При этом распределение записей стало следующим:
domain count
GMAIL 2308234
MAILRU 1978822
YANDEX 1640733
OTHER 158896
После этого я решил, что данные готовы к анализу.
Анализ данных: гипотеза о ботах
Проверим гипотезу, что большинство утекших в сеть аккаунтов было создано ботами.
Первый критерий, который я придумал – это случайная последовательность символов в логине. Для проверки я взял случайную выборку из 6000 логинов, и просто просмотрел её глазами. По скорости работы – это наиболее оптимальный вариант, написание любого скрипта заняло бы больше времени. Критерий не подтверждается – случайных логинов крайне мало. На выборку из 6000 логинов случайно сгенерированных не более двадцати.
Следующий критерий – распределение длин паролей. Посмотрим на рапределение длины логина – это равномерное распределение, чего не скажешь про пароли.
Явно видны выбивающиеся значения в районе длины 6, 8, и 10 символов. Вероятно, это и есть те самые сгенерированные автоматически пароли, которые могут принадлежать ботам.
Теперь подсчитаем количество таких «выбивающихся» из равномерного распределения величин. Для этого я вычислил ожидаемые значения столбцов 6, 8, 10, просто построив сглаженную кривую – а затем найшел разницу с реальными величинами.
Длина 8: 763313
Длина 10: 246115
Всего: 2020335
Итог: примерно 2 миллиона (то есть, третья часть) паролей сгенерирована искусственно.
Проверка совпадений пары логин-пароль для различных доменов
Теперь то, ради чего вообще затевалось это исследование: я хотел проверить, насколько часто люди ставят один и тот же пароль для различных почтовых сервисов – и насколько это безопасно.
Разбиваем данные на четыре подгруппы по доменам, и ищем пересечения: по логину, и по паре логин-пароль. Результаты:
Пары доменов | Совпадающие логины | Совпадающие пары логин-пароль |
GMAIL — MAILRU | 2362 | 121 |
GMAIL — YANDEX | 2421 | 215 |
MAILRU — YANDEX | 42005 | 33313 |
GMAIL — OTHER | 924 | 63 |
YANDEX — OTHER | 7075 | 6732 |
MAILRU — OTHER | 4085 | 3339 |
Мы видим, что пересечений между gmail и русскоязычными доменами намного меньше, чем между мейл.ру и яндексом. Также видно, что если для gmail более 90 процентов людей придумывают новый пароль, то для пары яндекс-мейлру наоборот – 80% паролей совпадают!
Проверка безопасности пересекающихся паролей
А теперь посмотрим, что это за совпадающие пароли, насколько они безопасны. Для этого сначала построим топ паролей. Из 6 млн. паролей 3.2 млн. уникальны, остальные хоть раз дублируются. Выберем величину топа: сколько у человека может быть почтовых ящиков? Вряд ли больше 40. Тогда возьмём топ-5000 паролей, нижняя частота как раз 40. Это значит, если ваш пароль попал в топ-5000, то он встречается в слитых данных более 40 раз – и скорее всего, используется ещё кем-то другим. Теперь посмотрим, сколько паролей из пересечений попадают в такой топ.
Для пересечений mailru – yandex (всего 33313 пересечения):
топ-5000: 2485 пароля ( 7.4% )
топ-100: 575 паролей ( 1.7% )
Из интересного: На первом месте из этой выборки пароль 123456. А на втором месте, что странно, пароль natasha. Вообще, женские имена в топе встречаются достаточно часто.
Для пересечений gmail – mailru (всего 121 пересечение)
топ-5000: 12 паролей
топ-100: 7 паролей
Вывод: хотя для одинаковых логинов 80 процентов паролей совпадают, из этих паролей 93 процента являются вполне безопасными.
И на закуску – те пароли из пересечений gmail-mailru, которые входят в топ-5000:
262626
12345
lopata
prodigy
qwerty
qwe123
udacha
1234
svetlana
1q2w3e4r
azsxdcfv
В следующем посте о черной археологии дата майнинга: проверка совпадений логина и пароля (полного и частичного), а также другие исследования правды и мифов про пароли.
Комментарии (36)
dcoder_mm
19.06.2015 23:11спецсимволы, не имеющиеся на клавиатуре например такой: §
? + 6 в латинской раскладке на OS XA_Kochurov
20.06.2015 23:34Во французской раскладке тоже встречается, соответствует запятой в русской раскладке (shift + / в английской).
Samber
19.06.2015 23:21+19Для этого я вычислил ожидаемые значения столбцов 6, 8, 10, просто построив сглаженную кривую – а затем найшел разницу с реальными величинами. Итог: примерно 2 миллиона (то есть, третья часть) паролей сгенерирована искусственно.
Почему сразу искусственно? Уверен что эти значения выделяются из-за требований к минимальной длине пароля на момент регистрации.Lelushak
19.06.2015 23:31+7Либо, как вариант, возникают благодаря прогресс-бару с надписью «ненадежный пароль», меняющемуся по мере добавления новых символов.
caveeagle Автор
19.06.2015 23:33-5Если бы это было так, не было бы провалов в значениях 7 и 9. Было бы наложение таких же гладких кривых, только начинающихся со значения 6 и 8 (а значит, значения в точке 7 были бы всегда больше, чем в точке 6)
Kolonist
20.06.2015 02:35+8Не соглашусь. Допустим, минимальная длина пароля — 6 символов. Это значит, что очень много пользователей поставят себе именно 6-значный пароль, 7-значных будет гораздо меньше, т.е. на 7-ми будет именно провал. То же самое и с 8 символами — если стоит такое ограничение, то большая часть использует именно 8 символов, а на 9-ти будет провал.
Причем, будет не плавный спад от минимально допустимого к более длинным, а именно резкий, т.к. люди ленивы, и очень часто длина пароля просто дополняется, чтобы соответствовать требованиям системы.
Кстати, можете это проверить на 8-знаках, если интересно. Поищите 8-значные пароли, начало которых совпадает с 6-значными (и 7-значными). Проанализируйте последние символы таких паролей. Потом поищите полученные из анализа последних двух символов (для 7-значных — последнего символа) паттерны в оставшихся восьмизнаках. Если моя логика верна, то вы получите наиболее типичные символы, которыми люди добивают пароль, чтобы система его приняла (наверняка там будет 0, 1, 7 или какой-нибудь символ типа $ или @).caveeagle Автор
20.06.2015 02:49-7Оба распределения растут в течении нескольких первых символов. Если бы люди были ленивы, двухзнаковых паролей было бы намного больше, чем четырёхзнаковых, а это не так. Распределение от 1 до 6 тогда бы падало, а оно равномерно растёт.
izac
19.06.2015 23:55+2Нет я всё понимаю, но почему пароль «lopata» такой частый мне не понять.
caveeagle Автор
20.06.2015 00:08Для меня намного большая загадка, откуда взялись домены gmail.com777 (295 раз), gmail.com7777 (78 раз), gmail.com77777(22 раза) и так далее. Причём повторяется только цифра 7, и только с доменами gmail.
stavinsky
20.06.2015 00:19По мне так размер пароля в 6, 8, 10 символов может быть вызван еще и всяческими генераторами паролей. Всяческие робоформс или тот же pwgen наверняка генерят пароли определенной длинны. pwgen например по умолчанию у меня дает те самые 8 символов.
Было бы интересно посмотреть нет ли паролей аля lopata1 lopata2 и тд. То есть когда идет какая-то явная для человека последовательность. Вот тут точно были бы ботыcaveeagle Автор
20.06.2015 00:23Да. Поэтому я и написал в выводах: «сгенерирована искусственно», но не уточнил про ботов. Увы, способа определить ботов только по паре логин-пароль не существует.
Kolonist
20.06.2015 02:40Вот тут точно были бы боты
ИМХО, боту проще сгенерировать пароль полностью случайно, взяв, например, первые 10 символов от md5(timestamp) с добавлением случайного символа из набора [@#$%^&*]. А (lopata1, lopata2, ...) больше похоже на человека, который регистрирует несколько аккаунтов вручную.stavinsky
20.06.2015 10:30Да скорее я их имел в виду)) Ботов наверное никак. Явно не по длине пароля, это я хотел сказать.
Envek
20.06.2015 10:30Извините, что я тут влезу с оффтопиком, но наболело: жутко бесят сервисы, ограничивающие длину логина снизу (т.е. минимум 6 символов например). Пример: skype. Жутко бесит, ведь мой логин везде — 5 символов и его приходится искусственно удлинять. И я не понимаю, зачем они это делают, ведь здесь нет никаких соображений безопасности, ведь логин — вещь совершенно публичная, указанная практически везде (по крайней мере мной)
На графике с длиной логинов хорошо заметен скачок на 4-х и 6-и символах.mickvav
20.06.2015 13:49+1Тут, вероятно, та же история, что была в своё время с короткими icq-номерами — чтобы несколько разбавить ажиатаж вокруг красивых и коротких сущностей.
Kapustos
20.06.2015 11:35+2При статистических исследованиях очень важна корректность входных данных. К сожалению в вашей выборке данные из разных источников, которые нельзя проверить на корректность. Например, получены ли пароли напрямую (сниффер, база с незашифрованими паролями) или кто-то перебирал пароли брутфорсом. Во втором случае, в базе почти не будет случайно сгенерированных паролей длиннее 7-8 символов, но они конечно же существуют, просто взломщик не смог их подобрать.
Пока вы не уверенны в гомогенности и корректности входящих данных, просто не имеет смысла проводить их статический анализ :(caveeagle Автор
20.06.2015 11:48Увы, работать приходится с тем, что есть — никто не даст базу данных действующих паролей. Единственный извесный мне случай полностью корректного исследования был два года назад: Уникальное исследование базы паролей университета Карнеги-Меллон
brate1nikoff
23.06.2015 21:58У меня ощущение, что дампы собраны отовсюду:
1. если если искать в поисковой по фразе «gmail.com777»
закэшированы на страницы emailsherlock.com, где есть пользователи
с подобной почтой (домен gmail.com777) на разных сервисах.
2. А также всякие контакты в указаны у ботов (https://vk.com/club77756895)
видимо ошибка в коде.
Но очень интересно откуда эти логины:)
MaximChistov
20.06.2015 14:52+1Также видно, что если для gmail более 90 процентов людей придумывают новый пароль, то для пары яндекс-мейлру наоборот – 80% паролей совпадают
Ну если у меня мейл почта восстанавливается через яндекс почту и наоборот, какой смысл второй пароль придумывать?)caveeagle Автор
20.06.2015 15:11Как раз наоборот, мне кажется. Если две почты завязаны друг на друга, и пароли одинаковы — то получение доступа к одной из них автоматически дает доступ к другой.
MaximChistov
20.06.2015 15:15Всегда, имея пароль от одной, можно сбросить пароль на другой через восстановление пароля. Смысл второго пароля?)
mickvav
20.06.2015 15:51Такая ваша позиция очень удобна для человека, подсмотревшего/подобравшего ваш пароль.
MaximChistov
20.06.2015 15:53Пароль с этих двух почт нигде не используется и не сохраняется, откуда его можно подсмотреть?)
michael_vostrikov
20.06.2015 16:31Как вариант — в бинокль с балкона многоэтажки напротив)
AllexIn
20.06.2015 20:35Вы забываете об одной простой вещи — защиты от персонального взлома НЕТ.
Если захотят получить данные лично к вашей почте, то получат, что бы вы не делали. Нужно быть экспертом по безопасности и параноиком, чтобы от этого защититься.
Поэтому все правила гигиены в интернете — они от массового взлома, чтобы тупые атаки не зацепили ваш аккаунт, а не от персонального.
Поэтому в случае бинокля с балкона — вы можете делать что хотите, но вас все равно хакнут.
gleb_l
21.06.2015 15:57Ппопробуйте взять статистику по тем записям, у которых расстояние Левенштейна между логином и паролем скажем меньше трех. Должно быть более показательно, чем просто полное совпадение. Еще интересно, насколько часты случаи, когда пароль имеет подстрокой логин
MichaelBorisov
21.06.2015 16:54Посмотрим на рапределение длины логина – это равномерное распределение,
По-моему вы неправильно употребляете термин «Равномерное распределение». Посмотрите в Википедию или в любой учебник по теорверу — там под "равномерным распределением" имеется в виду совсем другое.
MichaelBorisov
21.06.2015 16:58чего не скажешь про пароли.
Да, любопытно, что распределение длины пароля получилось бимодальным. Могу предположить, что это связано с разделением пользователей на 2 типа: те, кто не читал наставлений о том, что длина пароля должна быть не менее 8 символов, и те, кто читал.
Поэтому на 7 имеем провал — неискушенные пользователи считают, что в 7 символах нет необходимости, а искушенные — не используют 7 символов из соображений безопасности.
varagian
Кажется, анализ довольно сильно перекликается с тем, что писал на Хабр примерно год назад.