Рекомендательная система Retail Rocket: как мы противостояли хакерской атаке конкурента

Генеральный директор Retail Rocket Николай Хлебинский о развитии конфликта с REES46 и мерах, которые предприняли разработчики системы.

Рекомендательная система Retail Rocket: как мы противостояли хакерской атаке конкурента

Хорошо спланированную хакерскую атаку невероятно сложно отразить, а в некоторых случаях даже непросто заметить, что компания находится под ударом. Собрать доказательства и тем более объяснить идею человеку без глубоких знаний в ИТ (например, маркетологу или юристу) — настоящий вызов.

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

Немного предыстории

В марте 2017 года один из наших конкурентов вышел на рынок с очень агрессивным предложением: заплатить 100 тысяч рублей любому интернет-магазину, работающему с Retail Rocket, если по итогам сравнения наших рекомендательных систем платформа конкурента покажет худший результат.

За пять лет существования Retail Rocket нас сравнивали практически со всеми рекомендательными системами, которые есть в России и в мире, и мы всегда показывали классные результаты, но деньги нашим клиентам до этого никто не предлагал.

Рекомендательная система Retail Rocket: как мы противостояли хакерской атаке конкурента

Предложение сопровождалось активной PR-кампанией в социальных сетях и СМИ, а сотрудники конкурента не упускали шанса вставить иронические комментарии в публичных обсуждениях этого предложения.

Такой тест не остался без внимания, и интернет-магазин товаров для детей «Дочки&Сыночки» начал сравнение трех рекомендательных систем: Retail Rocket, REES46 и внутренней системы магазина. Результаты теста нас удивили: платформа Retail Rocket демонстрировала низкие показатели, и настройки интеграции, тюнинг алгоритмов, оптимизация выдачи рекомендаций и прочее не приводили к результату.

Испробовав буквально всё, мы начали искать причины за пределами контура нашей системы и в результате обнаружили очень хитро организованную атаку на A/B-тест рекомендательных систем: тщательно скрытый фрагмент кода, который присылает в браузер пользователя, который вот-вот совершит покупку, изображение в формате PNG.

Изображение побайтово расшифровывается в текст, который скрыто исполняется как JavaScript-код, приписывающий лояльную аудиторию платформе REES46, тем самым увеличивая конверсию этой системы и снижая результаты остальных.

Кто-то потратил немало сил и проявил отличную изобретательность, пока пришел к такой «многоходовочке». Процесс исследования и выявления всех деталей этой атаки (подробно описанный в нашем инженерном блоге на «Хабрахабре») занял несколько недель у команды из восьми человек и, по самым скромным оценкам, стоил нашей компании около 1,5 миллионов рублей.

Рекомендательная система Retail Rocket: как мы противостояли хакерской атаке конкурента

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

Отражение атаки

Когда сомнений в атаке не осталось, мы осознали, что перед нами стоит крайне сложная задача по её отражению. Во-первых, её действительно технически сложно воспроизвести, а значит, сложно доказать сам факт её наличия, и, во-вторых, в таких манипуляциях можно довольно легко и быстро замести следы.

Порядок наших действий был таким:

  1. Консультация с тремя юристами, проработка плана юридической защиты. Первый и самый логичный шаг. К сожалению, пришлось признать, что с точки зрения российского законодательства мы не являемся пострадавшими, и в нашем случае сделать практически ничего нельзя. В Евросоюзе или США, скорее всего, кто-то бы за такое отправился в тюрьму. Тем не менее, мы считаем такие методы конкуренции недопустимыми, это наносит ущерб всему сообществу и подрывает доверие к сложившимся практикам работы, поэтому мы подаем жалобу о недобросовестной конкуренции в ФАС. Очень важно создать прецедент, чтобы не допустить подобной ситуации в будущем.
  2. Встреча с командой интернет-магазина. Мы провели встречу с техническими специалистами и маркетологами магазина, вместе прошли по всем этапам расследования и объяснили, как воспроизвести каждый наш шаг. Очень важно было сделать это до того, как мы опубликуем какие-либо материалы, чтобы все смогли «вживую» увидеть, что происходит.
  3. Сохранение доказательств атаки на независимых внешних сервисах. Вредоносный код и другие следы атаки при обнаружении, как правило, сразу же удаляются. Скриншоты помогут не сильно — их слишком легко подделать и скомпрометировать, поэтому мы использовали сторонние сервисы (Archive.org и Runscope.com), которые по запросу любого желающего самостоятельно сохраняют все детали. Этим сервисам доверяет ИТ-сообщество, и с их помощью мы гарантировали валидность доказательств.
  4. Звонки ИТ-специалистам других компаний нашей отрасли. В технических аспектах этой истории разобраться непросто, поэтому мы решили привлечь специалистов других компаний из нашей отрасли (как партнеров, так и прямых конкурентов, чтобы ни у кого не было сомнения в нашей объективности) и провели ряд звонков с Flocktory, DriveBack, Diginetica, MindBox, AdSpire и другими, в процессе которых показали, как воспроизводится атака.
  5. Публикация расследования в инженерном блоге на «Хабрахабре». Мы специально заложили в материал максимальное количество технических деталей: нам было важно, что ИТ-сообщество как следует разберется во всем и поддержит нас. Реакция превзошла наши ожидания: публикация быстро стала самой популярной за сутки, а затем и за неделю. Рейтинг публикации превышает суммарный рейтинг всех остальных публикаций в инженерном блоге Retail Rocket — это отличный индикатор того, что у «технарей» не осталось сомнений в нашей правоте.

Разоблачение

