Decifrando Golpe para pegar Devs Web3/Blockchain

Carreira

Decifrando Golpe para pegar Devs Web3/Blockchain

Luiz Duarte
Escrito por Luiz Duarte em 07/11/2024
Junte-se a mais de 34 mil devs

Entre para minha lista e receba conteúdos exclusivos e com prioridade

Todo mundo que trabalha ou quer trabalhar com web3 e blockchain já deve ter ouvido falar de golpes envolvendo falsas entrevistas para vagas e projetos. Embora elas tenham autores diferentes (eu acho), o modus operandi é sempre o mesmo: atrair a vítima com promessa de altos pagamentos em um projeto web3 que será explicado assim que o candidato passar em um teste e for selecionado. O teste? Executar, analisar e modificar um repositório de GitHub do entrevistador.

Recentemente mais um aluno de meus cursos foi seduzido por esses golpes e eu decidi intervir para entender no detalhe como que eles de fato estavam acontecendo. Esse artigo aqui detalha a operação e a investigação que foi feita por mim, para ajudar que outros devs não caiam no mesmo golpe.

Via de regra, sempre desconfie de estranhos na Internet, combinado?

Se preferir, pode assistir ao vídeo abaixo ao invés de ler.

Livro Node.js

#1 – O Primeiro Contato

Eu tenho visto esse golpe sendo muito aplicado via LinkedIn, já que ali o dev tem exposta as suas habilidades profissionais e fica fácil para os recrutadores falsos filtrarem suas vítimas. Mas não descarte a possibilidade de ser contatado via GitHub (se você tiver repos ligados a web3/blockchain), Discord ou Telegram (se estiver em grupos de web3/blockchain).

Abaixo um exemplo de contato real, que eu recebi de um golpista chamado Ysai Galarza, da Bolívia (nem vou linkar o perfil, você já vai entender o porquê):

Hi Luiz Fernando,

It’s great connecting with you. How have you been?
We are looking for high skilled developer to join our team.
We plan to secure investment following the MVP stage, after which we can proceed with our work continuously.

Project Goal
Our objective is to enhance the existing EVM Voting DApp by integrating token presale and staking features, along with a comprehensive UI/UX improvement, to promote user engagement and streamline the voting process.

Scope of Work (MVP)
1. EVM-Voting-Dapp: Completed
– Voting Mechanism: Implementation of a transparent and tamper-proof voting process using smart contracts, ensuring each vote is recorded and counted accurately.
– Proposal Management: Project developers can submit proposals for voting, complete with required details such as descriptions, voting duration, and options (for/against/abstain).
– User Notifications: Automated notifications for users regarding new proposals, voting periods, and results, ensuring high engagement levels and informed participation.
2. Token Presale Integration: To Do
– Develop a user-friendly interface for project registration and tokenomics visibility specific to the voting mechanism.
– Implement a smart contract template to facilitate token presales directly within the DApp.
– Allow project developers to set discounted rates for early supporters who participate in the token presale.
– Ensure a seamless purchasing experience for presale tokens, incorporating timelines, maximum contribution limits, and user notifications.

3. Staking Feature Implementation: To Do
– Create a foundational staking platform within the DApp, enabling users to stake tokens acquired from the presale.
– Develop a user-friendly interface for staking management, allowing users to easily view their stakes and rewards.
– Implement a basic rewards calculation mechanism for staked tokens, providing transparency on the staking rewards process.

Additional feature
UI/UX Enhancement: To Do
– Conduct a thorough review of the existing user experience and interface for the voting DApp.
– Redesign visual elements and workflows to improve user engagement and navigation.
– Optimize the layout for mobile and desktop versions of the DApp to ensure accessibility and responsiveness.

Hourly: $30~$100(no weekly limit)

Thanks.

Até aqui não tem nenhum problema aparente e se você acha que é incomum apresentar salário, não é. É coisa de brasileiro não apresentar salário logo de largada, em muitos países do mundo isso é quase uma regra, já que poupa tempo de todo mundo. E se você acha que $30-100/h está fora do normal, para web3/blockchain não está.

