Технологии безопасности

Сайт посвященный вопросам безопасности

Персональные данные пользователей Rozetka.ua в публичном доступе

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

Персональные данные пользователей Rozetka.ua в публичном доступе — 1Персональные данные пользователей Rozetka.ua в публичном доступе — 1

По причинам, которые мне не хочется объяснять, мне потребовалось доставать отзывы о товарах с сайта rozetka.ua. Когда у сайта нет публичного API, то приходится искать более изысканные варианты. Парсинг HTML-кода страниц оставил как крайний вариант и приступил к поиску более оптимальных путей извлечения данных.

Первым делом обнаружил мобильную версию сайта и, как оказалось, она является SPA. Все данные с помощью нехитрого API вытягивались через AJAX-запросы. Доступ есть ко всему, что требуется для получения отзывов:

Cписок категорий:

http://m.rozetka.ua/?action=getJSONDataFromAdapter&m[0]=getOffersSections&p[0]=[‘123’,0,15]

Cписок товаров:

http://m.rozetka.ua/?action=getJSONDataFromAdapter&m[0]=getOffersByParams&p[0]=[‘123’,{},0,15]

Cписок отзывов:

http://m.rozetka.ua/?action=getJSONDataFromAdapter&m[0]=getCommentsByOffer&p[0]=[‘123’,0,15]

Значению p[0], кстати, необходимо было 2 раза сделать URL encoding. Зачем это было сделано — загадка.

Как только я добрался до получения отзывов, моим глазам предстала такая картина:

{
"content": [
{
"result": {
"_0": {
"text": "[ТутБылТекстОтзыва]",
"created": "2015-02-13T17:22:17+02:00",
"user": {
"title": "Вася",
"email": "вася@example.com"
},
"positive_vote_count": "0",
"negative_vote_count": "0",
"rating": "0",
"percent_dignity": "0"
},

"_3": {
"text": "[ТутБылТекстОтзыва]",
"created": "2015-02-09T11:30:44+02:00",
"user": {
"title": "Виктор Викторович",
"email": "виктор@example.com"
},
"positive_vote_count": "1",
"negative_vote_count": "0",
"rating": "0",
"percent_dignity": "100"
}
},
"code": "0"
}
],
"code": 1
}

Как можно увидеть, кроме имени пользователя присутствует и его email. Необходимо упомянуть несколько фактов об отзывах в этом интернет-магазине:

Email для авторизованных пользователей подставляется автоматически;
Без указания email-а нельзя опубликовать отзыв;
Все отзывы проходят модерацию;
Некоторые люди указывают кроме имени ещё и фамилию/отчество.

Итак, мы имеем большую базу данных email-ов с именами, а иногда и с фамилиями, таргетированную по определённым группам товаров. Так как я никогда не имел дел с внутренностями «Розетки», то решил, что этот ответ, возможно, скоро поправят и забыл об этом сайте на месяц.

В феврале этого года «Розетка» выкатила редизайн и я решил проверить состояние уязвимости в мобильной версии. Оказалось, что версия API обновилась до 3-й (видимо, ранее была вторая версия), в которой немного изменили структуру запросов и ответов. Переход на страницу отзывов и открытие инструментов разработчика показало, что email более не приходит в ответе на запрос. Осталось только поле имени. На этом можно было бы остановиться и забыть про этот случай. Но интерес одолел меня и я решил выполнить запрос по старой ссылке. На что браузер мне успешно вернул тот же самый ответ. Старый API не закрыт, уязвимость на месте.

На следующий день было написано письмо разработчикам интернет-магазина. Мне оперативно ответили, подтвердили уязвимость и через несколько часов API второй версии был прикрыт. Насколько я понял, этот API первоначально использовался для внутренних нужд, а когда его вывели на публику, то email остался. После прихода третьей версии, вторая версия продолжала работать.

Как всегда, простейшая невнимательность в нашей профессии может привести к печальным последствиям…