Informative


Бывают такие баги, которые, вроде как и угрозу безопасности не несут, но вред все-таки могут причинить. Интереснее всего, когда их и править никто не хочет, но и открыто о них нам не говорят. Часто в таких случаях разработчики утверждают, что это не баг, а фича. Именно о двух таких фичах в Тиндере и пойдет речь в посте.


Внимание! Перед тем, как рассказать аудитории Хабра об этих проблемах, мной были предприняты попытки сообщить о них разработчикам через платформу HackerOne. Разработчики посчитали это все “не багами”, а репорты были закрыты в статусе “informative”, дважды!




Случайности не случайны


Если пользоваться Тиндером так, как раньше пользовался я — не регулярно, то можно заметить следующую штуку: если вы давненько не открывали Тиндер, а потом открыли и поставили несколько лайков, вам обязательно прилетит “MATCH!”.


Замечали? Или я один такой? Может это совпадение и всего лишь очередной когнитивный баг моего мозга, а не приложения? Давайте проверим!


Открыв веб-версию сервиса в Burp, посмотрев запросы и несколько раз их повторив, закономерность была найдена. Допустим у вас есть профиль, которому уже поставили сколько-нибудь лайков люди вокруг вас. Когда вы запускаете приложение заново (не из фона), или когда вы меняете настройки вашего поиска (границы возраста или расстояния) приложение выполняет update запрос — GET /v2/recs/core?locale=ru.


Этот запрос возвращает нам список из 30 барышень/молодых людей (на ваш вкус). В этом списке их имена, возраст, описание профиля и конечно же фотки. Именно эти профили и будут нам далее показаны по очереди приложением, но нам интересен лишь один из этих 30 профилей. Профиль №2! Нет, нет, не из-за фотки. Я ее даже еще не открывал. Тут дело в том, что именно человек со второго профиля вас лайкнул.


Алгоритм Тиндера ВСЕГДА ставит человека который вас лайкнул на второе место в ответе на update запрос, если такой человек в ответе сервера есть.
Получается, чтобы получить максимум “MATCH!” на все лайки, нам всего-то нужно:


  1. Сделать Update запрос GET /v2/recs/core?locale=ru
  2. Лайкнуть профиль №2 в списке POST /like/{ SECOND_USER _ID}?locale=ru с параметрами {"s_number":{ID},"liked_content_id":"{SECOND_USER_PHOTO_ID}","liked_content_type":"photo"}
  3. MATCH!
  4. Повторить пункты 1-3 до истощения лайков
  5. PROFIT!

Вы великолепны, у вас куча пар. Когда получите еще лайки, не забудьте повторить.


Возможное решение — генерировать случайную позицию, например от 1 до 7.


Не алгоритм, так фото


Когда вас лайкнули, вам показывают крайне размытое фото профиля этого человека. Мой товарищ VVarlock заметил, что размываются фотки лишь на клиенте, а сервер отдает их в исходном виде, что само по себе уже не хорошо. Фотки можно выводить для сравнения глазами или нейросетью. Я решил копнуть глубже, и сразу стало ясно, что все гораздо проще.


Вот пример ссылки на фото из раздела лайков, я вам его немного замаскировал URL, чтоб не смущать девушку:



А вот пример ее же фото из ответа на Update запрос, о котором мы говорили ранее:



ID фотографии неизменен, по нему строковым поиском и можем мы найти профиль вне зависимости от того на каком месте он стоит.


Использование этой “фичи” также легко автоматизируется:


  1. Запрос с обновлением раздела лайков.
  2. Собираем ID всех фоток профилей.
  3. Update запрос.
  4. Поиск наших ID по списку.
  5. Если нашли, то лайкаем.
  6. Повторяем пункты 3-5, пока не найдем всех девушек.
  7. PROFIT!

Это приносит нам точно такой же профит, как и предыдущий баг.


Возможное решение — генерировать отдельные идентификаторы для фоток “превью” и накладывать “размытие” на сервере.


Резюме


Почему эти фичи плохи для Тиндера? Тиндер живет тем, что мы много лайкаем, гораздо больше, чем лайкают нас. Чтобы видеть свои лайки и отвечать взаимностью только им, нужно покупать Тиндер Голд по подписке 600р в месяц. А с этими фичами он не нужен, что и несет прямой ущерб прибыли компании. Жаль что в самом Тиндере так не посчитали, когда я попытался до них это донести. Может после этого поста хоть закроют?


Для желающих попользоваться — это очень легко автоматизируется, проверено мной на Питоне. Хотя я бы рекомендовал использовать Javascript, чтоб не получать лишних токенов.
Если захотите повторить на Питоне, то обязательно ставьте заголовок “persistent-device-id:” без него сервер не захочет принимать ваши запросы, сгенерировать его можете сами или изменить уже выданный ID сервисом.


Для эксплуатации багов желательно выставить максимальное расстояние и широкие границы по возрасту. Ведь вам показывают лишь тех, кто подходит под ваши параметры. Если вы набрали лайков на Бали, а пытаетесь их превратить в пары в Москве, у вас не получится, ведь этих девушек сервис вам уже не покажет в любом случае. Для подобных экспериментов я советую вам пересоздать профиль с нуля и не менять локацию в пределах 100 км. Баги проверены были в мае, тогда же и отправлены в Тиндер.


P.S. Если кто-то, используя эти баги, найдет свою любовь, отпишитесь мне в личные сообщения — хоть порадуюсь за вас.