O projeto em si também não tem nada de anormal, poderia tranquilamente ser um projeto existente e que precise de habilidades comuns em devs web3/blockchain. O perfil da pessoa também não indicava nada anormal, realmente parecia um profissionald e tecnologia buscando mais alguém para tocar um projeto, tinha conexões, formação, experiências…na real estava até mais preenchido do que a média, hahaha. Era de um boliviano, mas também já vi muito perfil indiano sendo usado.

Após você dar assunto, ele te convida para um grupo no Slack, onde você deveria conhecer outros membros, mas no caso desse golpe não tinha qualquer canal liberado e era apenas um local onde ele poderia conversar mais facilmente contigo, incluindo mensagens prontas que aparentavam ser de um bot. Olha a mensagem que mandou no Slack quando questionado sobre detalhes do projeto (eu não cheguei nessa parte, um aluno me mandou).

We are working on the several project(Voting Dapp, NFT game, ERP system, etc)

Almost work are related with the JavaScript framework(React, Angular, Node, Web3) and Blockchian(Solidity, Rust).

Monthly Salary is 8000usdt ~10000usdt(Hourly $30~$100).

There is a project manager in each team and they get orders from investors in the group.

So all the projects are related with the business of the investors.

That’s why I can’t share project descriptions with you before be added to the team.

And this is a full-time remote job and developers work in the EST time zone because investors are located in California, United States of America.

We are not a company but all the team members have a strong team spirit because they had worked in a company.

So communication and team spirit is very important for us.

If you have enough experience in project manager, It will be good for our group.

Thanks.

Quando questionado sobre o processo seletivo e como os pagamentos seriam feitos ele focou em falar sobre o pagamento em si, tentou negociar um pouco o valor hora para baixo (para dar veracidade à conversa) e tentou convencer meu aluno de que ele deveria receber em crypto para evitar impostos. A essa altura ele já tinha achado estranho o suficiente e acabou desistindo de dar papo ao golpista, mas outro aluno decidiu continuar.

Antes de avançar no relato, recomendo que não façam isso que fizemos. É arriscado. Se sentirem que estão sendo enganados, simplesmente caiam fora. Até este momento os sinais eram fracos de que poderia ser um golpe, eu já vi contratações reais para freelas começando dessa maneira, mas todo cuidado é pouco.

Curso Node.js e MongoDB

#2 – A Entrevista

Outro aluno recebeu contato de outra pessoa, Nathan Affolter, da Suíca,  mas com exatamente o mesmo discurso anterior e decidiu ir até a etapa seguinte: entrevista, acreditando que realmente poderia ser uma boa oportunidade. Note que é outro nome e país completamente diferente, e todo o resto do perfil também era, então nem vale a pena se apegar aos perfis em si, mas sim entender a operação deles.

Quando se conectaram via Google Meet para conversar algo lhe chamou a atenção: o entrevistador não abriu a câmera. Isso simplesmente não existe pessoal, os entrevistadores aliás são os primeiros a pedir que VOCÊ abra sua câmera se não estiver aberta. O máximo que já aconteceu comigo em 18 anos de profissão foi uma entrevistadora com problemas de Internet pedir depois de alguns minutos que falássemos sem câmera pois estava picotando muito a transmissão. E é claro, já fiz entrevistas por telefone também, mas sempre em etapas iniciais que depois avançaram para encontros presenciais ou por videochamada. Acho muito improvável uma contratação acontecer sem ver o rosto da outra pessoa durante a entrevista, mas posso estar sendo antiquado, vai saber.

Enfim, o aluno estava maravilhado com a vaga e acabou não dando muito bola para isso. O recrutador ofereceu $7.800 para trabalhar remotamente em um projeto para a Suíça, mas ele teria de fazer um teste técnico antes, que ele deveria fazer o clone de um repositório no GitHub e rodar locamente para testá-lo, fazendo em seguida algumas correções e modificações para mostrar suas habilidades. É aqui que o perigo estava  e onde meu aluno ficou mais desconfiado. Já entrarei em detalhes sobre o repositório em si, mas vamos seguir com a entrevista por enquanto.

