Gerenciar um registro de código aberto significa apagar incêndios. Outra conta de mantenedor é comprometida, outro pacote malicioso. A remoção está sempre um upload atrasada. O trabalho nunca termina, e a maioria dos registros, gerenciados por pequenas equipes com poucos recursos, frequentemente está sobrecarregada demais para fazer muito além de acompanhar o ritmo. Mas, ultimamente, temos visto mudanças mais positivas no mundo do código aberto, com ecossistemas realizando as mudanças estruturais que impedem que um tipo de ataque funcione.
A pequena equipe que mantém Packagist.org e Composer, o registro e gerenciador de pacotes por trás do mundo PHP, tem realizado um trabalho de segurança preventivo e deliberado, fazendo melhorias significativas. Aikido é um grande apoiador desse esforço. O feed Intel da Aikido impulsiona o bloqueio de malware no Composer para downloads. Ele é ativado por padrão para Composer 2.10 e superior para todos. Isso se soma a uma série de outras mudanças que o Packagist fez e está fazendo, cada uma trabalhando para encerrar categorias inteiras de ataques em vez de perseguir pacotes individuais.
Estamos começando a ver essa tendência de melhorias em todos os registros de pacotes, e estamos entusiasmados em poder apoiar essas iniciativas. Os desenvolvedores PHP podem ficar mais tranquilos agora, sabendo que há mais salvaguardas em vigor para impedi-los de instalar malware acidentalmente.
Bloqueio de malware no Composer
A vitória mais fácil é impedir que os usuários instalem uma versão de pacote que já é conhecida por ser maliciosa. Graças ao Aikido Intel, o Composer agora sabe quais versões foram sinalizadas e não as instalará.
Quando o Aikido sinaliza uma versão de pacote maliciosa, essa sinalização reside nos metadados do pacote que o Composer baixa. O framework de política de dependência do Composer 2.10 remove a versão sinalizada do pool de resolução, assim, `composer update`, `composer require` e `composer create-project` não a selecionarão. A verificação mais importante é a do `composer install`, porque uma versão sinalizada após a gravação do seu lockfile falha na próxima instalação. Se, por algum motivo, um usuário ainda quiser baixar um pacote bloqueado, ele pode substituí-lo manualmente.
Esta integração funciona porque é:
- Aberto: O feed que a Aikido fornece ao Packagist é licenciado sob CC-BY, então a proteção não está vinculada a um contrato de seis dígitos, e a porta permanece aberta para que outros provedores de dados se conectem. A segurança que apenas os bem-financiados podem pagar não nos protege.
- Ativado por padrão: Uma proteção que exige que as pessoas adiram não protege quase ninguém (porque é difícil fazer as pessoas aderirem). Os padrões são onde a segurança do ecossistema reside, e o padrão 2.10 não exige nada dos usuários para que eles se beneficiem.
- Rápido o suficiente: Versões maliciosas geralmente são removidas em poucas horas, então um feed que as sinaliza em minutos protege os usuários na janela entre a detecção e a remoção. Como o bloqueio só funciona quando algo é detectado, uma detecção lenta não ajudaria muito.
- Automatizado: Como o pacote malicioso é bloqueado assim que a Aikido o detecta, não há atraso extra esperando que alguém manualmente coloque o pacote na lista negra ou o remova, então os usuários são protegidos mais rapidamente.
Integrar a detecção da Aikido em cada instalação foi apenas uma das melhorias que o Packagist lançou recentemente.
Fechando portas em vez de remendar buracos
Em seguida, o re-tagging. Publicar no Packagist sempre significou enviar uma tag git, e o registro puxa o que essa tag aponta. Esse sistema permitia que atacantes que sequestravam uma conta confiável re-etiquetassem uma versão publicada e a apontassem para código malicioso, de modo que esse número de versão agora carregasse algum payload (o que vimos no ataque recente ao Laravel-Lang). A resposta do Packagist, a imutabilidade de versão estável, significa que uma versão estável publicada não pode mais ser reescrita. Isso encerra os ataques de re-tagging como um todo. O GitHub tem o equivalente, mas o tornou opcional. O Packagist o tornou obrigatório.
Finalmente, tentar fazer as pessoas atualizarem o software é extremamente difícil. Um bloqueio padrão só ajuda as pessoas que estão executando um Composer atual, e muitas não estão. Uma imagem CI ou um agente de IA frequentemente executa uma versão de anos atrás, então o Private Packagist pode exigir um Composer atual para se conectar. Ele também se recusa a servir os arquivos de uma versão sinalizada a qualquer cliente, antigo ou novo.
O Packagist.org ainda não está pronto, e eles têm algumas melhorias de segurança a caminho. Eles estão planejando uma idade mínima de lançamento, o que mitigaria ataques que dependem de uma janela curta antes que a detecção se atualize (enquanto isso, você pode obter proteção semelhante com o Aikido Safe Chain, também gratuito). Eles também estão criando a propriedade organizacional, que permitirá MFA obrigatória, bem como lançamentos em fases, que o npm lançou recentemente.
Movendo-se em direção a registros de pacotes mais seguros
Esta não é apenas uma história do PHP. Como mencionamos, o npm está se movendo na mesma direção com a publicação em fases, mas também desativando scripts de instalação automáticos. O PyPI tornou a 2FA obrigatória e construiu um sistema de quarentena, e crates.io e RubyGems adotaram a publicação confiável através de um design OpenSSF compartilhado. Os ecossistemas estão se movendo na direção certa. Queremos ver muito mais disso, mais rápido, e continuamos apoiando onde podemos.
Você é um desenvolvedor PHP? Clientes Composer anteriores à versão 2.10 não possuem este recurso, então certifique-se de atualizar hoje se ainda não o fez. Não usa PHP? O Aikido Safe Chain é uma ferramenta de código aberto que também impede a instalação de pacotes novos ou maliciosos antes que sejam instalados em seu dispositivo.
Independentemente dos ecossistemas dos quais você depende, você pode verificar o que o Aikido Intel está sinalizando na internet. O feed é público e gratuito em intel.aikido.dev.

