Skip to main content

Como testar vulnerabilidades de segurança no PHP Composer com o Snyk

Escrito por
Headshot of DeveloperSteve Coochin

DeveloperSteve Coochin

blog social php composer

20 de maio de 2021

0 minutos de leitura

O PHP é amplamente usado para impulsionar sites. De blogs a lojas virtuais, ele faz parte do nosso dia a dia e alimenta grande parte da internet que usamos hoje. De acordo com um relatório da Wappalyzer sobre as principais linguagens de programação de 2020, o PHP detém 79% do mercado de linguagens de backend usadas atualmente na internet.

Um dos maiores desafios das bibliotecas PHP ao longo dos anos tem sido o gerenciamento de pacotes. Existem algumas maneiras de instalar e manter bibliotecas com facilidade, incluindo PECL e CPAN. Vale destacar o PEAR, lançado em 2009, que se tornou uma das primeiras formas de carregar e distribuir bibliotecas. Mais tarde, ele deu origem ao PEAR2, que acabou sendo incorporado ao PHP Composer (que já está no seu nono ano!), tema que vamos explorar hoje.

O que é o PHP Composer?

O PHP Composer é uma ferramenta de gerenciamento de pacotes usada para instalar e atualizar bibliotecas e dependências em PHP. Ela se popularizou rapidamente pela forma como carrega e mantém bibliotecas e dependências em frameworks e projetos. Usada pela linha de comando, ela permite instalar aplicações, bibliotecas e dependências PHP — com recursos de carregamento automático — nos projetos. É importante observar que o PHP Composer não instala nada globalmente.

Vamos falar sobre a segurança do PHP Composer

Embora o PHP Composer acelere o desenvolvimento de aplicativos, ele reduz um pouco o nível de controle e visibilidade. Assim, apesar de facilitar a programação, fica a pergunta: será que ele faz isso com segurança? Com o Snyk, consigo responder a essa pergunta com apenas alguns cliques.

Antes de analisar algumas implementações do PHP Composer em diferentes plataformas, quero destacar alguns pontos.

  • Como usuário e desenvolvedor dessas plataformas, fiquei surpreso com minhas descobertas por vários motivos. Isso reforça a importância de promover continuamente a conscientização e a educação para desenvolver software com segurança.

  • Em todos os casos abaixo, entrei em contato com as comunidades para conversar sobre as vulnerabilidades e alertar sobre elas quando ainda não eram conhecidas (muitas já tinham correções).

Kirby

Para começar a usar o Kirby com o Composer, siga as instruções simples de configuração do Kirby com o Composer na documentação:

composer create-project getkirby/starterkit hello-world

O Composer instala a versão mais recente do Kirby (3.3.5), que, de acordo com o Snyk Vulnerability Database, tem apenas uma vulnerabilidade de gravidade média e outra de gravidade baixa. No entanto, a CLI do Snyk encontra um problema em uma das dependências: o PHPMailer, que está na versão 6.2.0. Essa versão do PHPMailer apresenta uma vulnerabilidade de alta gravidade de cross-site scripting.

Esse problema foi corrigido no PHPMailer 6.4.1 (versão disponível no momento da redação) e pode ser resolvido executando `composer upgrade` para instalar a versão mais recente. O histórico do módulo revela um longo histórico de vulnerabilidades. Por isso, recomendamos fortemente fazer verificações regulares com o Snyk Code para receber alertas sobre novas vulnerabilidades.

Joomla

O repositório do Joomla inclui um arquivo do Composer que instala todas as dependências necessárias para executar o Joomla. Ao fazer uma verificação com a CLI do Snyk, encontramos 2 problemas e 4 caminhos vulneráveis.

✗ Medium severity vulnerability found in phpmailer/phpmailer
  Description: Improper Input Validation
  Info: https://snyk.io/vuln/SNYK-PHP-PHPMAILERPHPMAILER-570519
  Introduced through: phpmailer/phpmailer@5.2.28
  From: phpmailer/phpmailer@5.2.28
  Fixed in: 6.1.6

✗ Medium severity vulnerability found in paragonie/random_compat
  Description: Man-in-the-Middle (MitM)
  Info: https://snyk.io/vuln/SNYK-PHP-PARAGONIERANDOMCOMPAT-72081
  Introduced through: paragonie/random_compat@1.4.3, joomla/session@1.6.0, paragonie/sodium_compat@1.9.1
  From: paragonie/random_compat@1.4.3
  From: joomla/session@1.6.0 > paragonie/random_compat@1.4.3
  From: paragonie/sodium_compat@1.9.1 > paragonie/random_compat@1.4.3
  Fixed in: 2.0