Meu aluno estava fazendo tudo conforme ordenado: clonou o repositório, instalou as dependências e ia executar o comando de inicialização que eles falaram quando lhe ocorreu de fazer mais algumas perguntas antes. Ele sentia que o sotaque dos dois entrevistadores era indiano, então ele perguntou mais sobre onde era a empresa na Suíça e um deles mencionou que na verdade o projeto era na Colômbia (e sim, tinha outro entrevistador junto e ele não sabia). A suposta empresa se chamaria Keyvian, mas a história estava cada vez mais estranha e o aluno decidiu ser um pouco mais precavido e pediu um tempo para analisar o projeto antes de executá-lo, o que gerou insistência por parte dos entrevistadores para que ele executasse o comando ‘npm start’, que poderia analisar o projeto depois.

Sabiamente meu aluno desistiu da entrevista apenas deixando a reunião e temendo que já tivesse ido longe demais ao instalar as dependências do projeto, foi quando me procurou para analisar o repositório clonado junto de outros colegas.

Curso Beholder
Curso Beholder

#3 – O Repositório

Já ouvi muitas histórias parecidas com essa e elas sempre envolvem rodar código de terceiros. Então a primeira dica é: não rode código de terceiros na sua máquina a menos que tenha certeza do que ele faz, principalmente de completos estranhos que você conheceu na Internet. Existem milhões de maneiras de ferrar com alguém dessa forma e essa suposta entrevista é só uma delas. Golpistas sabem que devs web3 possuem carteiras criptos cheias de moedas e é nelas que eles miram e eu tinha certeza que esse golpe não era diferente, mas eu tinha de provar como, estava curioso em transformar esse incidente em uma lição.

A primeira coisa que olhei foi a cara da conta dona do repositório. Sério, se a sua conta do GitHub é assim, você é incompetente no marketing pessoal ou um golpista para mim. Nesse caso acho que era os dois, pois se me mandasse um repo dessa conta jogada às traças eu nem iria clonar, haha

Enfim, no calor do momento meu aluno não olhou esse detalhe, foi direto apra o repo que lhe passaram e clonou. Era um monorepo com duas aplicações: um backend Node.js feito com Express e um frontend feito com React/Vite. Arquitetura simples mas várias pastas e arquivos, realmente parecia um projeto real/funcional. E na verdade era, salvo um detalhe que falarei mais tarde.

Depois de clonar, meu aluno instalou as dependências. Aqui já poderia ter dado alguma treta, já que o projeto poderia ter dependências maliciosas, criadas pelo próprio golpista para que fossem executadas na máquina da vítima e lhe feito mal. Foi a primeira coisa que olhei quando peguei o repositório para analisar: se cada uma das dependências que ele tinha no package.json eram dependências de mercado ou se baixaria algo desconhecido, como um repo no GitHub (sim, você pode ter um repo de GitHub configurado como sendo uma dependência do projeto). Nesta primeira análise, a única coisa que me chamou a atenção foi uma dependência que estava depreciada há vários anos, indicando que este projeto não era recente.

Bom, entendendo que o npm install não apresentaria problemas, eu olhei os demais scripts configurados no package.json para me certificar que nenhum deles faria nada fora do normal e fiquei aliviado neste primeiro momento. Eu tinha a certeza que era golpe, mas ainda estava longe de descobrir o quê e como, então precisaria fazer uma análise do código fonte mesmo. E que análise chata e tediosa.

O projeto era um monte de CRUDs, tanto no front quanto no back. Um suposto sistema de gestão escolar cheio de teaches, studentes, classes, etc. Como eu suspeitava que o código malicioso estaria no backend (já que seria o primeiro projeto a ser executado pela vítima) eu comecei a análise por lá, inicialmente olhando do server.js em diante, seguindo a lógica de execução e importações. No entanto acabei não achando nada. Droga!

Então decidi fazer nova investigação, olhando pasta a pasta, em ordem alfabética mesmo, para ver se notava algo suspeito e voilá! Dentro de uma pasta modules/departments eu acho uma pasta oculta chamada “.svn”. Eu já tinha visto isso antes, em 2007 eu trabalhei om Subversion (SVN) um versionador de código concorrente do Git e assim como no concorrente temos a pasta “.git”, no SVN temos a “.svn”. Isso por si só não era uma prova, poderia ser apenas desleixo se no passado eles versionavam esse projeto com SVN e depois mudaram para Git. Mas não era, porque dentro da pasta .svn tinha um único index.js cheio de código ininteligível dentro, tipo abaixo (trecho curto inicial, já identado).

