Я изучил исходный код Honey

TThe PrimeTime
Computing/SoftwareAdvertising/MarketingInternet Technology

Transcript

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♪ Кофе из терминала в руке ♪ ♪ Живи в мечте ♪

Key Takeaway

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

Highlights

Автор провёл реверс-инжиниринг минифицированного исходного кода расширения Honey, используя возможности ИИ для анализа

В 2024 году (версия 16) Honey провёл масштабный рефакторинг системы отключения, заменив жёстко прописанные условия на динамическую конфигурацию через JSON

Система избирательно применяет правила отступа в зависимости от баллов пользователя: незалогиненным нужно 65000 баллов, но для LinkShare порог снижается до 5001

Honey использует JavaScript-парсер Acorn и виртуальную машину для выполнения JavaScript внутри JavaScript, обходя ограничения manifest V3

Код содержал явные проверки для блокировки тестовых аккаунтов партнёрских сетей (поиск слова 'test' в email)

Система эволюционировала от простых switch-конструкций (2019) к сложной многоуровневой конфигурации на основе провайдера, магазина и пользователя (2024)

Наличие движка VIM (VIM Instance Manager) позволяет выполнять удалённый код, формально не нарушая правила Google, но создавая глубокую обфускацию

Timeline

Введение: Цели исследования кода Honey

Автор объясняет, почему решил изучить исходный код расширения Honey для Chrome в контексте недавнего скандала. Поскольку это браузерное расширение, весь код доступен для анализа, что позволяет не только проверить обвинения из разоблачительных видео на YouTube, но и отследить эволюцию кода во времени. Ключевой вопрос исследования: были ли сомнительные механизмы случайным техническим долгом или результатом осознанных инженерных решений, которые активно совершенствовались. Автор анонсирует, что покажет трёхминутный отрывок из разоблачительного видео MegaLag о Honey, после чего перейдёт к детальному разбору минифицированного кода и обнаруженных закономерностей.

Демонстрация проблемы: Избирательное применение правил отступа

В этом фрагменте из видео MegaLag демонстрируется ключевая проблема Honey: расширение избирательно применяет политику отступа (stand down policy). При переходе по партнёрской ссылке на Newegg без истории использования Honey корректно отключается, уважая чужую партнёрскую ссылку. Однако эксперимент с двумя браузерами Chrome и разными аккаунтами Honey показывает другую картину: аккаунт без баллов кэшбэка отступает, а аккаунт с накопленными баллами продолжает работать и перехватывает комиссию. Это поведение нарушает отраслевой стандарт 'последнего клика' и политику отступа, которую должны соблюдать партнёрские расширения. Автор подчёркивает, что именно эту логику с проверкой пользовательских баллов он намерен найти и изучить в исходном коде.

Методология исследования и начало анализа

Автор описывает свой подход к исследованию: он получил несколько версий Honey, начиная с февраля 2019 года (версия 11) до текущей версии 1901. Главная цель — не просто найти код проверки баллов пользователя, но и понять, изменялся ли он со временем. Автор проводит аналогию с крупными компаниями, где старый код может годами оставаться нетронутым как технический долг. Используя возможности ИИ, он смог анализировать минифицированный код со скоростью, невиданной за всю его карьеру программиста. Ключевой вопрос: были ли внесены существенные изменения в логику отключения, или это просто мелкие исправления багов. Автор также упоминает, что вынужден использовать доску вместо прямого показа кода из-за DMCA-запросов от юристов PayPal.

Анализ ранней версии (2019): Жёстко прописанная логика

В версии 11 (2019 год) уже существовала логика отключения SSD, которая сопоставлялась с JSON-файлом, содержащим данные о пользовательских баллах (UP), блокировщике рекламы (ADB), статусе логина и других параметрах. Код представлял собой гигантский switch с множеством case-конструкций, включая подозрительную проверку: если email содержит слово 'test', система всегда отключалась — очевидно, чтобы помешать тестовым аккаунтам LinkShare обнаружить мошенническую схему. Логика была жёстко захардкожена: 'если активный провайдер равен LS (LinkShare), применяй эти конкретные правила'. Код перебирал все правила в цикле for и если хоть одно проваливалось, происходило отключение. Автор отмечает, что такой подход типичен для стартапов с одним-двумя провайдерами, но подчёркивает, что будет искать признаки эволюции этой системы.

Эволюция кода: Переход к динамической конфигурации (2024)

Между версиями 11 и 14 (до 2022 года) код практически не менялся, но в версии 16 (2024 год) произошёл серьёзный рефакторинг. Вместо множества if-выражений система стала получать решения через API-эндпоинт Honey, возвращающий структурированный объект с базовыми значениями и специфичными параметрами. Новая архитектура работает так: берётся базовый класс (для незалогиненного пользователя требуется 65000 баллов для отказа от отступа), затем через spread-оператор добавляются параметры провайдера (для LinkShare порог снижается до 5001), и наконец — специфичные для магазина значения из раздела X. Это профессиональный подход к разработке: вынос логики в конфигурацию для упрощения поддержки. Автор подчёркивает, что это не техдолг, а осознанное улучшение сомнительной системы, доказывающее намерение сохранить и развивать эту функциональность.

Обнаружение VIM: JavaScript внутри JavaScript

Автор обнаружил загадочное упоминание VIM, которое оказалось не текстовым редактором, а VIM Instance Manager — полноценным движком JavaScript, работающим внутри JavaScript. Honey использует парсер Acorn для создания AST из валидного JavaScript, затем вычисляет код и передаёт в движок VIM. Код содержит ссылки на 'cart ops retrieval JS' и 'product ops retrieval JS', которые иногда содержат реальный исполняемый JavaScript-код. Хотя автор не смог запустить этот код в отладчике, механизм явно настроен для выполнения удалённого кода на машине пользователя крайне запутанным способом. Помимо виртуальной машины, есть секции с множеством функций в виде строк — встроенный JavaScript для поиска по страницам, который поставляется с продуктом и формально не нарушает старые условия Google для manifest V3.

Обход ограничений manifest V3 и обфускация

Автор объясняет, как Honey обходит требования manifest V3, которые запрещают использование JavaScript eval. Вместо прямого eval они жёстко закодировали некоторые операции и встроили целый движок JavaScript для их выполнения, создавая дополнительный уровень обфускации. Требования V3 запрещают создание интерпретаторов для выполнения сложных команд из удалённого источника, но Honey обходит это, упаковывая команды как строки внутри самого расширения, а не загружая удалённо. Автор предполагает, что это связано с противодействием блокировщикам рекламы, которые могут заблокировать прямые функции Honey, но не ловят код, выполняемый через интерпретатор. Он характеризует это как самую необычную и сложную инженерную конструкцию уровня машины Голдберга, которую видел за всю карьеру, превосходящую даже машины состояний длиной в 10000+ строк. В заключение автор благодарит MegaLag за помощь и рекомендует посмотреть его разоблачительные видео.

Community Posts

View all posts