00:00:00(teclado digitando) Então,
00:00:03eu quis dar uma olhada nesse grande escândalo do Honey que está acontecendo.
00:00:12Se você não conhece o Honey,
00:00:14Honey é uma daquelas extensões de cupons do Chrome,
00:00:16o que significa que todo o seu código está disponível para eu analisar.
00:00:19E assim posso verificar as coisas que estão sendo alegadas nesses vídeos do YouTube e realmente ver: isso está acontecendo?
00:00:26Mas além disso,
00:00:27quando se trata de extensões,
00:00:28posso realmente observar ao longo do tempo e ver: essas decisões ruins estavam sendo tomadas e os engenheiros de software fizeram alterações não apenas para continuar,
00:00:39mas para tornar esses comportamentos ruins ainda melhores e mais robustos?
00:00:44Sim, fizeram.
00:00:45E vou mostrar como isso aconteceu.
00:00:47Mas sei que há muitos de vocês que provavelmente não têm ideia do que está acontecendo.
00:00:50Você não está realmente familiarizado com o Honey.
00:00:52E então você nunca realmente ficou por dentro.
00:00:55Isso na verdade envolve uma operação muito específica do Honey que quero abordar.
00:00:59Então vamos assistir a um trecho de três minutos deste último vídeo de revelação sobre o Honey.
00:01:05E depois vou falar sobre examinar o código minificado e exatamente o que encontrei e a intenção por trás disso,
00:01:10o que é um tanto surpreendente.
00:01:12Agora,
00:01:12se há uma coisa que as pessoas odeiam mais do que engano,
00:01:15é roubo.
00:01:15E no meu primeiro vídeo,
00:01:16mostrei como o Honey estava roubando dinheiro de influenciadores.
00:01:19Mas o que não contei é que esse comportamento,
00:01:22na maioria dos casos,
00:01:23é estritamente proibido.
00:01:25Veja bem,
00:01:25as empresas que administram essa indústria,
00:01:27as redes de afiliados,
00:01:28sabem muito bem que extensões de cupons como o Honey têm uma alta probabilidade de roubar comissões de influenciadores,
00:01:34blogueiros e outros afiliados focados em conteúdo.
00:01:37Mais importante ainda,
00:01:38elas também entendem que isso não é justo,
00:01:40especialmente sob a política de "último clique ganha",
00:01:44que permanece como padrão da indústria.
00:01:46Então,
00:01:47para evitar esse tipo de roubo de comissão,
00:01:49a maioria das principais redes de afiliados aplica o que é conhecido como política de recuo.
00:01:53Deixe-me mostrar como isso funciona no Honey.
00:01:55Vamos visitar o newegg.com primeiro sem um link de afiliado.
00:01:58E como você pode ver,
00:01:59o Honey aparece imediatamente oferecendo cashback.
00:02:02Mas se fizermos isso novamente,
00:02:03desta vez usando meu link de afiliado para o Newegg,
00:02:06você vai notar que o Honey não aparece.
00:02:08E se clicarmos no ícone do Honey,
00:02:10você pode ver que o Honey agora está desativado.
00:02:12Então é assim que o Honey deveria se comportar quando um usuário já clicou no link de afiliado de outra pessoa.
00:02:17Então, onde está a suposta fraude, você pergunta?
00:02:20Bem,
00:02:20acontece que o Honey sempre teve um sistema de recuo integrado em seu aplicativo,
00:02:25mas tem escolhido seletivamente quando e a quem aplicar as regras.
00:02:28Vamos testar meu link de afiliado para o Newegg novamente.
00:02:31Só que desta vez tenho dois navegadores Chrome totalmente separados abertos ao mesmo tempo,
00:02:36e cada um está conectado a uma conta Honey diferente.
00:02:38A conta Honey à esquerda tem zero pontos de cashback,
00:02:41enquanto a conta Honey à direita acumulou pontos de cashback.
00:02:45Agora,
00:02:45o que acontece quando abro o link de afiliado do Newegg em ambos os navegadores?
00:02:49A conta Honey à esquerda recua como fez da primeira vez.
00:02:52Mas olhe só,
00:02:53a conta à direita,
00:02:54que tem pontos de cashback,
00:02:56não recuou.
00:02:58Então, por que isso acontece?
00:02:59Então essa é a coisa que eu queria testar.
00:03:01Eu quis examinar isso porque isso é código.
00:03:03Eu entendo de código.
00:03:05Posso olhar o JSON que está sendo recebido e posso entendê-lo.
00:03:09Além disso,
00:03:09o poder da IA me permitirá pesquisar código minificado em velocidades desconhecidas para mim durante todo o meu universo de programação.
00:03:18Então o que fizemos foi conseguir várias versões do Honey.
00:03:22As que eu meio que examinei começaram por volta de fevereiro de 2019,
00:03:27até os dias atuais,
00:03:281901.
00:03:29E com isso,
00:03:29o que eu queria fazer era: ok,
00:03:31primeiro,
00:03:32esse tipo de ponto de usuário que decide quando mostrar ou não o menu de recuo,
00:03:38existe?
00:03:38Sim, existe.
00:03:40Mas a verdadeira pergunta era: tinha mudado?
00:03:43Porque eu trabalhei em uma grande empresa,
00:03:45eu trabalhei em uma grande empresa,
00:03:46certo,
00:03:46você trabalhou em uma grande empresa,
00:03:47tenho certeza que sim,
00:03:48ou alguns de vocês trabalharam,
00:03:49e vocês sabem que às vezes o código simplesmente fica por lá.
00:03:50Sabe como é,
00:03:51tipo opa,
00:03:51ainda está lá,
00:03:52ninguém mexeu naquilo há cinco anos,
00:03:54é assim que funciona.
00:03:55E era meio que isso que eu estava procurando,
00:03:58tipo,
00:03:58será que o código ficou por lá?
00:04:00Ou houve mudanças significativas?
00:04:03Não tipo pequenas correções de bugs.
00:04:05Tá,
00:04:05então para evitar problemas de direitos autorais,
00:04:07porque aparentemente os advogados do PayPal vão processar,
00:04:10mandar DMCA em cima de qualquer um que mostrar o código de fato.
00:04:13Isso significa que eu tenho que fazer essa charada estranha no velho quadro-negro para mostrar a vocês o que estava acontecendo.
00:04:18Então,
00:04:19começando na versão 11,
00:04:20lembram,
00:04:21que é lá de 2019,
00:04:22essa versão já tinha a lógica de stand down.
00:04:25Ela até tinha coisas que eram chamadas de lógicas de stand down SSD.
00:04:29Ela combinava com o arquivo JSON que vinha com um monte de dados.
00:04:32Aqui está o meu stand down de um usuário que nem está logado,
00:04:36o mais básico possível.
00:04:38Aqui dentro,
00:04:38você pode ver que UP é user points,
00:04:40pontos do usuário.
00:04:41ADB é tipo add block,
00:04:42bloqueador de anúncios,
00:04:43última vez usado.
00:04:45Também tem o is account logged in, se a conta está logada.
00:04:47E tem outros campos que aparecem de vez em quando.
00:04:50Então,
00:04:50o interessante é que em 2019,
00:04:52na versão 11,
00:04:53as coisas geralmente eram assim.
00:04:55Tem tipo um switch statement gigante que acabava tendo esses cases onde era tipo,
00:05:00ok,
00:05:00ei,
00:05:01a gente testa se tem um email?
00:05:02E sim, literalmente tinha uma string.
00:05:04Esse email contém test?
00:05:06Então sempre faz stand down, o que, aliás, é suspeito.
00:05:10Estava evitando que essas contas de teste do link entrassem e tipo compartilhassem link de teste para ver se isso realmente funciona?
00:05:16Porque vamos ser sinceros,
00:05:17quem aqui não teve uma conta de testes que não contenha a palavra test?
00:05:20Eu certamente já tive.
00:05:22Mas de qualquer forma,
00:05:22isso aqui era uma verificação explícita.
00:05:24Se você tem a palavra test em qualquer lugar do seu email,
00:05:28ele te desabilita.
00:05:29Mas além disso,
00:05:29quer dizer,
00:05:30isso já foi comentado,
00:05:31mas além disso,
00:05:32as coisas que eram realmente confusas é que ele passava por uma série de verificações e era tipo,
00:05:37ei,
00:05:37o provedor que está ativo no momento é igual a LS,
00:05:40que é link share?
00:05:41Se for, eu quero que você aplique essas regras exatas.
00:05:44E depois,
00:05:45mais adiante,
00:05:45tinha essa verificação onde ele passava por todas as regras que tinha descoberto,
00:05:49e aí ia uma por uma num loop pequeno passando por cada uma dessas regras e verificando,
00:05:54alguma delas falha?
00:05:55Se qualquer uma delas falhasse, fazia o stand down.
00:05:57Então era um processo meio hardcoded,
00:06:00como vocês podem ver,
00:06:01porque tinha tipo uma linha literal dizendo,
00:06:04se for link share,
00:06:05faz essa ação.
00:06:06Se a gente estiver nesse outro provedor, faz outra coisa.
00:06:08Agora,
00:06:09é claro que eu já estive em muitos,
00:06:10muitos projetos onde esse tipo de coisa simplesmente acontece.
00:06:12Isso é totalmente normal.
00:06:14Você começa tipo,
00:06:15ok,
00:06:15ei,
00:06:16a gente pode ter um ou dois provedores e pronto.
00:06:18Então eu só vou colocar uns casos hardcoded aqui e vamos garantir que as coisas sejam tratadas de um certo jeito.
00:06:24A gente faz stand down por um tempo,
00:06:26que aliás,
00:06:26não era muito longo.
00:06:27Você deveria assistir o vídeo do MegaLag para descobrir exatamente o quão terríveis as regras realmente eram.
00:06:34Mas de novo,
00:06:34meu objetivo é tipo,
00:06:35ok,
00:06:36eles fizeram mudanças no código ou eram correções de bugs?
00:06:39O que aconteceu?
00:06:40Bom,
00:06:40é aqui que as coisas ficam um pouco confusas porque entre as versões 11 e 14,
00:06:46que eu acho que vai até 2022,
00:06:48sim,
00:06:482022,
00:06:49as coisas ficaram praticamente constantes.
00:06:52Nada mudou muito,
00:06:53uns pequenos ajustes,
00:06:54nada muito relevante.
00:06:56Mas por volta da versão 16,
00:06:58acho,
00:06:58então em 2024,
00:06:59foi feita uma refatoração robusta para que eles pudessem conduzir muitas dessas decisões a partir de um endpoint no Honey.
00:07:07Agora esse endpoint envia um objeto que se parece com isso,
00:07:11que tem esse valor base,
00:07:13depois tem esses valores,
00:07:14depois tem esses valores sob X.
00:07:16Então isso significa que a versão anterior usava um monte de if statements em série para meio que determinar o tipo de comportamento que ela queria executar.
00:07:23E então faria a avaliação da regra para ver se essa regra realmente passou.
00:07:28Será que realmente obtivemos um verdadeiro ou um falso?
00:07:30Mas na versão 16,
00:07:31decidiram ser um pouco mais rigorosos em termos de engenharia de software.
00:07:36Agora,
00:07:36todos nós sabemos o que se faz quando há um monte de declarações if que estão fazendo esse tipo de encapsulamento de dados e realizando uma mutação básica num objeto?
00:07:45Bem,
00:07:45você iria querer conduzir isso através de algum tipo de configuração.
00:07:48Você iria querer conduzir através de algo um pouco mais dinâmico para torná-lo um pouco mais fácil.
00:07:52E foi exatamente isso que fizeram.
00:07:53Então,
00:07:54se voltarmos aqui e olharmos para os dados que estão vindo de mim,
00:07:57um usuário Honey não logado,
00:07:58você verá aqui que tenho uma classe base.
00:08:00Esta classe base se tornará o objeto base de como o Honey determina.
00:08:05Agora,
00:08:06para esta classe base de usuário não logado,
00:08:09preciso de 65.000 pontos de usuário para que o Honey não recue.
00:08:13Se eu tiver menos de 65.000 pontos,
00:08:15lembre-se que não estou logado então tenho zero pontos,
00:08:17ele dirá: desculpe,
00:08:18estou recuando.
00:08:18Estou evitando isto.
00:08:20Agora,
00:08:20quando obtém essa base,
00:08:22o que faz em seguida é verificar como chegamos aqui?
00:08:25Onde chegamos?
00:08:27Por que chegamos aqui?
00:08:28E faz a próxima verificação: isto veio de uma dessas redes de afiliados?
00:08:32E então começará a encapsular as coisas.
00:08:33Então,
00:08:33ok,
00:08:34se eu vier de um local de compartilhamento de link,
00:08:37agora só precisará de 5.001 pontos.
00:08:40Ele editará este objeto base.
00:08:41Na verdade está fazendo a engenharia melhor e mais sofisticada.
00:08:44Não é mais uma série de declarações if codificadas estaticamente.
00:08:48Em vez disso,
00:08:48está fazendo um verdadeiro: ei,
00:08:50pegue o ponto base.
00:08:51Então quero dizer, você tem meu provedor?
00:08:55Se você tem meu provedor,
00:08:57quero espalhar os valores do meu provedor ou apenas um objeto vazio.
00:09:01E então fez algo ainda mais impressionante,
00:09:04que são todos estes aqui embaixo do X.
00:09:07Estes são todos valores específicos da loja.
00:09:09Então verificaria: ei,
00:09:11seja qual for a loja em que estou atualmente,
00:09:14também quero adicionar esses valores.
00:09:17E então iria fazer a lógica de regra básica,
00:09:19mostrando que não está mais sob algum tipo de modo de manutenção.
00:09:23Está mostrando que não é mais esse tipo de coisa improvisada codificada estaticamente que existe há quase uma década.
00:09:29Em vez disso, saíram daquilo.
00:09:31E em 2024, disseram: sabe de uma coisa?
00:09:33Precisamos ser mais robustos e precisamos ser capazes de tomar mais decisões sobre mais lojas e mais provedores de uma forma mais fácil de manter.
00:09:43Isto foi engenharia de software, pessoal, e eles fizeram.
00:09:46Então,
00:09:47quando olho para isto,
00:09:48o que vejo é que ao longo do tempo fizeram mudanças para tornar seu sistema melhor,
00:09:52o que significa que há uma intenção por trás disso.
00:09:54Eles querem manter o que quer que o sistema esteja fazendo,
00:09:57seja fraudulento ou não.
00:09:59Não posso dizer isso,
00:10:00é para outra pessoa decidir,
00:10:02mas posso pelo menos dizer que suas decisões foram torná-lo mais robusto e melhor.
00:10:07E dado o facto de que a percepção geral deste sistema é de ser bastante duvidoso,
00:10:12tornaram o seu sistema bastante duvidoso muito,
00:10:15muito melhor.
00:10:16Mas não é tudo o que encontrei.
00:10:17Encontrei outra coisa que despertou meu interesse.
00:10:19Continuava a ver a palavra VIM que simplesmente continuava aparecendo.
00:10:23Agora estou tipo: VIM,
00:10:24o que é que o editor de texto está fazendo?
00:10:26Quando perguntei ao Claude Cote sobre isso,
00:10:28ele realmente disse: ei,
00:10:29você está falando sobre o gerenciador de instâncias VIM que foi encontrado dentro do Honey?
00:10:34E eu fiquei tipo: gerenciador de instâncias VIM.
00:10:35Ok, não pode ser isso.
00:10:37Não é isso.
00:10:38E então,
00:10:39quando comecei a olhar para isto,
00:10:41o que acabei vendo é que há um motor JavaScript inteiro dentro de JavaScript que roda dentro do plugin Honey.
00:10:49Agora, isto é absolutamente a coisa mais estranha que já vi.
00:10:54Tentei ler um pouco sobre isso.
00:10:56Não sou um desenvolvedor especialista em plugins quando se trata do Chrome.
00:10:59Então não fazia ideia de por que alguém executaria JavaScript em JavaScript.
00:11:05Mas o que o Honey faz é que na verdade tem o Acorn,
00:11:09que é um analisador de JavaScript e produz uma AST a partir de JavaScript válido.
00:11:14E pega isto,
00:11:15avalia JavaScript,
00:11:16e depois alimenta-o neste motor VIM.
00:11:19Agora há várias referências dentro do código que na verdade se referem a esse outro objeto chamado cart ops retrieval JS e product ops retrieval JS,
00:11:28que às vezes não é nulo,
00:11:30na verdade contém código.
00:11:31E também se refere a esse código JS,
00:11:33que também às vezes não é nulo,
00:11:35tipo aqui mesmo,
00:11:36é JavaScript real de verdade.
00:11:38Mas pelo que pude perceber,
00:11:39ele não está realmente executando nenhum desse código.
00:11:41Tentei definir alguns breakpoints.
00:11:42Nunca cheguei ao ponto de criar um gatilho,
00:11:45mas ainda assim,
00:11:46isso existe.
00:11:47Eles têm o aparato configurado para poder executar código remoto na sua máquina com base no que o Honey retorna de uma forma muito,
00:11:56muito ofuscada.
00:11:57Este JavaScript dentro de JavaScript,
00:11:59eles têm um parser de JavaScript.
00:12:00Eles têm uma máquina virtual JavaScript.
00:12:03É JavaScript de verdade dentro do JavaScript.
00:12:06Mas eles também têm essa seção onde há simplesmente todas essas funções em formato de string.
00:12:11E há um monte de JavaScript inline que está simplesmente repleto de maneiras pelas quais eles pesquisam páginas e coisas assim.
00:12:18Mas essas vêm junto com o produto.
00:12:22Então tecnicamente não são contra os antigos termos de serviço do Google.
00:12:26Porque se você olhar os requisitos adicionais para o manifest V3 para quem está fazendo isso,
00:12:30é que você não deveria ter permissão para usar o eval do JavaScript.
00:12:33Ok, então não vamos fazer isso.
00:12:34Não vamos usar eval.
00:12:35O que vamos fazer é colocar no código algumas operações que não queremos que outros plugins saibam que estamos fazendo.
00:12:40E então vamos incorporar um motor JavaScript inteiro para executá-las e ofuscar ainda mais o que estamos fazendo.
00:12:47O que é engraçado porque esse V3 aqui,
00:12:49parece que foi projetado especificamente para o Honey porque diz construir um interpretador para executar comandos complexos buscados de uma fonte remota,
00:12:56mesmo que esses comandos sejam buscados como dados.
00:12:59Então eles contornam isso.
00:13:00Essas não são coisas remotas.
00:13:01São strings que na verdade estão disponíveis dentro da extensão do Honey.
00:13:05Mas cara, isso é muita ofuscação.
00:13:07Isso é uma coisa estranha.
00:13:09Eu pessoalmente não consigo entender um único motivo pelo qual isso está realmente acontecendo.
00:13:14Como eu disse,
00:13:14aparentemente é devido a interações com outras extensões,
00:13:17outras extensões sendo bloqueadores de anúncios.
00:13:19Aparentemente os bloqueadores de anúncios podem bloquear a extensão do Honey se ela executar certas funções diretamente,
00:13:24mas de alguma forma através desse interpretador estranho,
00:13:27ela consegue realmente executar coisas que estão evitando ser detectadas.
00:13:31Não sei, mas parece uma zona total para mim.
00:13:34E achei isso muito,
00:13:34muito interessante porque nunca fiz nenhum tipo de engenharia reversa.
00:13:37Nunca realmente olhei o código-fonte de outra pessoa,
00:13:39especialmente código-fonte minificado.
00:13:41Só queria mostrar isso para vocês.
00:13:42Esta é talvez a engenharia mais incomum que já vi na minha vida.
00:13:46Já fiz parte de bases de código que têm mais de 10 mil linhas de máquinas de estado estranhas e são impossíveis de trabalhar,
00:13:54difíceis de raciocinar,
00:13:55mas essa aqui leva o prêmio.
00:13:57Essa tem que ser a engenhoca mais complexa e estranha,
00:14:00nível máquina de Rube Goldberg que já vi.
00:14:03Mas além disso,
00:14:04as regras dinâmicas para fazer o stand down,
00:14:07elas são robustas.
00:14:08Seja qual for o propósito,
00:14:10sendo fraudulento ou não,
00:14:12foi projetado para ser dinâmico e ser controlado via JSON por loja,
00:14:17por provedor e por usuário.
00:14:19Mas enfim, quero dar um salve especial para o Magalega.
00:14:21Foi muito legal.
00:14:22Consegui conversar com ele.
00:14:23Ele me ajudou um pouco meio que olhando algumas coisas.
00:14:25Então um grande salve para ele.
00:14:26Você definitivamente deveria conferir o vídeo.
00:14:27Está na descrição.
00:14:28É super bem feito.
00:14:29São vários deles e recomendo que você assista todos.
00:14:32São muito, muito bons.
00:14:33Além disso, você gostou dessa coisa que eu fiz?
00:14:35Você gostou desse formato?
00:14:36Não sei.
00:14:37Isso é meio novo.
00:14:38É só eu passando um tempo na live,
00:14:39me divertindo e então reportando de volta para você.
00:14:42Se você estivesse na live,
00:14:43teria visto isso acontecer ao vivo.
00:14:44Poderia ter sido muito mais divertido para você.
00:14:45O nome é Eu não sou um engenheiro reverso,
00:14:48mas isso foi muito divertido.
00:14:50Consigo ver por que as pessoas fazem isso.
00:14:51Até mais.
00:14:52Ei, isso é HTTP?
00:14:55Tira isso daqui.
00:14:56Não é assim que pedimos café.
00:14:57Pedimos café via SSH, terminal.shop.
00:15:00Quer uma experiência de verdade?
00:15:02Quer café de verdade?
00:15:03Quer uma assinatura incrível para nunca mais ter que lembrar?
00:15:06Ah,
00:15:07quer blends exclusivos com café exclusivo e conteúdo exclusivo?
00:15:12Então confere o CRON.
00:15:13Não sabe o que é SSH?
00:15:14Bom, talvez o café não seja pra você.
00:15:18♪ Café do terminal na mão ♪ ♪ Vivendo o sonho ♪