Faz muitos anos que não trabalho com SVN mas como na época o Node.js nem existia, não fazia sentido ele precisar usar código JS em uma solução desktop. Fui pro ChatGPT e descobri que realmente, a pasta “.svn” deveria conter arquivos de metadados e jamais um script JS, com a IA inclusive dizendo que isso poderia ser um script malicioso, como eu já suspeitava.

Mas o que faria esse script? E como ele seria executado?

#4 – O Script Malicioso

Antes de investigar o que o script fazia, eu fui tentar encontrar o mecanismo de gatilho. Eu já tinha investigado visualmente os arquivos indidivualmente, mas agora eu sabia o que tinha de procurar: alguma importação da pasta “.svn”. Puxei um Ctrl + F no navegador mesmo e saí procurando um a um nos arquivos, mas eram tantas pastas e arquivos que cansei depois de alguns minutos. Tive uma ideia melhor.

Como eu sabia que não ia fazer mal clonar e instalar as dependências do projeto, eu fui para um VPS que poderia ser comprometido (toda segurança é pouco) e excluí a pasta “.svn” logo após fazer o clone e antes do npm install (vai quê alguma dependência maliciosa tivesse passado despercebida…).  Eu sabia que ao rodar a aplicação sem a pasta “.svn” ela iria crashar, pois em algum ponto deveria ter uma chamada ao módulo que eu excluí e o stacktrace me levaria até a origem do golpe. E bingo!

Aí fui até o department-service.js procurar pela importação e em um primeiro momento não achei. Foi aí que percebi que o scrollbar desse arquivo estava estranho, resolvi rolar até o final e olha o que encontrei.

Não julgo se você não enxergar. Eu não vi por duas vezes: a primeira quando corri os olhos por todo o fluxo de execução do programa e nem a segunda quando estava buscando pela pasta svn nos arquivos em ordem alfabética.

Esse maldito require importava o index.js de dentro da pasta “.svn”, consequentemente executando-o. Mas o que fazia o maldito script?

Voltei ao index.js para tentar entendê-lo e a primeira coisa que fiz foi buscar por requires de módulos de “baixo nível” do Node.js, já que se o golpista queria fazer algo na máquina das vítimas ele precisaria importar pacotes nativos do Node (já que não tinha nada suspeito instalado no projeto). Encontrei um require para o módulo “fs”, que permite manipular pastas e arquivos da máquina, o que é o suficiente para fazer um estrago. Eu já tinha ouvido falar de ataques envolvendo roubar arquivos .env da máquina de devs, um tipo de arquivo comum de conter senhas e chaves, achei que poderia ser algo do tipo.

Olhando os códigos ofuscados (técnica de “embaralhamento” do código), notei que muitas strings eram construídas através de caracteres hexadecimais, que quando você traduzia para ASCII usando conversores online, viravam palavras. Foi aí que tive a ideia de procurar algum desofuscador de código para JS na Internet e acabei achando alguns facilmente no Google. Quando colei o arquivo inteiro nele, ele respondeu dizendo que era código usado pelo Obfuscator.io e que eu poderia usar uma ferramenta específica para desofuscá-lo, que foi o que fiz. O resultado fica bem melhor, embora não faça milagre, olhe abaixo.

Nesse trecho acima ele importa as ferramentas para o crime. Depois, ele monta diversos locais onde vai buscar o que está querendo.

Ele usava de pacotes nativos para varrer a máquina do usuário e pegar arquivos de chaves, de senhas, preferências de navegadores e sabe o que são aquelas palavras na última linha? Identificadores de extensões do Google Chrome como a MetaMask, mais famosa carteira de criptomoedas do mercado, mas também buscava por carteiras como Exodus, Brave Wallet e Solana, enfim, passava um “pente-fino” atrás de coisas de valor na sua máquina para no fim, usar um código como abaixo para enviar tudo pra ele.

Resolvido o mistério e evitado o golpe.

Curso FullStack

#5 – Lições e Conclusão