Organization:      developersteve-285
Package manager:   composer
Target file:       composer.lock
Project name:      joomla/joomla-cms
Open source:       no
Project path:     /php/joomla-cms
Licenses:          enabled

Tested 39 dependencies for known issues, found 2 issues, 4 vulnerable paths.

Tip: Detected multiple supported manifests (2), use --all-projects to scan all of them at once.

Mais uma vez, encontramos o PHP Mailer, que instala a versão 5.2.28. Essa versão apresenta um problema de validação inadequada de entrada, e o Snyk informa que ele foi corrigido na versão 6.1.6.

O Snyk também identificou uma vulnerabilidade de ataque man-in-the-middle (MITM), introduzida por `paragoine/random_compat` na versão 1.4.3 e associada a `joomla/session`. Ataques MITM são extremamente perigosos, pois permitem a interceptação de comunicações eletrônicas. Para saber mais sobre esse tipo de vulnerabilidade, confira nosso artigo sobre ataques man-in-the-middle.

Drupal

Com o guia prático no repositório do Drupal, podemos começar rapidamente usando a versão de desenvolvimento mais recente do branch 9.x.

composer create-project drupal-composer/drupal-project:9.x-dev some-dir --no-interaction

Enquanto a instalação é executada, podemos verificar se há problemas conhecidos no Snyk Vulnerability Database, que também mostra vulnerabilidades no histórico de versões do Drupal às quais devemos ficar atentos. Em seguida, usando a CLI do Snyk, vemos que a versão 9.x não apresenta vulnerabilidades. Para reforçar a segurança, podemos fazer o mesmo com o Drupal 8.x e confirmar que ele também não apresenta vulnerabilidades. Ótimo!

Agora que essas duas versões foram verificadas, vamos analisar também o Drupal 7, que ainda é bastante usado. Para isso, clone o repositório do Drupal 7.x.

Ao verificar a versão 7.x, os resultados da CLI do Snyk são um pouco diferentes: encontramos 9 vulnerabilidades e 18 caminhos vulneráveis. Os problemas vão desde exploração de upload de arquivos até DoS, execução remota de código (RCE) e execução arbitrária de código (ACE).

✗ Medium severity vulnerability found in drupal/drupal
  Description: Cross-site Scripting (XSS)
  Info: https://snyk.io/vuln/SNYK-PHP-DRUPALDRUPAL-174348
  Introduced through: drupal/drupal@7.80.0, drupal/composer_autoloader@1.3.0
  From: drupal/drupal@7.80.0
  From: drupal/composer_autoloader@1.3.0 > drupal/drupal@7.80.0
  Fixed in: 8.5.15, 8.6.15

✗ Medium severity vulnerability found in drupal/drupal
  Description: Arbitrary Code Execution
  Info: https://snyk.io/vuln/SNYK-PHP-DRUPALDRUPAL-174350
  Introduced through: drupal/drupal@7.80.0, drupal/composer_autoloader@1.3.0
  From: drupal/drupal@7.80.0
  From: drupal/composer_autoloader@1.3.0 > drupal/drupal@7.80.0
  Fixed in: 8.5.15, 8.6.15

✗ Medium severity vulnerability found in drupal/drupal
  Description: Access Control Bypass
  Info: https://snyk.io/vuln/SNYK-PHP-DRUPALDRUPAL-174352
  Introduced through: drupal/drupal@7.80.0, drupal/composer_autoloader@1.3.0
  From: drupal/drupal@7.80.0
  From: drupal/composer_autoloader@1.3.0 > drupal/drupal@7.80.0
  Fixed in: 8.5.15, 8.6.16

✗ Medium severity vulnerability found in drupal/drupal
  Description: Access Restriction Bypass
  Info: https://snyk.io/vuln/SNYK-PHP-DRUPALDRUPAL-538566
  Introduced through: drupal/drupal@7.80.0, drupal/composer_autoloader@1.3.0
  From: drupal/drupal@7.80.0
  From: drupal/composer_autoloader@1.3.0 > drupal/drupal@7.80.0
  Fixed in: 8.7.11, 8.8.1

✗ Medium severity vulnerability found in drupal/drupal
  Description: Arbitrary File Upload
  Info: https://snyk.io/vuln/SNYK-PHP-DRUPALDRUPAL-538568
  Introduced through: drupal/drupal@7.80.0, drupal/composer_autoloader@1.3.0
  From: drupal/drupal@7.80.0
  From: drupal/composer_autoloader@1.3.0 > drupal/drupal@7.80.0
  Fixed in: 8.7.11, 8.8.1

