Skip to content
Programing

Ataque à Cadeia de Suprimentos: O Sequestro do Laravel-Lang via Tags do GitHub

Published: Duration: 7:13
0:00 0:00

Transcript

Apresentadora: E aí, pessoal, bem-vindos de volta ao Allur! Eu sou a Juliana Santos e hoje a gente vai mergulhar em um assunto que tirou o sono de muita gente na comunidade PHP e Laravel recentemente. Sabe aquele ditado de que "você é tão forte quanto o seu elo mais fraco"? Pois é, no desenvolvimento de software moderno, esse elo muitas vezes não está no código que a gente escreve, mas nas dependências que a gente traz para dentro do projeto. Recentemente, o ecossistema Laravel sofreu um baque com o sequestro do pacote `laravel-lang`. Não foi um erro de digitação, não foi um bug no framework... foi um ataque direto à nossa confiança na infraestrutura. A gente vai entender hoje como mais de 700 versões de pacotes foram envenenadas e o que isso significa para a nossa segurança daqui para frente. Se você usa Laravel, ou melhor, se você usa qualquer gerenciador de pacotes, fica aqui porque o papo de hoje é essencial. Apresentadora: E para me ajudar a dissecar essa anatomia do ataque, eu trouxe um convidado que entende tudo de segurança e infraestrutura no mundo PHP. Ele é desenvolvedor sênior e consultor de segurança cibernética, Rafael Menezes! Rafa, seja muito bem-vindo ao Allur, cara. É um prazer ter você aqui para clarear essa história pra gente. Convidado: Valeu demais, Juliana! O prazer é todo meu. Olha, o assunto é tenso, mas é fascinante do ponto de vista técnico. É aquele tipo de coisa que faz a gente olhar para o `composer install` com outros olhos a partir de agora, né? (risos) Apresentadora: Com certeza! E Rafa, vamos direto ao ponto. Quando a gente fala de ataque à cadeia de suprimentos, muita gente pensa logo em "typosquatting" — tipo alguém criar um pacote chamado `laravel-lanng` com dois 'N's pra gente instalar por erro. Mas esse caso do `laravel-lang` foi muito mais sofisticado, né? O que aconteceu exatamente? Convidado: Pois é, Ju. Esse foi o "pulo do gato". Os caras não tentaram te enganar no nome do pacote. Eles foram na fonte original. O `laravel-lang` é o pacote que quase todo mundo usa para traduzir validações, interfaces, essas coisas. O que os atacantes fizeram foi o que a gente chama de sequestro de tags no GitHub. Eles conseguiram manipular a infraestrutura de tal forma que as versões legítimas do pacote — a v12.0.1, por exemplo — passassem a apontar para um código malicioso em vez do código original. Apresentadora: Espera, mas como assim? Se eu dou um `composer require` no repositório oficial, o GitHub não deveria garantir que aquela tag é imutável? Convidado: Aí é que está a pegadinha, cara. O GitHub permite que você aponte tags para commits de forks em certas circunstâncias ou, se houver um comprometimento de conta com permissão de escrita, o atacante pode simplesmente deletar a tag e recriar ela apontando para um commit malicioso. O Composer, quando vai buscar a versão, vê que a tag existe, o nome do pacote está certo, a URL do repositório é a oficial... e ele baixa. Pro desenvolvedor que tá ali na correria, é totalmente invisível. Foram mais de 700 versões comprometidas de uma vez. Imagina o alcance disso! Apresentadora: Nossa, 700 versões? Isso pega desde o sistema legado que tá rodando há anos até o projeto que começou ontem. E uma vez que esse código "podre" entra na pasta `vendor` do meu projeto... o que ele faz? Ele fica ali quietinho ou ele já sai atacando? Convidado: Ele é bem agressivo, Ju. E a sacada foi genial — e maligna, claro. Eles usaram o próprio `autoload` do Composer. Sabe aquela seção no `composer.json` onde a gente define arquivos que devem ser carregados automaticamente? Eles injetaram um arquivo lá, tipo um `helpers_extra.php`. O que acontece? Assim que o PHP sobe a aplicação e carrega o autoload — o que acontece em toda requisição — o código malicioso é executado. Você não precisa chamar uma função "atacar()", ele já roda sozinho no momento que o ambiente é preparado. Apresentadora: Caramba, massa... quer dizer, massa a explicação, mas que perigo! (risos). Então o desenvolvedor nem precisa dar um "play" em nada. Abriu o site, o código rodou. E o que esse código estava buscando? Convidado: O "ouro" de qualquer aplicação Laravel: o arquivo `.env`. O script varria o diretório em busca de segredos. Chaves da AWS, credenciais do banco de dados, tokens do Stripe para pagamentos, chaves do Mailgun... e, crucialmente, a `APP_KEY` do Laravel. Depois de coletar tudo, ele encodava em Base64 e mandava pra um servidor de Comando e Controle, o C2, fingindo que era uma requisição de telemetria comum. Tipo assim, pros logs do servidor, parecia só um acesso externo normal. Apresentadora: Isso é assustador, Rafa. Porque a gente confia tanto no ecossistema que, às vezes, esquece que a pasta `vendor` tem permissão de leitura de tudo que tá na raiz do projeto. Agora, a pergunta que não quer calar: se eu sou um dev Laravel e percebi que fui afetado, o que eu faço agora? Só atualizar o pacote resolve? Convidado: Olha, Juliana, nesse caso, só atualizar é "enxugar gelo". Se o seu arquivo `.env` foi exposto, ele já era. O primeiro passo é o óbvio: `composer clear-cache` para limpar a sujeira local, deletar a `vendor`, deletar o `composer.lock` e reinstalar tudo do zero, garantindo que você está pegando as versões que os mantenedores já limparam. Mas o passo crítico, que muita gente esquece, é a rotação de credenciais. Apresentadora: Rotação total, né? Tipo, mudar a senha do banco, gerar novas chaves de API... Convidado: Exato! E inclusive a `APP_KEY`. E aqui tem um detalhe: se você mudar a `APP_KEY`, todas as sessões dos seus usuários caem e os cookies criptografados param de funcionar. É um transtorno, mas é o único jeito de garantir que o atacante não vai usar um cookie antigo pra entrar no seu sistema. É uma limpeza pesada, cara. Não tem atalho. Apresentadora: É o preço da segurança, né? Rafael, que aula! Antes de a gente encerrar, o que fica de lição pra gente não passar por isso de novo? Tem alguma ferramenta que ajude? Convidado: Com certeza. O comando `composer audit` é obrigatório hoje em dia. Ele checa se alguma dependência sua tem vulnerabilidade conhecida. Mas a lição maior é a vigilância. A gente não pode mais tratar dependência de terceiros como "código sagrado". É bom ter ferramentas de monitoramento que avisem se o seu servidor começar a fazer conexões HTTP estranhas pra domínios que você não conhece. Segurança agora é parte do dia a dia do dev, não é mais só coisa do pessoal de Infra. Apresentadora: Com certeza! "Gerenciar com segurança o código de terceiros", acho que essa é a frase que resume bem o nosso novo desafio. Rafa, valeu demais por compartilhar essa experiência com a gente aqui no Allur. Foi um papo muito esclarecedor, mesmo que um pouco assustador! (risos) Convidado: (risos) Com certeza! Valeu pelo convite, Ju. E pessoal, fiquem de olho nos seus `composer.lock`, hein! Até a próxima! Apresentadora: É isso aí, pessoal. O caso do `laravel-lang` é um lembrete real de que a nossa cadeia de suprimentos é um alvo valioso. Se você quiser saber mais sobre como proteger seus apps Laravel, vou deixar uns links úteis na descrição do episódio. Não esquece de seguir o Allur no seu agregador de podcasts favorito e mandar esse episódio pro seu colega de trabalho que acha que segurança é "frescura". Valeu por sintonizar o Allur, eu sou a Juliana Santos e a gente se vê no próximo episódio. Tchau!

Tags

security php laravel composer vulnerabilities supply-chain