Sabe aquele ditado que diz: “quando a esmola é demais, o sano desconfia?”, pois é, isso se aplica aqui também. Recrutador oferecendo salário alto, exigência baixa, quase te empurrando a vaga? Desconfie. Se o recrutador nem quer mostrar o rosto então, é sinal que é golpe.

Outra “red flag” é executar algo na sua máquina. Não faça isso. Se quiser muito fazer, faça em outra máquina ou em um perfil com limitações de segurança fortes. Jamais execute código de terceiros que você não sabe o que faz, não teve tempo de analisar o código fonte. Se o recrutador quer comprovar suas habilidades, sugira apresentar um projeto autoral seu ou, em último caso, desenvolver algo inédito, um desafio, mas jamais rodar código de terceiros.

Também vale ressaltar que exceto no caso de freelas, é comum a seleção ter mais de uma etapa, principalmente para vagas pagando bem como essas internacionais. Eles não vão sair contratando “qualquer um”. E aqui vai mais uma dica: se alguém de um país onde $10k vale muito mais do que no Brasil estiver te oferecendo esse salário, desconfie. Principalmente de países como Índia e China onde tem muito dev bom que pode ser contratado por muito menos que isso. E isso não é preconceito, é apenas a dinâmica do mercado: países de moeda forte contratam mão de obra especializada e mais barata em países de moeda fraca e não o contrário.

Enfim, espero qeu este artigo ajude a evitar novos golpes, ao menos entre quem acompanha meus conteúdos.

Até a próxima!

Curso Web23

TAGS:

Olá, tudo bem?

O que você achou deste conteúdo? Conte nos comentários.

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

10 Replies to “Decifrando Golpe para pegar Devs Web3/Blockchain”

Rogers

Opa! Tudo bem? Fui vítima, a duas semanas atrás fui abordado e acabei rodando a aplicação em um mac… Agora fiquei preocupado pois foi tudo muito suspeito…

Luiz Duarte

Se for o mesmo golpe ele pega uma série de coisas da sua máquina e envia para o golpista. Recomendo trocar senhas de tudo que for importante, ativar 2FA em tudo que ainda não está ativado e talvez até formatar a máquina. Se tem cripto em carteira, recomendo que crie uma nova e transfira os fundos para ela pois a antiga pode ter sido comprometida.

Rafael

Cara, sensacional esse conteúdo.

Luiz Duarte

Valeu Rafael!

Marcos Silva

Cara acabaram de me mandar esse golpe no LinkedIn e esse seu artigo me salvou, esse mesmo tal de Ysai Galarza… Imagino quantos Devs cairam nisso.

Luiz Duarte

Sim, mas tome cuidado que são vários perfis aprontando esse golpe, o Ysai é apenas um deles, veja esse post: https://www.linkedin.com/feed/update/urn:li:activity:7261393273213120512/

Marcos

Cara, acabei de ser abordado pelo Ysai Galarza! Há mais ou menos 1 mês comecei a ver muitos posts relacionados a esses golpes em teste de web3, e só dele me mandar o link pro slack já fiquei desconfiado, ai fui pesquisar “evm voting dapp” e por sorte acabei caindo neste seu post.
Muito obrigado por expor, me salvou!

Luiz Duarte

Fico feliz que o artigo tenha ajudado. Tome cuidado, tem vários outros perfis envolvidos no mesmo golpe, olhe esse post: https://www.linkedin.com/feed/update/urn:li:activity:7261393273213120512/

Rodrigo Gonçalves

Olá vim relatar o meu caso não teve um final feliz. Infelizmente fui roubado por esse golpista, e eu ainda o questionei sobre este código suspeito e ele me respondeu com o seguinte: “It is related with IP check and process detect code. Because we have to know your working time track.”. Mas já era tarde, ele já tinha posse das minhas chaves e, quando me dei conta, ele já tinha limpado minha carteira da Metamask. E este não foi o único, já houveram mais 3 abordagens semelhantes me pedindo pra rodar código de terceiros na máquina. Muito cuidado, pessoal!

Luiz Duarte

Obrigado pela coragem de relatar o ocorrido Rodrigo. É muito importante que o pessoal saiba a gravidade de rodar código de terceiros e o risco que estão correndo ao fazer isso.