Os primeiros resultados da investigação do incidente relacionado à identificação de dois commits maliciosos com um backdoor no repositório Git do projeto PHP foram publicados. Durante o exame das atividades dos atacantes, concluiu-se que o servidor git.php.net, onde o repositório git estava hospedado, não foi hackeado, mas a base de dados com as contas dos desenvolvedores do projeto foi comprometida.
Não se descarta que os criminosos tenham conseguido baixar a base de usuários armazenada no SGBD do servidor master.php.net. O conteúdo de master.php.net já foi transferido para o novo servidor main.php.net, que foi configurado do zero. Todas as senhas dos desenvolvedores utilizadas para acessar a infraestrutura php.net foram redefinidas e o processo de troca foi iniciado por meio de um formulário de recuperação de senha. Os repositórios git.php.net e svn.php.net permanecem disponíveis em modo somente leitura (o desenvolvimento foi transferido para o GitHub).
Após a descoberta do primeiro commit malicioso feito pela conta de Rasmus Lerdorf, fundador do PHP, surgiu a suposição de que sua conta havia sido hackeada e Nikita Popov, um dos principais desenvolvedores do PHP, reverteu as alterações e bloqueou os direitos de commit da conta problemática. Depois de algum tempo, foi percebido que o bloqueio não fazia sentido, pois sem a verificação dos commits por assinatura digital, qualquer participante com acesso ao repositório php-src poderia fazer alterações, substituindo um nome de autor fictício.
Em seguida, os atacantes enviaram um commit malicioso em nome do próprio Nikita. Através da análise dos logs do serviço gitolite, utilizado para organizar o acesso aos repositórios, foi feita uma tentativa de identificar o participante que realmente fez as alterações. Apesar do registro de todos os commits estar ativado, não havia entradas nos logs para duas alterações maliciosas. Ficou claro que houve uma comprometimento da infraestrutura, pois os commits foram adicionados diretamente, contornando a conexão através do gitolite.
O servidor git.php.net foi rapidamente desligado, e o repositório primário foi transferido para o GitHub. Na pressa, passou-se por alto que, além do SSH usando gitolite, havia outra entrada que permitia enviar commits via HTTPS. Neste caso, para interagir com o Git, usou-se o backend git-http-backend, e a autenticação foi realizada através do servidor HTTP Apache2, que verificava as credenciais por meio de uma consulta ao banco de dados, hospedado em um SGBD em servidor master.php.net. O acesso era permitido não apenas por chaves, mas também por uma senha comum. A análise dos logs do servidor http confirmou que alterações maliciosas foram adicionadas via HTTPS.
Ao examinar os logs, foi identificado que os atacantes não se conectaram na primeira tentativa, mas inicialmente tentaram adivinhar o nome da conta, e após a identificação, conseguiram entrar na primeira tentativa, ou seja, sabiam antecipadamente as senhas de Rasmus e Nikita, mas não conheciam seus logins. Se os atacantes conseguiram acessar o SGBD, não está claro por que não utilizaram imediatamente o login correto lá especificado. Esta inconsistência ainda não foi devidamente explicada. A invasão do master.php.net é considerada o cenário mais provável, já que neste servidor foram utilizados códigos muito antigos e um sistema operacional desatualizado, que há muito não recebia atualizações e continha vulnerabilidades não corrigidas.
Entre as ações tomadas, destaca-se a reinstalação do ambiente do servidor master.php.net e a migração dos scripts para a nova versão PHP 8. O código para trabalhar com o SGBD foi refeito para utilizar consultas parametrizadas, que dificultam a injeção de código SQL. Para armazenar hashes de senhas no banco de dados, foi utilizado o algoritmo bcrypt (anteriormente, as senhas eram armazenadas usando o hash MD5 não confiável). As senhas existentes foram redefinidas e foi proposto que um novo password fosse estabelecido através do formulário de recuperação de senha. Como o acesso aos repositórios git.php.net e svn.php.net via HTTPS estava vinculado aos hashes MD5, decidiu-se manter git.php.net e svn.php.net em modo somente leitura, além de transferir todos os repositórios restantes de extensões PECL para o GitHub, seguindo o mesmo padrão do repositório principal do PHP.
Fonte: opennet.ru
