Skip to main content

Pruebas de vulnerabilidades de seguridad en PHP Composer con Snyk

Escrito por
Headshot of DeveloperSteve Coochin

DeveloperSteve Coochin

blog social php composer

20 de mayo de 2021

0 minutos de lectura

PHP se usa ampliamente para impulsar sitios web. Desde blogs hasta comercio electrónico, está presente en nuestra vida cotidiana y potencia gran parte de Internet tal como lo usamos hoy. Según un informe de Wappalyzer sobre los principales lenguajes de programación de 2020, PHP tiene una participación del 79 % entre los lenguajes de backend que se usan actualmente en Internet.

Uno de los mayores desafíos de las bibliotecas de PHP a lo largo de los años ha sido la gestión de paquetes. Ha habido varias formas de instalar y mantener bibliotecas fácilmente, entre ellas PECL y CPAN. Mención especial para PEAR, que se presentó en 2009 y se convirtió en una de las primeras formas de cargar y distribuir bibliotecas. Más tarde se convirtió en PEAR2 y, con el tiempo, pasó a formar parte de PHP Composer (¡que ya va por su noveno año!), que es lo que veremos hoy.

¿Qué es PHP Composer?

PHP Composer es una herramienta de administración de paquetes que se usa para instalar y actualizar bibliotecas y dependencias en PHP. Se popularizó rápidamente por la forma en que carga y mantiene bibliotecas y dependencias en frameworks y proyectos. Funciona desde la línea de comandos y permite instalar aplicaciones, bibliotecas y dependencias de PHP, con capacidades de carga automática, dentro de los proyectos. Es importante tener en cuenta que PHP Composer no instala nada de forma global.

Veamos la seguridad de PHP Composer

Aunque PHP Composer agiliza el desarrollo de aplicaciones, también reduce cierto nivel de control y visibilidad. Así que, si bien facilita la programación, cabe preguntarse… ¿lo hace de forma segura? Con Snyk, puedo responder esa pregunta en unos pocos clics.

Antes de revisar algunas implementaciones de PHP Composer en distintas plataformas, quiero señalar algunos puntos.

  • Como usuario/desarrollador de estas plataformas, mis hallazgos me sorprendieron por varias razones. Esto refuerza la idea de que crear conciencia y fomentar la educación de forma continua es fundamental para desarrollar software de manera segura.

  • En todos los casos que se muestran a continuación, me comuniqué con cada comunidad para conversar sobre las vulnerabilidades y crear conciencia cuando aún no las conocían (muchas ya tenían soluciones).

Kirby

Para empezar a usar Kirby y Composer, puedes seguir las sencillas instrucciones de configuración en la documentación de Kirby meets Composer:

composer create-project getkirby/starterkit hello-world

Composer instala la versión más reciente de Kirby (3.3.5), que en Snyk Vulnerability DB solo tiene una vulnerabilidad de gravedad media y otra de gravedad baja. Sin embargo, la CLI de Snyk detecta un problema en una de las dependencias: PHPMailer, que usa la versión 6.2.0. Esta versión de PHP Mailer tiene una vulnerabilidad de gravedad alta de scripting entre sitios.

Esto se corrigió en PHPMailer 6.4.1 (al momento de escribir este artículo) y puede solucionarse ejecutando composer upgrade para obtener la versión más reciente. Al revisar el historial del módulo, se observa un largo historial de vulnerabilidades. Por eso, se recomienda ampliamente realizar análisis periódicos con Snyk Code para recibir alertas si se descubren nuevas vulnerabilidades.

Joomla

El repositorio de Joomla incluye un archivo de Composer que instala todas las dependencias necesarias para ejecutarlo. Al realizar un análisis con la CLI de Snyk, encontramos 2 problemas y 4 rutas vulnerables.

✗ 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.

En particular, volvemos a encontrar PHP Mailer, que instala la versión 5.2.28. Esta versión presenta un problema de validación incorrecta de entradas, y Snyk nos indica que se corrigió en la versión 6.1.6.

Snyk también detectó una vulnerabilidad de intermediario (MITM), que se incorpora a través de `paragoine/random_compat` en la versión 1.4.3 y está asociada con `joomla/session`. Los ataques MitM son muy graves, ya que permiten espiar las comunicaciones electrónicas. Para obtener más información sobre este tipo de vulnerabilidad, consulta nuestro blog sobre ataques de intermediario.

Drupal

Con la práctica guía del repositorio de Drupal, podemos empezar rápidamente a trabajar con la rama de desarrollo 9.x más reciente.

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

Mientras se ejecuta la instalación, podemos buscar problemas conocidos en Snyk Vulnerability Database, que también muestra las vulnerabilidades del historial de versiones de Drupal que debemos tener en cuenta. Después, con la CLI de Snyk, vemos que la versión 9.x aparece sin vulnerabilidades. Y, para estar aún más seguros, podemos hacer lo mismo con Drupal 8.x y comprobar que también aparece sin vulnerabilidades. ¡Excelente!

Ahora que esas dos versiones están verificadas, revisemos también Drupal 7, ya que todavía se usa bastante. Para hacerlo, clona el repositorio de Drupal 7.x.

Al analizar la versión 7.x, los resultados de la CLI de Snyk son un poco distintos: muestran 9 vulnerabilidades y 18 rutas vulnerables. Hay de todo, desde ataques que explotan la carga de archivos hasta ataques DoS, ejecución remota de código (RCE) y ejecución arbitraria 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.

A partir de estos hallazgos, recomendaría actualizar como mínimo a la versión 8.x para mantener segura tu implementación de Drupal.

Contribuye y ayuda a las comunidades

Cuando empecé a hacer pruebas en algunas de estas plataformas de uso frecuente, no sabía realmente qué iba a encontrar. Y, como dije antes, los resultados me sorprendieron bastante. Es posible que los desarrolladores, equipos o empresas que usan estas plataformas en producción sin conocer sus riesgos no sepan exactamente qué están incorporando. Espero que este artículo ayude a más equipos a mantenerse seguros.

Pero solo soy un desarrollador y este es apenas un artículo. Para lograr un impacto significativo en la seguridad, los animo a probar los proyectos por su cuenta y contribuir con las correcciones. Son comunidades increíbles, que a menudo cuentan con el trabajo de desarrolladores apasionados que quieren crear herramientas para ayudar a personas de todo el mundo, y necesitan tu apoyo.

Empieza con los desafíos de Capture the Flag

Aprende a resolver desafíos de captura la bandera con nuestro taller virtual introductorio a pedido.

Leer más

blog feature snyk container custom base recommendations
Blog

Presentamos Evo Agentic AppSec: seguridad al ritmo del desarrollo con IA

El desarrollo impulsado por IA supera el ritmo de los flujos de trabajo de seguridad tradicionales. Agentic AppSec de Snyk usa agentes de seguridad para encontrar, corregir y verificar vulnerabilidades de forma continua, mientras las personas definen el estándar.

feature insights context
Blog

Los ataques autónomos ya están aquí. La defensa debe estar a su altura.

Los atacantes autónomos están reduciendo el tiempo disponible para defenderse. Descubre cómo el descubrimiento, la corrección, la validación y la prevención continuos pueden ayudar a los equipos de seguridad a seguirles el ritmo.

feature insights context
Blog

¿La prevención es, en esencia, un problema ya resuelto?

La prevención en el código generado por agentes está resuelta desde el punto de vista arquitectónico, pero elegir controles que protejan la seguridad sin ralentizar el desarrollo sigue siendo el desafío.