00:00:00(clavier qui clique) Je voulais donc jeter un œil à cet énorme scandale Honey qui fait rage.
00:00:12Si vous n'êtes pas familier avec Honey,
00:00:14Honey est l'une de ces extensions Chrome de coupons,
00:00:16ce qui signifie que tout son code est accessible pour que je puisse l'examiner.
00:00:19Je peux donc examiner les accusations formulées dans ces vidéos YouTube et vérifier concrètement si c'est réellement le cas.
00:00:26Mais surtout,
00:00:27avec les extensions,
00:00:28je peux analyser l'évolution dans le temps et voir si ces mauvaises décisions ont été prises et si des ingénieurs logiciels ont apporté des modifications non seulement pour continuer,
00:00:38mais aussi pour rendre ces comportements douteux encore plus performants et robustes.
00:00:44Oui, c'est exactement ce qu'ils ont fait.
00:00:45Et je vais vous montrer comment c'est arrivé.
00:00:47Mais je sais qu'il y en a beaucoup parmi vous qui n'ont probablement aucune idée de ce qui se passe.
00:00:50Vous ne connaissez même pas vraiment Honey.
00:00:52Et donc vous n'avez jamais vraiment suivi l'affaire.
00:00:55Cela concerne en fait une opération très spécifique de Honey que je veux détailler.
00:00:59Nous allons donc regarder un extrait de trois minutes de cette dernière vidéo révélant Honey.
00:01:05Ensuite,
00:01:05je vais parler de mon analyse du code minifié et de ce que j'ai découvert exactement ainsi que de l'intention derrière,
00:01:11ce qui est assez surprenant.
00:01:12S'il y a bien une chose que les gens détestent plus que la tromperie,
00:01:15c'est le vol.
00:01:15Dans ma première vidéo,
00:01:16je vous ai montré comment Honey volait de l'argent aux influenceurs.
00:01:19Mais ce que je ne vous ai pas dit,
00:01:21c'est que ce comportement est dans la plupart des cas strictement interdit.
00:01:25Voyez-vous,
00:01:25les entreprises qui dirigent ce secteur,
00:01:27les réseaux d'affiliation,
00:01:28savent parfaitement que les extensions de coupons comme Honey ont une forte probabilité de détourner les commissions des influenceurs,
00:01:34blogueurs et autres affiliés axés sur le contenu.
00:01:37Plus important encore,
00:01:38ils comprennent également que ce n'est pas juste,
00:01:41surtout sous la politique du dernier clic gagnant,
00:01:44qui est restée une norme de l'industrie.
00:01:46Pour éviter ce type de vol de commission,
00:01:48la plupart des grands réseaux d'affiliation appliquent ce qu'on appelle une politique de retrait.
00:01:53Laissez-moi vous montrer à quoi cela ressemble sur Honey.
00:01:55Visitons d'abord newegg.com sans lien d'affiliation.
00:01:58Et comme vous pouvez le voir,
00:02:00Honey apparaît immédiatement en proposant du cashback.
00:02:02Mais si nous recommençons,
00:02:03cette fois en utilisant mon lien d'affiliation pour Newegg,
00:02:06vous remarquerez que Honey n'apparaît pas du tout.
00:02:08Et si nous cliquons sur l'icône Honey,
00:02:10vous pouvez constater que Honey est maintenant désactivé.
00:02:12Voilà donc comment Honey est censé se comporter quand un utilisateur a déjà cliqué sur le lien d'affiliation de quelqu'un d'autre.
00:02:17Où se situe alors la fraude présumée, demandez-vous ?
00:02:20Eh bien,
00:02:20il s'avère que Honey a toujours eu un système de retrait intégré dans son application,
00:02:25mais ils ont choisi de manière sélective quand et à qui appliquer les règles.
00:02:28Testons à nouveau mon lien d'affiliation pour Newegg.
00:02:31Sauf que cette fois,
00:02:32j'ai deux navigateurs Chrome entièrement séparés ouverts en même temps,
00:02:36et chacun est connecté à un compte Honey différent.
00:02:38Le compte Honey de gauche a zéro point de cashback,
00:02:41tandis que le compte Honey de droite a accumulé des points de cashback.
00:02:45Maintenant,
00:02:45que se passe-t-il lorsque j'ouvre le lien d'affiliation Newegg sur les deux navigateurs ?
00:02:49Le compte Honey de gauche se retire comme la première fois.
00:02:52Mais regardez ça,
00:02:53le compte de droite,
00:02:54qui a des points de cashback,
00:02:56ne s'est pas retiré.
00:02:58Alors pourquoi donc ?
00:02:59C'est donc ce que je voulais tester.
00:03:01Je voulais analyser ça parce que c'est du code.
00:03:03Je peux comprendre le code.
00:03:05Je peux examiner le JSON qui est téléchargé et je peux le comprendre.
00:03:09En plus de ça,
00:03:09la puissance de l'IA va me permettre de parcourir du code minifié à des vitesses que je n'aurais jamais connues tout au long de mon univers de programmation.
00:03:18Nous avons donc d'abord récupéré plusieurs versions de Honey.
00:03:22Celles que j'ai examinées commencent environ en février 2019,
00:03:26jusqu'à aujourd'hui,
00:03:281901.
00:03:29Avec ça,
00:03:29ce que je voulais faire,
00:03:30c'était me demander,
00:03:31d'abord,
00:03:32est-ce que ce truc de points utilisateur qui décide quand afficher ou non le menu de retrait,
00:03:37est-ce qu'il existe ?
00:03:38Oui, il existe bel et bien.
00:03:40Mais la vraie question était : est-ce qu'il avait changé ?
00:03:43Parce que j'ai travaillé dans une grande entreprise,
00:03:45j'ai travaillé dans une grande boîte,
00:03:46d'accord,
00:03:46vous avez travaillé dans une grande boîte,
00:03:48j'en suis sûr,
00:03:48ou certains d'entre vous l'ont fait,
00:03:49et vous savez que parfois le code reste juste là.
00:03:50Vous savez,
00:03:51c'est genre oups,
00:03:52c'est encore là,
00:03:53personne n'y a touché depuis cinq ans,
00:03:55c'est comme ça.
00:03:55Et c'est en quelque sorte ce que je cherchais,
00:03:57c'est-à-dire,
00:03:58est-ce que le code est resté en place ?
00:04:00Ou est-ce qu'il y a eu des changements significatifs ?
00:04:03Pas des petites corrections de bugs.
00:04:05Bon,
00:04:05pour éviter d'être poursuivi pour droits d'auteur,
00:04:08parce qu'apparemment les avocats de PayPal vont envoyer un DMCA à quiconque montre le code.
00:04:13Ça veut dire que je dois faire cette étrange chorégraphie au tableau noir pour vous montrer ce qui se passait.
00:04:18Donc à partir de la version 11,
00:04:20rappelez-vous,
00:04:21qui date d'environ 2019,
00:04:22cette version avait bien la logique de désactivation.
00:04:25Elle avait même des éléments appelés logiques de désactivation SSD.
00:04:29Elle correspondait au fichier JSON qui arrive avec plein de données.
00:04:32Voici ma désactivation d'un utilisateur qui n'est même pas connecté,
00:04:36les trucs les plus basiques.
00:04:38Ici, vous pouvez voir que UP signifie points utilisateur.
00:04:41ADB, c'est genre bloqueur de pub dernière utilisation.
00:04:45Il y a aussi « le compte est-il connecté ».
00:04:47Et il y a d'autres champs qui apparaissent de temps en temps.
00:04:50Donc ce qui est intéressant,
00:04:51c'est qu'en 2019 dans la version 11,
00:04:53les choses ressemblaient souvent à ça.
00:04:55Il y a genre une énorme instruction switch qui finissait par avoir ces cas où c'est juste,
00:05:00ok,
00:05:00hé,
00:05:01est-ce qu'on teste un email ?
00:05:02Et oui, il y avait littéralement une chaîne de caractères.
00:05:04Est-ce que cet email contient « test » ?
00:05:06Alors toujours désactiver, ce qui au passage, c'est louche.
00:05:10Ça évite que ces comptes de test de liens arrivent et soient comme « partage de lien test » pour voir si ça marche vraiment.
00:05:16Parce que soyons honnêtes,
00:05:17qui ici n'a pas eu un compte testeur qui ne contient pas le mot test ?
00:05:20Moi certainement.
00:05:22Mais néanmoins, ceci était une vérification explicite.
00:05:24Si vous avez le mot test n'importe où dans votre email,
00:05:28ça vous désactive.
00:05:29Mais en plus de ça,
00:05:30je veux dire,
00:05:30on en a déjà parlé,
00:05:31mais en plus les trucs qui étaient vraiment déroutants c'est qu'il passait par une série de vérifications et disait genre,
00:05:37hé,
00:05:37est-ce que le fournisseur actuellement actif est égal à LS,
00:05:40qui est link share ?
00:05:41Si c'est le cas,
00:05:42je veux que tu appliques exactement ces règles.
00:05:44Et puis plus tard,
00:05:45il avait cette vérification où il passait en revue toutes les règles qu'il avait trouvées,
00:05:49et ensuite il allait une par une dans une petite boucle for en parcourant chacune de ces règles et en vérifiant,
00:05:53est-ce que l'une d'elles échoue ?
00:05:55Si l'une d'elles échouait, ça désactivait.
00:05:57Donc c'était un processus assez codé en dur,
00:06:00comme vous pouvez le voir,
00:06:01parce qu'il y avait genre une ligne littérale disant,
00:06:04si link share,
00:06:05fais cette action.
00:06:06Si on est dans cet autre fournisseur, fais autre chose.
00:06:08Bon,
00:06:09j'ai bien sûr travaillé sur plein de projets où ce genre de truc arrive.
00:06:12C'est totalement normal.
00:06:14On commence en se disant,
00:06:15ok,
00:06:15hé,
00:06:16on aura peut-être un ou deux fournisseurs et c'est tout.
00:06:18Donc je vais juste mettre quelques cas particuliers codés en dur ici et on s'assurera que les choses soient prises en charge d'une certaine façon.
00:06:24On désactive pendant une certaine durée,
00:06:26qui au passage,
00:06:26n'était pas très longue.
00:06:27Vous devriez regarder la vidéo de MegaLeg pour découvrir à quel point les règles étaient vraiment atroces.
00:06:34Mais encore une fois,
00:06:35mon objectif c'est de me dire,
00:06:35ok,
00:06:36est-ce qu'ils ont fait des changements au code,
00:06:37est-ce que c'étaient des corrections de bugs ?
00:06:39Qu'est-ce qui s'est passé ?
00:06:40Eh bien,
00:06:40c'est là que les choses deviennent un peu déroutantes parce qu'entre les versions 11 et 14,
00:06:46qui je crois vont jusqu'en 2022,
00:06:48oui,
00:06:482022,
00:06:49les choses sont restées à peu près constantes.
00:06:52Rien n'a vraiment changé,
00:06:53quelques petites modifications,
00:06:54rien de vraiment significatif.
00:06:56Mais à partir d'environ,
00:06:57je crois,
00:06:58la version 16,
00:06:59donc en 2024,
00:06:59il y a eu une refonte robuste faite de sorte qu'ils puissent piloter beaucoup de ces décisions depuis un endpoint dans Honey.
00:07:07Maintenant cet endpoint envoie un objet qui ressemble à ça,
00:07:11qui a cette valeur de base,
00:07:13puis il a ces valeurs,
00:07:14puis il a ces valeurs sous X.
00:07:16Donc ça veut dire que la version précédente utilisait tout un tas d'instructions if pour déterminer le type de comportements qu'elle voulait avoir.
00:07:23Ensuite,
00:07:24il effectuait une évaluation de règle pour vérifier si cette règle était effectivement validée.
00:07:28Obtenait-on réellement un vrai ou un faux ?
00:07:30Mais dans la version 16,
00:07:31ils ont décidé d'adopter une approche beaucoup plus rigoureuse en matière d'ingénierie logicielle.
00:07:36On sait tous ce qu'on fait quand on a une série d'instructions conditionnelles qui encapsulent des données et effectuent des mutations basiques sur un objet,
00:07:44non ?
00:07:45Eh bien, on voudrait piloter ça via une configuration.
00:07:48On voudrait piloter ça via quelque chose d'un peu plus dynamique pour faciliter les choses.
00:07:52Et c'est exactement ce qu'ils ont fait.
00:07:53Donc si on revient ici et qu'on regarde les données qui me parviennent en tant qu'utilisateur Honey non connecté,
00:07:58vous verrez ici que j'ai une classe de base.
00:08:00Cette classe de base devient l'objet de référence pour déterminer le comportement de Honey.
00:08:05Actuellement,
00:08:06pour cette classe de base d'utilisateur non connecté,
00:08:09j'ai besoin de 65 000 points utilisateur pour que Honey ne se désactive pas.
00:08:13Si j'ai moins de 65 000 points,
00:08:14et rappelez-vous que je ne suis pas connecté donc j'ai zéro point,
00:08:17il dira désolé,
00:08:18je me désactive.
00:08:18J'évite ça.
00:08:20Maintenant,
00:08:20quand il obtient cette base,
00:08:22ce qu'il fait ensuite c'est vérifier comment on est arrivé là.
00:08:25D'où sommes-nous arrivés ?
00:08:27Pourquoi sommes-nous arrivés là ?
00:08:28Et il fait la vérification suivante : est-ce que ça provient d'un de ces réseaux d'affiliation ?
00:08:32Et ensuite il commence à encapsuler les choses.
00:08:33Donc,
00:08:33d'accord,
00:08:34si je viens d'un site de partage de liens,
00:08:36maintenant mes points requis ne seront plus que de 5 001.
00:08:40Il modifiera cet objet de base.
00:08:41C'est en fait une ingénierie meilleure et plus sophistiquée.
00:08:44Ce n'est plus une série d'instructions conditionnelles codées en dur.
00:08:48Au lieu de ça,
00:08:48il fait un vrai traitement du type : prends la base.
00:08:51Ensuite je veux dire, as-tu mon fournisseur ?
00:08:55Si tu as mon fournisseur,
00:08:57je veux déployer les valeurs de mon fournisseur ou juste un objet vide.
00:09:01Et ensuite ils ont fait quelque chose d'encore plus audacieux,
00:09:04à savoir tous ces éléments ici sous X.
00:09:07Ce sont toutes des valeurs spécifiques à chaque boutique.
00:09:09Ensuite il vérifiait,
00:09:11hé,
00:09:11quelle que soit la boutique dans laquelle je me trouve,
00:09:14je veux aussi appliquer ces valeurs-là.
00:09:17Et ensuite il exécutait la logique de règle de base,
00:09:20montrant qu'il n'est plus en mode maintenance.
00:09:23Il montre que ce n'est plus ce truc bricolé codé en dur qui existe depuis une décennie.
00:09:29Au lieu de ça, ils sont passés de ça.
00:09:31Et en 2024, ils se sont dit, vous savez quoi ?
00:09:33On doit être plus robustes et on doit pouvoir prendre davantage de décisions concernant plus de boutiques et plus de fournisseurs d'une manière plus facile à maintenir.
00:09:43C'était de l'ingénierie logicielle les gens,
00:09:45et ils l'ont fait.
00:09:46Donc quand je regarde ça,
00:09:47ce que je vois c'est qu'au fil du temps,
00:09:49ils ont apporté des modifications pour améliorer leur système,
00:09:52ce qui signifie qu'il y a une intention derrière.
00:09:54Ils veulent maintenir ce que fait le système,
00:09:57que ce soit frauduleux ou non.
00:09:59Je ne peux pas affirmer ça,
00:10:00c'est à quelqu'un d'autre d'en décider,
00:10:02mais je peux au moins dire que leurs décisions ont visé à le rendre plus robuste et meilleur.
00:10:07Et vu que la perception générale de ce système est qu'il est plutôt louche,
00:10:12ils ont rendu leur système plutôt louche bien,
00:10:15bien meilleur.
00:10:16Mais ce n'est pas tout ce que j'ai trouvé.
00:10:17J'ai trouvé autre chose qui a vraiment piqué ma curiosité.
00:10:19Je n'arrêtais pas de voir le mot VIM qui revenait sans cesse.
00:10:23Là je me dis,
00:10:23VIM,
00:10:24qu'est-ce que l'éditeur de texte vient faire là ?
00:10:26Quand j'ai interrogé Claude à ce sujet,
00:10:29il m'a dit,
00:10:29hé,
00:10:30tu parles du gestionnaire d'instances VIM qui se trouve dans Honey ?
00:10:34Et je me suis dit, gestionnaire d'instances VIM.
00:10:35OK, ça ne peut pas être ça.
00:10:37Ce n'est pas ça.
00:10:38Et puis en commençant à creuser,
00:10:40ce que j'ai fini par voir c'est qu'il y a tout un moteur JavaScript dans JavaScript qui tourne à l'intérieur du plugin Honey.
00:10:49Bon,
00:10:50c'est vraiment la chose la plus étrange que j'aie jamais vue.
00:10:54J'ai essayé de me renseigner là-dessus.
00:10:56Je ne suis pas un expert du développement de plugins pour Chrome.
00:10:59Donc je n'avais aucune idée de pourquoi on voudrait exécuter du JavaScript dans du JavaScript.
00:11:05Mais ce que fait Honey,
00:11:07c'est qu'il a en fait Acorn,
00:11:09qui est un analyseur JavaScript produisant un AST à partir de JavaScript valide.
00:11:14Et il prend ça,
00:11:15évalue le JavaScript,
00:11:17puis l'injecte dans ce moteur VIM.
00:11:19Il y a plusieurs références dans le code qui font référence à cet autre objet appelé cart ops retrieval JS et product ops retrieval JS,
00:11:28qui parfois n'est pas nul,
00:11:29contient en fait du code.
00:11:31Et il fait également référence à ce code JS,
00:11:34qui n'est pas non plus nul parfois,
00:11:36comme ici,
00:11:36c'est du vrai JavaScript.
00:11:38Mais pour autant que je puisse en juger,
00:11:39il n'exécute pas vraiment ce code.
00:11:41J'ai essayé de définir quelques points d'arrêt.
00:11:42Je n'ai jamais réussi à créer un déclencheur,
00:11:45mais quoi qu'il en soit,
00:11:46ça existe.
00:11:47Ils ont mis en place l'appareil pour pouvoir exécuter du code distant sur votre machine en fonction de ce que Honey renvoie d'une manière très,
00:11:56très obscurcie.
00:11:57Ce JavaScript dans JavaScript,
00:11:59ils ont un analyseur JavaScript.
00:12:00Ils ont une machine virtuelle JavaScript.
00:12:03C'est du vrai JavaScript dans le JavaScript.
00:12:06Mais ils ont aussi cette section où il y a juste toutes ces fonctions sous forme de chaînes.
00:12:11Et il y a un tas de JavaScript intégré qui est simplement rempli de façons dont ils parcourent les pages et ce genre de choses.
00:12:18Mais ceux-là sont livrés avec le produit.
00:12:22Donc techniquement,
00:12:23ils ne vont pas à l'encontre des anciennes conditions d'utilisation de Google.
00:12:26Parce que si vous regardez les exigences supplémentaires pour le manifest V3 pour ceux qui font ça,
00:12:30c'est que vous ne devriez pas être autorisé à utiliser JavaScript eval.
00:12:33D'accord, donc on ne va pas faire ça.
00:12:34On ne va pas utiliser eval.
00:12:35Ce qu'on va faire,
00:12:36c'est coder en dur certaines opérations que nous ne voulons pas que les autres plugins sachent que nous faisons.
00:12:40Et ensuite,
00:12:41nous allons intégrer un moteur JavaScript entier pour les exécuter afin d'obscurcir davantage ce que nous faisons.
00:12:47Ce qui est drôle,
00:12:48c'est que ce V3 ici,
00:12:49on dirait qu'il a été conçu spécifiquement pour Honey parce qu'il dit : construire un interpréteur pour exécuter des commandes complexes récupérées depuis une source distante,
00:12:56même si ces commandes sont récupérées en tant que données.
00:12:59Donc ils contournent ça.
00:13:00Ce ne sont pas des choses distantes.
00:13:01Ce sont des chaînes qui sont en fait disponibles dans l'extension Honey.
00:13:05Mais bon sang, c'est de l'obscurcissement.
00:13:07C'est un truc bizarre.
00:13:09Personnellement,
00:13:10je ne comprends pas une seule raison pour laquelle ça se passe réellement.
00:13:14Comme je l'ai dit,
00:13:14apparemment c'est dû aux interactions avec d'autres extensions,
00:13:17d'autres extensions étant des bloqueurs de publicités.
00:13:19Apparemment,
00:13:19les bloqueurs de publicités pourraient bloquer l'extension Honey si elle exécute directement certaines fonctions,
00:13:24mais d'une manière ou d'une autre,
00:13:26grâce à cet interpréteur bizarre,
00:13:28elle peut effectivement exécuter des trucs qui évitent d'être détectés.
00:13:31Je ne sais pas, mais ça me semble être un vrai bordel.
00:13:34Et j'ai trouvé ça très,
00:13:34très intéressant parce que je n'ai jamais fait de rétro-ingénierie.
00:13:37Je n'ai jamais vraiment regardé le code source de quelqu'un d'autre,
00:13:40surtout du code source minifié.
00:13:41Je voulais juste vous montrer ça.
00:13:42C'est peut-être l'ingénierie la plus inhabituelle que j'aie jamais vue de ma vie.
00:13:46J'ai fait partie de bases de code qui ont plus de 10 000 lignes de machines à états bizarres et avec lesquelles il est impossible de travailler,
00:13:54difficiles à comprendre,
00:13:55mais celle-ci remporte la palme.
00:13:57Ça doit être la machine la plus complexe et la plus bizarre,
00:14:00du niveau de Rube Goldberg,
00:14:02que j'aie jamais vue.
00:14:03Mais en plus,
00:14:04les règles dynamiques pour faire le truc de stand down,
00:14:07elles sont robustes.
00:14:08Quel que soit l'objectif,
00:14:10qu'il soit frauduleux ou non,
00:14:12il a été conçu pour être dynamique et contrôlé via JSON par magasin,
00:14:17par fournisseur et par utilisateur.
00:14:19Mais bref, je veux faire un gros shout out à Magalega.
00:14:21C'était vraiment génial.
00:14:22J'ai pu discuter avec lui.
00:14:23Il m'a un peu aidé à examiner certaines choses.
00:14:25Donc gros shout out à lui.
00:14:26Vous devriez absolument regarder la vidéo.
00:14:27Elle est dans la description.
00:14:28Elle est super bien faite.
00:14:29Il y en a plusieurs et je vous recommande de toutes les regarder.
00:14:32Elles sont vraiment, vraiment bien.
00:14:33Aussi, vous aimez ce truc que j'ai fait ?
00:14:35Vous aimez ce format ?
00:14:36Je ne sais pas.
00:14:37C'est un peu nouveau.
00:14:38C'est juste moi qui passe du temps en stream,
00:14:40qui m'amuse et qui vous fait un compte-rendu ensuite.
00:14:42Si vous étiez sur le stream, vous auriez vu ça en direct.
00:14:44Ça aurait pu être beaucoup plus amusant pour vous.
00:14:45Le nom c'est : je ne suis pas un ingénieur en rétro-ingénierie,
00:14:48mais c'était super amusant.
00:14:50Je comprends pourquoi les gens font ça.
00:14:51À bientôt.
00:14:52Hé, c'est du HTTP ça ?
00:14:55Dégage-moi ça d'ici.
00:14:56C'est pas comme ça qu'on commande du café.
00:14:57On commande le café par SSH, terminal.shop.
00:15:00Ouais, tu veux une vraie expérience ?
00:15:02Tu veux du vrai café ?
00:15:03Tu veux un abonnement génial pour ne plus jamais avoir à y penser ?
00:15:06Oh,
00:15:07tu veux des mélanges exclusifs avec du café exclusif et du contenu exclusif ?
00:15:12Alors va voir CRON.
00:15:13Tu sais pas ce qu'est le SSH ?
00:15:14Eh bien, peut-être que le café n'est pas pour toi.
00:15:18♪ Café Terminal en main ♪ ♪ Vis le rêve ♪