Конечно же, мы не ожидали, что после разоблачения конкурент выйдет с поднятыми руками и напишет чистосердечное признание. Вот как развивались события в день публикации расследования:

  • В 12:08 мы публикуем материал и размещаем его в соцсетях. Он начинает очень быстро распространяться. Такие истории всплывают нечасто, поэтому вскоре об этом узнала почти вся отрасль.
  • Через восемь минут после публикации REES46 удаляет из публичного доступа часть функциональности, манипулирующей тестом (то самое изображение в формате PNG).
  • Еще через несколько часов REES46 публикует официальный ответ, смысл которого сводится к тому, что часть вредоносного кода, на который мы ссылаемся в расследовании, ничего плохого не делает (цитата: «приведенный в пример кусок кода из V3 отвечает за отслеживание смены куки по разным городам»). А факт того, что этот код зашифрован и максимально скрыт от всех участников теста, объясняется тем, что «JavaScript вообще подозрительный язык». А ответ на то, что изображение, из которого побайтово извлекался код перемещения пользователей в сегмент REES46, стал недоступен после публикации — «да, недоступен, и что теперь?».
  • К диалогу подключаются представители компаний, которые наблюдали за атакой со стороны до того, как мы опубликовали материал с расследованием.
Рекомендательная система Retail Rocket: как мы противостояли хакерской атаке конкурента
Рекомендательная система Retail Rocket: как мы противостояли хакерской атаке конкурента

Контрнаступление REES46

Когда становится понятно, что просто отойти от этой истории не выйдет, REES46 меняет позицию на контратакующую: теперь они представляют Retail Rocket как виновников перемещения пользователей между сегментами, а подозрительный код, созданный в начале мая (как раз когда мы увидели первые признаки манипуляции и начали отслеживать смены сегментов, этот же период указан в материалах расследования), представляют инструментом корректировки ошибки.

Рекомендательная система Retail Rocket: как мы противостояли хакерской атаке конкурента

Однако этот ответ не выдерживает никакой критики. Во-первых, код Retail Rocket никак не влияет на сегментацию аудитории, и это станет очевидно любому, кто внимательно посмотрит на код сегментации (ветка на «Хабре», где идет обсуждение по этому вопросу).

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

В-третьих, если бы код действительно «восстанавливал» тех, у кого стерлись куки или сработал AdBlock, то количество пользователей, перемещаемых в сегмент REES46, примерно совпадало бы с количеством пользователей, попадающих в другие сегменты, но это не так: по данным Google Analytics, в сторону REES46 уходит в десятки раз больше трафика.

Данные из Google Analytics интернет-магазина «Дочки&Сыночки»
Данные из Google Analytics интернет-магазина «Дочки&Сыночки»

Если бы это было случайностью, конверсия перемещаемых пользователей не была бы в разы выше средней конверсии по сайту, а примерно совпадала бы с ней. Здесь очевидна манипуляция, которую отмечают и в профессиональном сообществе:

Игорь Гусев, генеральный директор La Redoute
Игорь Гусев, генеральный директор La Redoute

Похоже, что в REES46 просто не знали про фичу «Последовательности» в инструменте сегментации Google Analytics — она позволяет отследить изменение параметров пользователя, а не только последнее записанное значение.

И это не говоря о том, что код перемещения пользователей написан так, чтобы он не работал для пользователей из Москвы. Почему их не нужно было «возвращать», осталось загадкой. Уж не потому ли, что в Москве находились ИТ-специалисты всех участников теста?

Больше всего удивил сам факт использования скрытого перемещения пользователей в свою сторону: выглядит это, мягко говоря, нелогично.

Рекомендательная система Retail Rocket: как мы противостояли хакерской атаке конкурента

Реакция профессионального сообщества

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

Рекомендательная система Retail Rocket: как мы противостояли хакерской атаке конкурента
Константин Боярдин, Ozon.ru
Константин Боярдин, Ozon.ru
Алексей Ручкин, директор по электронной коммерции «Адамас»
Алексей Ручкин, директор по электронной коммерции «Адамас»
Николай Андрейчук, MindBox
Николай Андрейчук, MindBox

Выводы

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

В подобных ситуациях обязательно нужно вести активную работу в правовом поле и сделать всё, чтобы виновные понесли наказание, но в нашем случае это оказалось практически невозможным.

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

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

Примечание vc.ru: генеральный директор центра управления конверсией REES46 Михаил Кечинов прислал в редакцию статью со своим взглядом на скандал вокруг тестирования рекомендательных систем.

1717
8 комментариев

Более всего в этой истории интересны дальнейшая судьба REES46 и конкретно Михаила. От репутации тут ноль остался, но как наш ecom все это переварит, вопрос интересный.

12

Есть проблема в этой истории, вопрос

Кража сессий стала возможна только потому, что для каждого посетителя независимо от его сегмента (RR, REES, родной) исполнялись все три кода всех систем

Это же очевидно, что после сегментации должен исполняться только один код - тогда не нужно будет ни за чем следить

Но сегментатор, как сказано на Хабре - был разработки RR, и это дыра

Вот сейчас REES типа воспользовались этой дырой, и их RR типа поймал, ок

Но почему в сегментаторе была такая очевидная дыра и кто даст зуб, что RR в аналогичных случаях не пользовались ей в своих интересах?
(представитель REES говорил, что в коде RR тоже много eval-ов, так это дурной тон по любому, но вроде бы пока не привел примера использования во зло)

3

Комментарий удалён модератором

Отложил почитать себе обе статьи. Приехал с выходных, открыл. Думал тут срач. Но нет. Теперь и читать неинтересно :) Но попробую осилить.

2

а какие цифры конверсий по факту ABC-теста без этого кода получились?

Думаю магазин "дочки-сыночки" теперь откажется от рекомендательных систем полностью

И Это только начало. Смысл передавать свои метки в другие системы с точки зрения продаж- работа в минус.