Pull to refresh

Gravatar: как расшифровать адреса электронной почты всех пользователей?

Information Security
Sandbox
Про Gravatar многие наслышаны, а кое-кто им и пользуется. Если не слышали, то Gravatar — глобально распознаваемый аватар — изображение, которое привязывается к вашему адресу электронной почты и которое вы можете использовать на других сайтах при комментировании, заполнении профиля и т.д.

Сервис Gravatar оказался довольно популярным и востребованным публикой и с годами превратился в свою мини-социальную сеть с многомиллионной аудиторий. Впрочем, сколько всего есть Граваторов (то есть пользователей, которые привязали к своему адресу электронной почты аватар) информации я так и не нашел. Лишь на официальном сайте создатели сервиса с гордостью заявляют, что «Миллионы аватаров показываются более 8,6 млрд. раз в день».

О популярности Gravatar говорит тот факт, что он поддерживается многими популярными движками, такими как, Redmine, W-script и, конечно же, WordPress. Имеются плагины и модификации, которые позволяют интегрировать поддержку глобально распознаваемых аватаров в такие системы, как Drupal, Joomla, MODX, SMF и phpBB.

Работает Gravatar по схеме: пользователь регистрируется в сервисе Gravatar и сохраняет там свой аватар и адрес электронной почты. Отныне у него есть свой Gravatar. Теперь, когда он хочет оставить комментарий на сайте или блоге, он лишь указывает свой адрес электронной почты. Скрипт сайта шифрует этот адрес электронной почты и отправляет его на сервер Gravatar, откуда и возвращается картинка-аватар.

Если мы откроем исходную страницу с картинкой Gravatar, то увидим примерно следующий адрес аватара:



32-значное шестнадцатеричное число в этом адресе есть MD5-хэш самого адреса электронной почты и, по сути, это один единственный ключ, который и идентифицирует пользователя в системе Gravatar.

Алгоритм хэширования MD5, используемый сервисом Gravatar, предназначен в первую очередь для сокрытия адреса электронной почты пользователя (не передавать же его в открытом виде). Его особенностью является «однонаправленность», то есть функцией MD5 мы можем получить (зашифровать) хэш (отпечаток) какого-либо слова, но не можем его получить (расшифровать) обратно. То есть, разобрать, что же именно мы зашифровали в хэш «05933ec7a23f6ebd2017490abfbcd3f3» — невозможно никакой математической функцией.

Тем не менее, существуют методы «расшифровки» MD5, такие как «перебор по словарю», «радужные таблицы» и т.д. В таком случае встает вопрос сохранности адреса электронной почты пользователя Gravatar. Впрочем, сам пользователь может сделать свой адрес электронной почты публичным, а также он известен администратору сайта, на котором он оставляет комментарий. Но вернемся к эффективности использования уязвимого алгоритма хэширования (MD5) сервисом Gravatar.

Насколько он является безопасным и насколько реально расшифровать… все граватары?

Чтобы ответить на этот вопрос, я решил не «взламывать» MD5-хэши (что показалось мне затратным по времени), а проверять наличие имеющего адреса электронной почты на наличие в базе Gravatar. Принцип предельно простой: проверяем адрес электронной почты на наличие граватара, если граватар есть, заносим в базу данных MD5-хэш.

Методом проб и ошибок для таких целей был выбран оптимальный запрос к сервису Gravatar по адресу с параметром:
www.gravatar.com/avatar/HASH?d=404

При обращении по такому адресу сервис Gravatar вернет ответ 200, если у пользователя есть граватар (если вообще такой пользователь существует) и ответ 404 — если пользователя нет в базе Gravatar. В таком случае, пишем скрипт на проверку ответа сервера:

$email = "адрес@электронной.почты";
$hash = md5(strtolower(trim($email)));
$url = 'http://www.gravatar.com/avatar/'.$hash.'?d=404';
$check_url = get_headers($url);
if (strpos($check_url[0],'200')){
//получили ответ 200 - такой пользователь есть, записываем его MD5-хэш в базу
}

Итак, проверить наличие граватара у адреса электронной почты мы научились. В качестве сырья я скачал первые попавшиеся базы адресов электронной почты из интернета (обычные спам-базы, а также адреса электронной почты попавшие в поисковую выдачу открытым текстом) в количестве свыше 10 000 000 (почистил от дублей, проверил на валидность и т.д.). Поставил на обычный компьютер обычный локальный сервер (Денвер), вышеуказанный скрипт сделал многопоточным (добился скорости проверки около 2 млн. адресов в сутки). К удивлению, не смотря на чудовищные запросы к сервису Gravatar, тот не блокировал работу скрипта и исправно отдавал данные на всем этапе эксперимента.

В течении недели были проверены все 10 млн. адресов, а результат работы записан в базу данных, имеющую следующую структуру:

  • адрес электронной почты (у которого нашелся граватар)
  • MD5-хэш этого адреса электронной почты
  • логин пользователя Gravatar

Логин пользователя Gravatar необходим для получения ссылки на профиль пользователя в сервисе, откуда можно почерпнуть дополнительную информацию о самом пользователе. Такой урл имеет структуру:
www.gravatar.com/ЛОГИН

Получить логин можно при обращении к файлу импорта вида:
www.gravatar.com/HASH.php

Напишем скрипт, который найдет требуемую нам переменную под названием — preferredUsername

$email = "адрес@электронной.почты";
$hash = md5(strtolower(trim($email)));
$str = file_get_contents('http://www.gravatar.com/'.$hash.'.php');
$profile = unserialize($str);
if (is_array( $profile) && isset( $profile['entry'] ))
$login = $profile['entry'][0]['preferredUsername'];

Переменные получены ($email, $hash и $login) и занесены в базу данных для последующего поиска в ней. И это все? По сути, да. Краткость — сестра таланта. Прикручиваем к базе данных поиск и, вуаля: сервис готов. Теперь, при вводе в поисковую строку MD5-хэша, который можно взять на любом сайте, где пользователь оставил комментарий, мы можем получить его адрес электронной почты. Для удобства я реализовал технологию Drag & Drop (перетащи и отпусти) — просто перетащите картинку граватара с любого сайта в окно поиска и нажмите «найти».

Пояснения: эксперимент и сервис не создавался в каких-либо злонамеренных целях (для спама и т.д.). Также никто не может нести ответственности за сохранность адреса электронной почты пользователя Gravatar — пользователь осведомлен, что он виден администратору сайта, на котором оставлен комментарий. Заботясь о сохранности персональных данных, я ограничил результаты поиска, закрыл данные от попадания в поисковый индекс и т.д. Сервис, получившийся экспромтом в результате эксперимента, сделан для людей в справочных и контактных целях. А также, как информация к размышлению, для держателей сервиса Gravatar.

Итоги: рядовой компьютер за неделю перебрал/проверил 10 млн адресов электронной почты (взятых из открытых источников). Лишь у 3% (около 300 000 распознанных MD5-хэшей) из них оказался свой Граватар (не густо). Но теоретически все адреса электронной почты у всех пользователей интернета могут быть собраны в единую базу для последующей проверки по описанному методу. И также теоретически все MD5-хэши сервиса Gravatar могут быть вычислены. Все — это намного больше, чем 10%, которые можно получить перебором MD5 хэшей. Алгоритм шифрования адреса электронной почты в Gravatar уязвим, пользуясь сервисом, надо это учитывать.
Tags:MD5gravatarбезопасностьэксперимент
Hubs: Information Security
Total votes 15: ↑5 and ↓10-5
Views8.2K

Popular right now