00:00:00(стук клавиш) Я хотел разобраться в этом громком скандале с Honey.
00:00:12Если вы не знакомы с Honey,
00:00:14это одно из тех расширений для Chrome с купонами,
00:00:17а значит,
00:00:17весь его код доступен для моего изучения.
00:00:19Поэтому я могу проверить то,
00:00:21о чём говорится в этих видео на YouTube,
00:00:23и убедиться — действительно ли это происходит?
00:00:26Но что важнее в случае с расширениями — я могу отследить изменения во времени и понять,
00:00:32принимались ли эти сомнительные решения,
00:00:35а также вносили ли инженеры правки,
00:00:37чтобы не только продолжать,
00:00:39но и совершенствовать эти недобросовестные механизмы?
00:00:44Да, именно так они и поступали.
00:00:45И я покажу вам, как это происходило.
00:00:47Но я понимаю,
00:00:47что многие из вас,
00:00:48вероятно,
00:00:48не в курсе,
00:00:49что происходит.
00:00:50Вы даже толком не знакомы с Honey.
00:00:52И поэтому вы никогда особо не вникали.
00:00:55На самом деле речь идёт об очень специфичной операции Honey,
00:00:58которую я хочу разобрать.
00:00:59Мы сейчас посмотрим трёхминутный отрывок из последнего разоблачительного видео о Honey.
00:01:05А затем я расскажу о том,
00:01:06как изучал минифицированный код,
00:01:08что именно обнаружил и какой был замысел — что,
00:01:10надо сказать,
00:01:11довольно удивительно.
00:01:12Если есть что-то,
00:01:13что люди ненавидят больше обмана,
00:01:14так это воровство.
00:01:15И в своём первом видео я показал,
00:01:17как Honey крадёт деньги у инфлюенсеров.
00:01:19Но я не сказал,
00:01:20что такое поведение в большинстве случаев строго запрещено.
00:01:25Видите ли,
00:01:25компании,
00:01:26управляющие этой индустрией — партнёрские сети — прекрасно знают,
00:01:29что расширения с купонами вроде Honey с высокой вероятностью перехватывают комиссии у инфлюенсеров,
00:01:34блогеров и других партнёров,
00:01:36создающих контент.
00:01:37Что ещё важнее — они также понимают,
00:01:39что это нечестно,
00:01:40особенно в рамках политики «побеждает последний клик»,
00:01:43которая остаётся отраслевым стандартом.
00:01:46Поэтому,
00:01:47чтобы предотвратить подобное воровство комиссий,
00:01:49большинство крупных партнёрских сетей применяют так называемую политику отступа (stand down policy).
00:01:53Покажу, как это выглядит в Honey.
00:01:55Давайте сначала зайдём на newegg.com без партнёрской ссылки.
00:01:58И как видите, Honey сразу же всплывает, предлагая кэшбэк.
00:02:02Но если повторить это снова,
00:02:03на этот раз используя мою партнёрскую ссылку для Newegg,
00:02:06вы заметите,
00:02:06что Honey вообще не появляется.
00:02:08А если кликнуть на иконку Honey,
00:02:10видно,
00:02:10что Honey теперь отключён.
00:02:12Вот как Honey должен вести себя,
00:02:14когда пользователь уже кликнул по чужой партнёрской ссылке.
00:02:17Так в чём же тогда заключается предполагаемое мошенничество,
00:02:19спросите вы?
00:02:20Ну,
00:02:20как выяснилось,
00:02:21в Honey всегда была встроена система отступа,
00:02:24но они выборочно решали,
00:02:26когда и к кому применять эти правила.
00:02:28Проверим мою партнёрскую ссылку для Newegg снова.
00:02:31Только на этот раз у меня одновременно открыты два совершенно разных браузера Chrome,
00:02:36и в каждом выполнен вход в разные аккаунты Honey.
00:02:38В аккаунте Honey слева ноль баллов кэшбэка,
00:02:42а в аккаунте справа накоплены баллы кэшбэка.
00:02:45Что же произойдёт,
00:02:46если открыть партнёрскую ссылку Newegg в обоих браузерах?
00:02:49Аккаунт Honey слева отступает, как и в первый раз.
00:02:52Но посмотрите — аккаунт справа,
00:02:54в котором есть баллы кэшбэка,
00:02:57не отступил.
00:02:58Почему же так происходит?
00:02:59Вот это я и хотел проверить.
00:03:01Я хотел разобраться, потому что это код.
00:03:03Я понимаю код.
00:03:05Я могу посмотреть на приходящий JSON и разобраться в нём.
00:03:09Мало того,
00:03:09возможности ИИ позволят мне искать в минифицированном коде со скоростью,
00:03:15невиданной за всю мою карьеру программиста.
00:03:18Итак, мы сначала получили несколько версий Honey.
00:03:22Я начал изучать их примерно с февраля 2019 года и вплоть до сегодняшнего дня,
00:03:28версия 1901.
00:03:29И с этим я хотел разобраться: во-первых,
00:03:31существует ли вообще эта логика с баллами пользователя,
00:03:35определяющая,
00:03:35когда показывать меню отступа,
00:03:37а когда нет?
00:03:38Да, она действительно существует.
00:03:40Но настоящий вопрос был — изменялась ли она?
00:03:43Потому что я работал в крупной компании, верно?
00:03:45Вы тоже работали в большой компании,
00:03:47я уверен,
00:03:47или кто-то из вас работал,
00:03:48и вы знаете,
00:03:49что иногда код просто остаётся висеть..
00:03:50Знаете,
00:03:51типа «ой-ой-ой»,
00:03:52а он всё ещё там,
00:03:53никто не трогал его пять лет — так оно и есть.
00:03:55Вот это меня и интересовало: остался ли код нетронутым?
00:04:00Или были внесены существенные изменения?
00:04:03Не какие-нибудь мелкие исправления багов.
00:04:05Ладно,
00:04:05чтобы не нарваться на копирайт,
00:04:07потому что юристы PayPal,
00:04:09оказывается,
00:04:10шлют DMCA всем,
00:04:11кто реально показывает код.
00:04:13Так что мне приходится устраивать этот странный театр у старой доски,
00:04:16чтобы показать вам,
00:04:17что происходило.
00:04:18Итак,
00:04:19начиная с версии 11 — помните,
00:04:21это примерно 2019 год — в этой версии уже была логика отключения.
00:04:25В ней даже были вещи,
00:04:26которые назывались логикой отключения SSD.
00:04:29Она сопоставлялась с JSON-файлом,
00:04:30который приходил с кучей данных.
00:04:32Вот моё отключение пользователя,
00:04:34который вообще не залогинен — самая базовая штука.
00:04:38Здесь видно, что UP — это пользовательские баллы.
00:04:41ADB — это что-то вроде «блокировщик рекламы,
00:04:43время последнего использования».
00:04:45Ещё есть «аккаунт залогинен».
00:04:47И есть другие поля, которые время от времени всплывают.
00:04:50Что интересно: в 2019 году,
00:04:52в версии 11,
00:04:52всё часто выглядело вот так.
00:04:55Там был гигантский switch с кейсами типа: «окей,
00:05:00проверяем email?»
00:05:02И да, там буквально была строка.
00:05:04Содержит ли этот email слово «test»?
00:05:06Тогда всегда отключай — что, кстати, подозрительно.
00:05:10Это было сделано,
00:05:11чтобы не пускать тестовые аккаунты LinkShare и не дать им проверить,
00:05:14работает ли всё это на самом деле.
00:05:16Потому что,
00:05:17будем честны,
00:05:17у кого из вас не было тестового аккаунта без слова «test»?
00:05:20У меня точно был.
00:05:22Но так или иначе, вот это была явная проверка.
00:05:24Если в вашем email где-то есть слово «test», вас отключат.
00:05:29Но ещё больше — хотя об этом уже говорили — ещё больше сбивало с толку то,
00:05:34что код проходил серию проверок типа: «Эй,
00:05:37активный провайдер равен LS,
00:05:39то есть LinkShare?»
00:05:41Если да, то применяй вот эти конкретные правила.
00:05:44А дальше была проверка: код перебирал все выявленные правила и в небольшом цикле for проходил по каждому,
00:05:52проверяя: «Хоть одно из них провалилось?»
00:05:55Если хоть одно — отключение.
00:05:57Так что это был довольно жёстко захардкоженный процесс,
00:06:01как видите,
00:06:01потому что там буквально была строка: «Если LinkShare — делай это действие».
00:06:06«Если другой провайдер — делай что-то ещё».
00:06:08Ну,
00:06:09я,
00:06:09конечно,
00:06:09был на множестве проектов,
00:06:11где такое просто случается.
00:06:12Это абсолютно нормально.
00:06:14Начинаешь с мысли: «Окей,
00:06:15у нас,
00:06:16может,
00:06:16один-два провайдера,
00:06:18и всё».
00:06:18«Так что я просто впишу пару захардкоженных крайних случаев,
00:06:21и пусть всё обрабатывается определённым образом».
00:06:24Мы отключаем на какое-то время,
00:06:25которое,
00:06:26кстати,
00:06:26было не очень долгим.
00:06:27Вам стоит посмотреть видео MegaLag,
00:06:30чтобы узнать,
00:06:30насколько ужасными были эти правила на самом деле.
00:06:34Но повторюсь,
00:06:35моя цель — понять: вносили ли они изменения в код,
00:06:37были ли это исправления багов?
00:06:39Что произошло?
00:06:40Вот тут начинается путаница,
00:06:42потому что между версиями 11 и 14 — а это,
00:06:45если не ошибаюсь,
00:06:46вплоть до 2022 года — да,
00:06:48до 2022-го,
00:06:49всё оставалось практически неизменным.
00:06:52Ничего особо не менялось,
00:06:53немного правок,
00:06:54но ничего значительного.
00:06:56Но где-то в версии 16,
00:06:58то есть в 2024 году,
00:06:59был сделан серьёзный рефакторинг,
00:07:02чтобы многие решения принимались через эндпоинт в Honey.
00:07:07Этот эндпоинт отдаёт объект,
00:07:09который выглядит вот так: с базовым значением,
00:07:12потом с этими значениями,
00:07:14а затем с этими значениями под X.
00:07:16То есть в предыдущей версии использовалась куча if-выражений для определения типа поведения.
00:07:23А затем происходила оценка правила,
00:07:25чтобы понять: оно действительно сработало?
00:07:28Получили ли мы на выходе true или false?
00:07:30Но в версии 16 они решили подойти к вопросу разработки более серьёзно.
00:07:36Все мы знаем: что делать,
00:07:38когда у тебя куча условий if,
00:07:40которые оборачивают данные и выполняют базовые изменения объекта?
00:07:45Правильно — выносишь это в конфигурацию.
00:07:48Делаешь что-то более динамичное, чтобы облегчить поддержку.
00:07:52Именно это они и сделали.
00:07:53Если вернуться сюда и посмотреть на данные,
00:07:55которые приходят мне — незалогиненному пользователю Honey — вы увидите,
00:07:59что здесь есть базовый класс.
00:08:00Этот базовый класс становится основой для принятия решений в Honey.
00:08:05Сейчас для этого незалогиненного пользователя с базовым классом требуется 65 000 пользовательских баллов,
00:08:12чтобы Honey не отступил.
00:08:13Если у меня меньше 65 000 баллов — а помните,
00:08:15я не залогинен,
00:08:16так что у меня ноль баллов — система скажет: извините,
00:08:18я отступаю.
00:08:18Я избегаю этого.
00:08:20Теперь,
00:08:20когда система получает эту базу,
00:08:23она проверяет: как мы сюда попали?
00:08:25Откуда мы здесь?
00:08:27Почему мы здесь?
00:08:28И она выполняет следующую проверку: пришло ли это из одной из партнёрских сетей?
00:08:32И затем начинается наслоение параметров.
00:08:33То есть,
00:08:33если я пришёл по ссылке из Link Share,
00:08:36теперь требуемое количество баллов изменится всего до 5001.
00:08:40Система редактирует этот базовый объект.
00:08:41Это уже более качественная, продуманная разработка.
00:08:44Больше никаких жёстко прописанных условий if.
00:08:48Вместо этого используется подход: берём базу,
00:08:51затем спрашиваем: есть ли у меня провайдер?
00:08:55Если провайдер есть,
00:08:56я хочу добавить его значения через spread,
00:08:59или просто пустой объект.
00:09:01А потом они сделали ещё кое-что удивительное: все эти значения здесь,
00:09:06под X —
00:09:07это специфичные для магазина параметры.
00:09:09Затем система проверяет: в каком магазине я нахожусь сейчас,
00:09:14и добавляет также его значения.
00:09:17А потом выполняется базовая логика правил,
00:09:19показывающая,
00:09:20что система больше не в режиме какого-то обслуживания.
00:09:23Что это уже не жёстко прописанный костыль,
00:09:27существующий десятилетие.
00:09:29Вместо этого они перешли от того,
00:09:31что было, и в 2024 году сказали: знаете что?
00:09:33Нам нужно сделать систему более надёжной,
00:09:36чтобы принимать решения о большем количестве магазинов и провайдеров в более удобной для поддержки форме.
00:09:43Это была настоящая программная инженерия,
00:09:45друзья,
00:09:45и они справились.
00:09:46Когда я смотрю на это,
00:09:47я вижу,
00:09:48что со временем они вносили изменения,
00:09:50чтобы улучшить свою систему,
00:09:52а это значит,
00:09:52что за этим стоит намерение.
00:09:54Они хотят сохранить то,
00:09:55что делает система — является ли это мошенничеством или нет.
00:09:59Я не могу этого утверждать,
00:10:00это должны решить другие,
00:10:01но я могу сказать,
00:10:02что их решения были направлены на то,
00:10:04чтобы сделать систему более надёжной и лучше.
00:10:07И учитывая,
00:10:08что общее восприятие этой системы достаточно сомнительное,
00:10:12они сделали свою сомнительную систему намного,
00:10:15намного лучше.
00:10:16Но это ещё не всё, что я нашёл.
00:10:17Я обнаружил кое-что ещё, что привлекло моё внимание.
00:10:19Я постоянно натыкался на слово VIM.
00:10:23И я думал: VIM, при чём тут текстовый редактор?
00:10:26Когда я спросил Claude об этом,
00:10:28он ответил: ты говоришь про VIM Instance Manager,
00:10:32который найден внутри Honey?
00:10:34И я такой: VIM Instance Manager.
00:10:35Ладно, не может быть.
00:10:37Это точно не то.
00:10:38И когда я начал копать глубже,
00:10:41я обнаружил,
00:10:42что внутри плагина Honey работает целый движок JavaScript в JavaScript.
00:10:49Это,
00:10:50пожалуй,
00:10:50самая странная вещь,
00:10:52которую я когда-либо видел.
00:10:54Я попытался почитать об этом.
00:10:56Я не эксперт в разработке плагинов для Chrome.
00:10:59Поэтому понятия не имел,
00:11:01зачем вообще кому-то запускать JavaScript внутри JavaScript.
00:11:05Но Honey использует Acorn — это парсер JavaScript,
00:11:10который создаёт AST из валидного JavaScript.
00:11:14Он берёт это,
00:11:15вычисляет JavaScript,
00:11:17а затем передаёт в этот движок VIM.
00:11:19В коде есть несколько ссылок,
00:11:21которые фактически указывают на другой объект под названием cart ops retrieval JS и product ops retrieval JS,
00:11:28который иногда не равен null и действительно содержит код.
00:11:31И он также ссылается на этот JS-код,
00:11:33который тоже иногда не равен null,
00:11:35как вот здесь — это настоящий JavaScript.
00:11:38Но насколько я мог понять,
00:11:39он на самом деле не выполняет никакой из этого кода.
00:11:41Я пытался установить несколько точек останова.
00:11:42Я так и не дошёл до того,
00:11:44чтобы создать триггер,
00:11:45но тем не менее это существует.
00:11:47У них настроен механизм,
00:11:49позволяющий выполнять удалённый код на вашей машине на основе того,
00:11:53что возвращает Honey,
00:11:54причём крайне запутанным способом.
00:11:57JavaScript в JavaScript — у них есть парсер JavaScript.
00:12:00У них есть виртуальная машина JavaScript.
00:12:03Это настоящий JavaScript внутри JavaScript.
00:12:06Но есть также один раздел,
00:12:08где просто куча функций в виде строк.
00:12:11И там множество встроенного JavaScript,
00:12:14полного способов поиска по страницам и тому подобного.
00:12:18Но эти поставляются вместе с продуктом.
00:12:22Так что технически они не нарушают старые условия использования Google.
00:12:26Потому что если посмотреть на дополнительные требования для manifest V3 для тех,
00:12:30кто этим занимается,
00:12:31вам не разрешается использовать JavaScript eval.
00:12:33Хорошо, значит мы этого делать не будем.
00:12:34Мы не будем использовать eval.
00:12:35Вместо этого мы жёстко закодируем некоторые операции,
00:12:38о которых не хотим,
00:12:39чтобы другие плагины знали.
00:12:40А затем встроим целый движок JavaScript для их выполнения,
00:12:44чтобы ещё больше запутать то,
00:12:46что мы делаем.
00:12:47Забавно,
00:12:48потому что этот V3 как будто был создан специально для Honey,
00:12:51ведь там говорится: создание интерпретатора для выполнения сложных команд,
00:12:55полученных из удалённого источника,
00:12:56даже если эти команды получены как данные.
00:12:59Так они обходят это.
00:13:00Это не удалённые элементы.
00:13:01Это строки,
00:13:02которые фактически доступны внутри расширения Honey.
00:13:05Но, чувак, это же настоящая обфускация.
00:13:07Это какая-то странная штука.
00:13:09Я лично не могу понять ни одной причины,
00:13:12почему это вообще происходит.
00:13:14Как я уже сказал,
00:13:14видимо,
00:13:15это связано с взаимодействием с другими расширениями,
00:13:17а именно блокировщиками рекламы.
00:13:19Похоже,
00:13:19блокировщики рекламы могут заблокировать расширение Honey,
00:13:22если оно напрямую выполняет определённые функции,
00:13:25но почему-то через этот странный интерпретатор оно способно выполнять код так,
00:13:30что его не ловят.
00:13:31Не знаю, но для меня это выглядит как полный бардак.
00:13:34И мне это показалось очень,
00:13:35очень интересным,
00:13:35потому что я никогда не занимался реверс-инжинирингом.
00:13:37Я никогда по-настоящему не копался в чужом исходном коде,
00:13:40особенно минифицированном.
00:13:41Я просто хотел показать вам это.
00:13:42Это,
00:13:43пожалуй,
00:13:43самая необычная инженерия,
00:13:44которую я видел за всю жизнь.
00:13:46Я работал с кодовыми базами,
00:13:48где были машины состояний длиной 10 с лишним тысяч строк,
00:13:52с которыми невозможно работать и трудно разобраться,
00:13:55но это превосходит всё.
00:13:57Это самая сложная,
00:13:58самая странная конструкция уровня машины Голдберга,
00:14:01которую я когда-либо видел.
00:14:03Но кроме того,
00:14:04динамические правила для отключения функций — они продуманы.
00:14:08Какова бы ни была цель,
00:14:09мошенническая или нет,
00:14:10система спроектирована так,
00:14:12чтобы быть динамической и управляться через JSON на уровне каждого магазина,
00:14:17каждого поставщика и каждого пользователя.
00:14:19Но в любом случае, особая благодарность Magalega.
00:14:21Это было действительно классно.
00:14:22Я пообщался с ним.
00:14:23Он немного помог мне в изучении некоторых вещей.
00:14:25Большая благодарность ему.
00:14:26Вам обязательно стоит посмотреть видео.
00:14:27Оно в описании.
00:14:28Оно очень качественно сделано.
00:14:29Их несколько, и я рекомендую посмотреть все.
00:14:32Они очень, очень хороши.
00:14:33Кстати, вам нравится то, что я сделал?
00:14:35Вам нравится такой формат?
00:14:36Не знаю.
00:14:37Для меня это что-то новенькое.
00:14:38Я просто провёл время в стриме,
00:14:40развлёкся,
00:14:40а потом рассказал вам.
00:14:42Если бы вы были на стриме, то увидели бы это вживую.
00:14:44Вам могло бы быть гораздо веселее.
00:14:45Называется: я не реверс-инженер, но это было очень весело.
00:14:50Теперь понимаю, почему люди этим занимаются.
00:14:51Легенда.
00:14:52Эй, это что, HTTP?
00:14:55Убери это отсюда.
00:14:56Не так мы заказываем кофе.
00:14:57Мы заказываем кофе через SSH, terminal.shop.
00:15:00Да, хочешь настоящих впечатлений?
00:15:02Хочешь настоящий кофе?
00:15:03Хочешь крутую подписку, чтобы больше никогда не забывать?
00:15:06О,
00:15:07хочешь эксклюзивные сорта с эксклюзивным кофе и эксклюзивным контентом?
00:15:12Тогда посмотри CRON.
00:15:13Не знаешь, что такое SSH?
00:15:14Ну, возможно, кофе не для тебя.
00:15:18♪ Кофе из терминала в руке ♪ ♪ Живи в мечте ♪