Em 28 de março de 2021, dois commits apareceram no branch master do php-src no git.php.net, enviados sob os nomes de Rasmus Lerdorf, criador do PHP, e do desenvolvedor principal Nikita Popov. Tinham o título '[skip-ci] Fix typo' — um assunto pequeno o bastante para passar sem revisão e, com o prefixo skip-ci, projetado também para contornar a integração contínua. A alteração, em um cabeçalho incluído amplamente, verificava uma variável de servidor quanto ao HTTP User-Agent e, se ela começasse com a string 'zerodium', executava o restante do cabeçalho como código PHP: execução remota de código em qualquer servidor que rodasse o interpretador envenenado.
Não funcionou, e o motivo é instrutivo: os commits foram detectados em poucas horas por membros da comunidade que liam o feed público — um comentarista sinalizou a alteração no próprio commit, e o desenvolvedor do PHP Jake Birchall confirmou que ele executava código a partir do cabeçalho user-agent. Popov anunciou na mesma noite que tudo apontava para um comprometimento do servidor git.php.net, e não de qualquer conta individual. O texto do commit trazia a linha 'REMOVETHIS: sold to zerodium, mid 2017', sugerindo que o backdoor havia sido negociado com um fornecedor de exploits anos antes.
A resposta do projeto foi remover o ativo em vez de consertá-lo. O git.php.net foi descontinuado na hora; os espelhos no GitHub, até então secundários, tornaram-se os repositórios canônicos; o acesso de escrita passou para a organização php no GitHub, com autenticação de dois fatores exigida para associação; e todos os lançamentos do PHP foram suspensos por duas semanas enquanto os repositórios eram auditados em busca de outras corrupções. Os dois commits nunca chegaram a um único usuário final.
Nenhum impacto para o usuário final — ambos os commits foram revertidos antes de qualquer lançamento. O custo real foi a própria infraestrutura git do projeto e um congelamento de duas semanas em todos os lançamentos do PHP
O projeto mantinha seu próprio servidor git com um sistema de karma caseiro para acesso de escrita — uma superfície de autenticação sob medida que a pequena equipe principal tinha de defender inteiramente sozinha.
A identidade dos commits naquele servidor baseava-se na assinatura no momento do push, não em assinaturas criptográficas, de modo que qualquer um que controlasse o servidor podia fazer commits em nome dos nomes mais confiáveis do projeto.
O disfarce foi ajustado ao processo de revisão: uma correção de 'typo' de uma palavra, em um cabeçalho incluído em quase todo lugar, prefixada para pular a CI por completo.
Os espelhos no GitHub que salvaram o projeto haviam passado anos como cópias de segunda classe — recuperáveis apenas porque a equipe decidiu promovê-los em condições de emergência.
A lição
Auto-hospedar o controle de versão não traz ao projeto nada além de uma superfície de ataque que ele precisa defender sozinho. Espelhos só compensam se estiverem prontos para se tornar a fonte da verdade na hora em que você precisar deles.
O php.net suspendeu formalmente os lançamentos por duas semanas enquanto a investigação corria, declarando que os commits maliciosos foram 'notados e revertidos imediatamente e, portanto, nunca chegaram aos usuários finais'. Os repositórios foram revisados em busca de corrupção além dos dois commits, o GitHub tornou-se a casa canônica permanente do php-src, e a associação à organização agora exige 2FA. O comentário de código do backdoor — 'sold to zerodium, mid 2017' — permanece público no histórico de commits; o fornecedor nunca confirmou tê-lo comprado.
CONFIRA AS EVIDÊNCIAS
As fontes
- Changes to Git commit workflow (php.internals #113838) news-web.php.net · news-web.php.net ·
- PHP releases on hold php.net · php.net ·
- [skip-ci] Fix typo (commit c730aa26) GitHub php/php-src · github.com ·
- PHP's Git server hacked to add backdoors to PHP source code BleepingComputer · bleepingcomputer.com ·