El archivo composer.lock es un componente fundamental en la gestión moderna de proyectos PHP, y su presencia en una web WordPress es un indicador de que el sitio está utilizando Composer para manejar sus dependencias. Aunque su exposición pública no suele ser tan crítica como la de un archivo .env, sigue siendo una fuente de información valiosa para un atacante.

1. ¿Por qué es un riesgo la exposición?

Si un atacante logra acceder o descargar tu archivo de configuración, obtendrá los datos de acceso directo a la base de datos MySQL, prefijos de tablas y claves secretas (SALT).

¿Qué es composer.lock?

El archivo composer.lock es el registro exacto de todas las dependencias que tu proyecto está utilizando en un momento dado. Se genera automáticamente a partir de la lista de requerimientos del archivo composer.json.

Su propósito es garantizar que cada persona que trabaje en el proyecto (y el entorno de producción) tenga exactamente las mismas versiones de las librerías, evitando sorpresas por actualizaciones inesperadas. Es la "foto fija" de tus dependencias.

¿Para qué se usa en un proyecto WordPress?

En el ecosistema de WordPress, se usa para gestionar, entre otras cosas:

  1. El núcleo de WordPress: En proyectos modernos (como Bedrock), el propio WordPress se instala como una dependencia de Composer.
  2. Plugins y temas: Se pueden gestionar a través de Composer usando repositorios como wpackagist (o alternativas como WP Packages), lo que facilita la instalación y actualización de paquetes desde wordpress.org.
  3. Librerías PHP: Cualquier paquete de Packagist que necesite el proyecto, como librerías para envío de correo, manejo de sesiones, etc.

Este archivo contiene la lista completa de paquetes instalados y sus versiones exactas.
Por ejemplo:

{ "packages": [ { "name": "monolog/monolog", "version": "3.6.0" }, { "name": "guzzlehttp/guzzle", "version": "7.8.1" } ] }

A diferencia de composer.json, que indica las dependencias deseadas, composer.lock muestra las versiones realmente instaladas, lo que proporciona información mucho más precisa.

¿Es una vulnerabilidad?

No por sí mismo.
El problema aparece cuando un atacante puede acceder a: https://tudominio.com/composer.lock

y descubrir exactamente qué versiones de las librerías utiliza el sitio.

⚠️ Riesgo de seguridad al exponerlo públicamente

Al igual que con composer.json, el principal riesgo es que un atacante pueda leer su contenido accediendo a https://tudominio.com/composer.lock. Aunque no contiene contraseñas, este archivo revela información sensible sobre tu infraestructura:

Enumeración de paquetes y versiones: El archivo detalla qué plugins, temas y librerías usas, junto con la versión exacta de cada uno. Esta información es un mapa para un atacante, que puede buscar vulnerabilidades conocidas específicas para esas versiones y planificar un ataque dirigido.

Riesgo por paquetes obsoletos o abandonados: Depender de paquetes que están desactualizados o que han sido abandonados por sus mantenedores aumenta el riesgo de que contengan vulnerabilidades sin parchear. Al exponer el composer.lock, un atacante puede identificar estos paquetes fácilmente.

¿Cómo comprobar si está expuesto?

Accede a: https://tudominio.com/composer.lock

Resultados:

404 Not Found ✅ Correcto. 403 Forbidden ✅ Correcto. 200 OK mostrando el JSON ❌ Exposición de información.

¿Cómo protegerlo?

Bloquear el acceso

Apache (.htaccess)

<FilesMatch "^composer\.(json|lock)$"> Require all denied </FilesMatch>

Nginx

location ~ ^/(composer\.(json|lock))$ { deny all; return 403; }

No publicar archivos de Composer

Si utilizas un proceso de despliegue, evita copiar composer.json y composer.lock al directorio público cuando no sean necesarios.

Mantener las dependencias actualizadas

El verdadero riesgo no es el archivo, sino que las versiones reveladas tengan vulnerabilidades conocidas.