✗ Medium severity vulnerability found in drupal/drupal
  Description: Denial of Service (DoS)
  Info: https://snyk.io/vuln/SNYK-PHP-DRUPALDRUPAL-538570
  Introduced through: drupal/drupal@7.80.0, drupal/composer_autoloader@1.3.0
  From: drupal/drupal@7.80.0
  From: drupal/composer_autoloader@1.3.0 > drupal/drupal@7.80.0
  Fixed in: 8.7.11, 8.8.1

✗ High severity vulnerability found in drupal/drupal
  Description: Arbitrary Code Execution
  Info: https://snyk.io/vuln/SNYK-PHP-DRUPALDRUPAL-1048286
  Introduced through: drupal/drupal@7.80.0, drupal/composer_autoloader@1.3.0
  From: drupal/drupal@7.80.0
  From: drupal/composer_autoloader@1.3.0 > drupal/drupal@7.80.0

✗ High severity vulnerability found in drupal/drupal
  Description: Remote Code Execution (RCE)
  Info: https://snyk.io/vuln/SNYK-PHP-DRUPALDRUPAL-173722
  Introduced through: drupal/drupal@7.80.0, drupal/composer_autoloader@1.3.0
  From: drupal/drupal@7.80.0
  From: drupal/composer_autoloader@1.3.0 > drupal/drupal@7.80.0
  Fixed in: 8.5.11, 8.6.10

✗ High severity vulnerability found in drupal/drupal
  Description: Access Restriction Bypass
  Info: https://snyk.io/vuln/SNYK-PHP-DRUPALDRUPAL-70088
  Introduced through: drupal/drupal@7.80.0, drupal/composer_autoloader@1.3.0
  From: drupal/drupal@7.80.0
  From: drupal/composer_autoloader@1.3.0 > drupal/drupal@7.80.0
  Fixed in: 8.3.1, 8.2.8

Organization:      developersteve-285
Package manager:   composer
Target file:       composer.lock
Project name:      drupal-composer/drupal-project
Open source:       no
Project path:      /Users/developersteve/Desktop/Code/php/drupal/7/my_site_name_dir
Licenses:          enabled

Tested 40 dependencies for known issues, found 9 issues, 18 vulnerable paths.

Com base nessas descobertas, recomendo atualizar para a versão 8.x, no mínimo, para manter sua implementação do Drupal segura.

Ajude as comunidades contribuindo com melhorias

Quando comecei a testar algumas dessas plataformas tão usadas, não sabia ao certo o que encontraria. Como mencionei, os resultados foram surpreendentes. Desenvolvedores, equipes ou empresas que usam essas plataformas em produção sem conhecer os riscos talvez não saibam exatamente o que estão incorporando. Espero que este artigo ajude mais equipes a se manterem seguras.

Mas sou apenas um desenvolvedor, e este é apenas um artigo. Para gerar um impacto significativo na segurança, incentivo você a testar os projetos por conta própria e contribuir com as correções. Essas comunidades incríveis são, muitas vezes, mantidas por desenvolvedores apaixonados que querem criar ferramentas para ajudar pessoas no mundo todo — e precisam do seu apoio.

Comece a resolver desafios de capture the flag

Aprenda a resolver desafios de capture the flag assistindo sob demanda ao nosso workshop virtual introdutório.

Leia mais

blog feature snyk container custom base recommendations
Blog

Conheça o Evo Agentic AppSec: segurança que acompanha o ritmo do desenvolvimento com IA

O desenvolvimento impulsionado por IA está avançando mais rápido do que os fluxos de trabalho de segurança tradicionais. O AppSec agentivo da Snyk usa agentes de segurança para encontrar, corrigir e verificar vulnerabilidades continuamente, enquanto as pessoas definem os critérios.

feature insights context
Blog

Os ataques autônomos já chegaram. A defesa precisa acompanhar o ritmo.

Os atacantes autônomos estão reduzindo o tempo disponível para a defesa. Saiba como a descoberta, a correção, a validação e a prevenção contínuas ajudam as equipes de segurança a acompanhar esse ritmo.

feature insights context
Blog

A prevenção é essencialmente um problema resolvido?

A prevenção em código gerado por agentes está resolvida do ponto de vista arquitetural — mas escolher controles que protejam a segurança sem desacelerar o desenvolvimento continua sendo um desafio.