Есть темы, по которым очень мало статей по специальности data science, но которые представляют интерес для специалистов по безопасности. Это статистические исследования логинов и паролей пользователей – данные, добытые «черными археологами» дата майнинга.

image

Мне было интересно посмотреть некоторые закономерности и для этой цели я взял базу данных паролей, утёкших в 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 логинов случайно сгенерированных не более двадцати.

Следующий критерий – распределение длин паролей. Посмотрим на рапределение длины логина – это равномерное распределение, чего не скажешь про пароли.

image

image

Явно видны выбивающиеся значения в районе длины 6, 8, и 10 символов. Вероятно, это и есть те самые сгенерированные автоматически пароли, которые могут принадлежать ботам.

Теперь подсчитаем количество таких «выбивающихся» из равномерного распределения величин. Для этого я вычислил ожидаемые значения столбцов 6, 8, 10, просто построив сглаженную кривую – а затем найшел разницу с реальными величинами.

Результат
Длина 6: 1010907
Длина 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:

пароли
123456
262626
12345
lopata
prodigy
qwerty
qwe123
udacha
1234
svetlana
1q2w3e4r
azsxdcfv

В следующем посте о черной археологии дата майнинга: проверка совпадений логина и пароля (полного и частичного), а также другие исследования правды и мифов про пароли.

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


  1. varagian
    19.06.2015 23:08
    +7

    Кажется, анализ довольно сильно перекликается с тем, что писал на Хабр примерно год назад.


  1. dcoder_mm
    19.06.2015 23:11

    спецсимволы, не имеющиеся на клавиатуре например такой: §

    ? + 6 в латинской раскладке на OS X


    1. A_Kochurov
      20.06.2015 23:34

      Во французской раскладке тоже встречается, соответствует запятой в русской раскладке (shift + / в английской).


  1. Samber
    19.06.2015 23:21
    +19

    Для этого я вычислил ожидаемые значения столбцов 6, 8, 10, просто построив сглаженную кривую – а затем найшел разницу с реальными величинами. Итог: примерно 2 миллиона (то есть, третья часть) паролей сгенерирована искусственно.
    Почему сразу искусственно? Уверен что эти значения выделяются из-за требований к минимальной длине пароля на момент регистрации.


    1. Lelushak
      19.06.2015 23:31
      +7

      Либо, как вариант, возникают благодаря прогресс-бару с надписью «ненадежный пароль», меняющемуся по мере добавления новых символов.


      1. khdavid
        20.06.2015 12:29
        +4

        Или, могу подозревать, много паролей — даты рождений, то есть шесть символов.


        1. HunterSpy
          20.06.2015 13:58
          +3

          То есть 6 или 8 символов, в зависимости от того полно или кратко писать год.
          т.е — 010190 или 01011990 (дата 1 января 1990 г.)


        1. caveeagle Автор
          20.06.2015 15:08

          Посмотрел, не подтверждается.


    1. caveeagle Автор
      19.06.2015 23:33
      -5

      Если бы это было так, не было бы провалов в значениях 7 и 9. Было бы наложение таких же гладких кривых, только начинающихся со значения 6 и 8 (а значит, значения в точке 7 были бы всегда больше, чем в точке 6)


      1. Kolonist
        20.06.2015 02:35
        +8

        Не соглашусь. Допустим, минимальная длина пароля — 6 символов. Это значит, что очень много пользователей поставят себе именно 6-значный пароль, 7-значных будет гораздо меньше, т.е. на 7-ми будет именно провал. То же самое и с 8 символами — если стоит такое ограничение, то большая часть использует именно 8 символов, а на 9-ти будет провал.

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

        Кстати, можете это проверить на 8-знаках, если интересно. Поищите 8-значные пароли, начало которых совпадает с 6-значными (и 7-значными). Проанализируйте последние символы таких паролей. Потом поищите полученные из анализа последних двух символов (для 7-значных — последнего символа) паттерны в оставшихся восьмизнаках. Если моя логика верна, то вы получите наиболее типичные символы, которыми люди добивают пароль, чтобы система его приняла (наверняка там будет 0, 1, 7 или какой-нибудь символ типа $ или @).


        1. caveeagle Автор
          20.06.2015 02:49
          -7

          Оба распределения растут в течении нескольких первых символов. Если бы люди были ленивы, двухзнаковых паролей было бы намного больше, чем четырёхзнаковых, а это не так. Распределение от 1 до 6 тогда бы падало, а оно равномерно растёт.


  1. izac
    19.06.2015 23:55
    +2

    Нет я всё понимаю, но почему пароль «lopata» такой частый мне не понять.



    1. caveeagle Автор
      20.06.2015 00:08

      Для меня намного большая загадка, откуда взялись домены gmail.com777 (295 раз), gmail.com7777 (78 раз), gmail.com77777(22 раза) и так далее. Причём повторяется только цифра 7, и только с доменами gmail.


      1. egorsmkv
        20.06.2015 00:11

        Может быть, автор базы так маркировал важные аккаунты.


  1. stavinsky
    20.06.2015 00:19

    По мне так размер пароля в 6, 8, 10 символов может быть вызван еще и всяческими генераторами паролей. Всяческие робоформс или тот же pwgen наверняка генерят пароли определенной длинны. pwgen например по умолчанию у меня дает те самые 8 символов.

    Было бы интересно посмотреть нет ли паролей аля lopata1 lopata2 и тд. То есть когда идет какая-то явная для человека последовательность. Вот тут точно были бы боты


    1. caveeagle Автор
      20.06.2015 00:23

      Да. Поэтому я и написал в выводах: «сгенерирована искусственно», но не уточнил про ботов. Увы, способа определить ботов только по паре логин-пароль не существует.


    1. Kolonist
      20.06.2015 02:40

      Вот тут точно были бы боты
      ИМХО, боту проще сгенерировать пароль полностью случайно, взяв, например, первые 10 символов от md5(timestamp) с добавлением случайного символа из набора [@#$%^&*]. А (lopata1, lopata2, ...) больше похоже на человека, который регистрирует несколько аккаунтов вручную.


      1. stavinsky
        20.06.2015 10:30

        Да скорее я их имел в виду)) Ботов наверное никак. Явно не по длине пароля, это я хотел сказать.


  1. nekt
    20.06.2015 04:13
    +3

    К вопросу парсинга: (.+)@([^@:]+):(.+)

    Плюс можно прямо список доменов считать разделителем.


    1. alexeyrom
      20.06.2015 12:21

      Это пока не встретится пользователь с логином a@b:c. Хотя случаи, подпадающие под (.+)@([^@:]+):(.+)@([^@:]+):(.+) можно обработать отдельно.


  1. Envek
    20.06.2015 10:30

    Извините, что я тут влезу с оффтопиком, но наболело: жутко бесят сервисы, ограничивающие длину логина снизу (т.е. минимум 6 символов например). Пример: skype. Жутко бесит, ведь мой логин везде — 5 символов и его приходится искусственно удлинять. И я не понимаю, зачем они это делают, ведь здесь нет никаких соображений безопасности, ведь логин — вещь совершенно публичная, указанная практически везде (по крайней мере мной)
    На графике с длиной логинов хорошо заметен скачок на 4-х и 6-и символах.


    1. mickvav
      20.06.2015 13:49
      +1

      Тут, вероятно, та же история, что была в своё время с короткими icq-номерами — чтобы несколько разбавить ажиатаж вокруг красивых и коротких сущностей.


  1. Kapustos
    20.06.2015 11:35
    +2

    При статистических исследованиях очень важна корректность входных данных. К сожалению в вашей выборке данные из разных источников, которые нельзя проверить на корректность. Например, получены ли пароли напрямую (сниффер, база с незашифрованими паролями) или кто-то перебирал пароли брутфорсом. Во втором случае, в базе почти не будет случайно сгенерированных паролей длиннее 7-8 символов, но они конечно же существуют, просто взломщик не смог их подобрать.

    Пока вы не уверенны в гомогенности и корректности входящих данных, просто не имеет смысла проводить их статический анализ :(


    1. caveeagle Автор
      20.06.2015 11:48

      Увы, работать приходится с тем, что есть — никто не даст базу данных действующих паролей. Единственный извесный мне случай полностью корректного исследования был два года назад: Уникальное исследование базы паролей университета Карнеги-Меллон


      1. brate1nikoff
        23.06.2015 21:58

        У меня ощущение, что дампы собраны отовсюду:
        1. если если искать в поисковой по фразе «gmail.com777»
        закэшированы на страницы emailsherlock.com, где есть пользователи
        с подобной почтой (домен gmail.com777) на разных сервисах.
        2. А также всякие контакты в указаны у ботов (https://vk.com/club77756895)
        видимо ошибка в коде.

        Но очень интересно откуда эти логины:)


  1. MaximChistov
    20.06.2015 14:52
    +1

    Также видно, что если для gmail более 90 процентов людей придумывают новый пароль, то для пары яндекс-мейлру наоборот – 80% паролей совпадают

    Ну если у меня мейл почта восстанавливается через яндекс почту и наоборот, какой смысл второй пароль придумывать?)


    1. caveeagle Автор
      20.06.2015 15:11

      Как раз наоборот, мне кажется. Если две почты завязаны друг на друга, и пароли одинаковы — то получение доступа к одной из них автоматически дает доступ к другой.


      1. MaximChistov
        20.06.2015 15:15

        Всегда, имея пароль от одной, можно сбросить пароль на другой через восстановление пароля. Смысл второго пароля?)


        1. mickvav
          20.06.2015 15:51

          Такая ваша позиция очень удобна для человека, подсмотревшего/подобравшего ваш пароль.


          1. MaximChistov
            20.06.2015 15:53

            Пароль с этих двух почт нигде не используется и не сохраняется, откуда его можно подсмотреть?)


            1. michael_vostrikov
              20.06.2015 16:31

              Как вариант — в бинокль с балкона многоэтажки напротив)


              1. AllexIn
                20.06.2015 20:35

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


  1. gleb_l
    21.06.2015 15:57

    Ппопробуйте взять статистику по тем записям, у которых расстояние Левенштейна между логином и паролем скажем меньше трех. Должно быть более показательно, чем просто полное совпадение. Еще интересно, насколько часты случаи, когда пароль имеет подстрокой логин


  1. MichaelBorisov
    21.06.2015 16:54

    Посмотрим на рапределение длины логина – это равномерное распределение,

    По-моему вы неправильно употребляете термин «Равномерное распределение». Посмотрите в Википедию или в любой учебник по теорверу — там под "равномерным распределением" имеется в виду совсем другое.


  1. MichaelBorisov
    21.06.2015 16:58

    чего не скажешь про пароли.

    Да, любопытно, что распределение длины пароля получилось бимодальным. Могу предположить, что это связано с разделением пользователей на 2 типа: те, кто не читал наставлений о том, что длина пароля должна быть не менее 8 символов, и те, кто читал.

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