CVE-2026-85706 — CVSS 10.0, path traversal no autenticado
CVE-2026-85706 es una vulnerabilidad de path traversal en el componente de gestión de repositorios de GitLab CE y EE. El vector CVSS es AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H — sin autenticación requerida, sin interacción del usuario, impacto completo en confidencialidad, integridad y disponibilidad. En la práctica, una petición HTTP malformada contra el endpoint de API de archivos de repositorios permite al atacante recorrer el sistema de archivos de la instancia GitLab y acceder a archivos de configuración sensibles fuera de la raíz de repositorios. El investigador de watchTowr publicó un proof-of-concept funcional poco después de la divulgación, y los equipos de Rapid7 confirmaron intentos de explotación activos en su telemetría ETR. La CISA incluyó CVE-2026-85706 en su catálogo de Vulnerabilidades Explotadas Conocidas el 10 de septiembre de 2026.
Qué puede leer el atacante mediante path traversal
- secrets.yml — contiene la clave de cifrado active_record_encryption y las semillas de tokens internos; comprometido, permite descifrar toda la base de datos GitLab
- Claves SSH privadas de los runners de GitLab CI/CD — permiten ejecutar comandos en los agentes de build y pivotar hacia entornos de despliegue
- Tokens de CI/CD y variables de entorno almacenadas en la configuración — credenciales cloud, claves de API, secretos de despliegue inyectados en los pipelines
- Archivos de configuración de base de datos (database.yml) — host, puerto, nombre de base de datos, credenciales de conexión PostgreSQL
- Datos de sesión Redis si la configuración apunta a un socket Unix accesible
- Contenido de cualquier archivo legible por el usuario del sistema git en el árbol de la instancia
Quién está afectado — y quién no
Las versiones GitLab CE y EE desde 18.7.0 hasta 19.3.1 inclusive son vulnerables, ya sea instaladas mediante paquetes omnibus, desplegadas como contenedor Docker o desplegadas vía Helm en Kubernetes. GitLab.com (el servicio SaaS alojado por GitLab Inc.) fue parcheado de antemano por el equipo de GitLab antes de la divulgación pública — los usuarios de GitLab.com no están afectados y no necesitan realizar ninguna acción. Solo las instancias autoalojadas están expuestas. Las versiones de GitLab anteriores a 18.7 no están afectadas por este vector específico, pero están sin soporte y expuestas a otras vulnerabilidades sin parchear. Las instancias aisladas detrás de un firewall o VPN no están protegidas: el vector es HTTP estándar en los puertos 80 y 443, el acceso de red interno es suficiente para desencadenar la explotación.
Parchear GitLab CE/EE a la versión 19.3.2
Hacer copia de seguridad antes de cualquier operación
Ejecuta una copia de seguridad completa:
sudo gitlab-backup create STRATEGY=copy. Verifica que el archivo esté presente en /var/opt/gitlab/backups/ y cópialo a almacenamiento externo. No omitas este paso ni en situaciones de urgencia — el patch modifica el esquema de base de datos.Detener GitLab y actualizar el paquete omnibus
En Debian/Ubuntu:
sudo gitlab-ctl stop && sudo apt-get update && sudo apt-get install --only-upgrade gitlab-ee=19.3.2-ee.0 && sudo gitlab-ctl reconfigure && sudo gitlab-ctl start. En RHEL/CentOS: reemplaza apt-get poryum update gitlab-ee-19.3.2. Verifica la versión tras el reinicio:sudo gitlab-rake gitlab:env:info | grep GitLab.Actualizar una instancia Docker
Descarga la nueva imagen:
docker pull gitlab/gitlab-ee:19.3.2-ee.0. Detén el contenedor existente:docker stop gitlab. Reinicia con la nueva imagen manteniendo los volúmenes montados. Espera a que finalice la reconfiguración automática antes de probar el acceso.Verificar la integridad post-actualización
Ejecuta las verificaciones de salud integradas:
sudo gitlab-rake gitlab:check SANITIZE=trueysudo gitlab-rake gitlab:doctor:secrets. Si alguna reporta una anomalía en secrets.yml, realiza inmediatamente la rotación de secretos descrita en la siguiente sección.
Rotación de secretos tras una exposición potencial
Si tu instancia estuvo expuesta en internet entre la publicación de la versión 18.7 y la aplicación del parche — o si tienes alguna duda — la rotación de secretos es obligatoria. Parchear detiene la explotación futura pero no revoca las credenciales ya exfiltradas. Comienza regenerando la clave de cifrado de la base de datos: sudo gitlab-rake gitlab:encrypted_secrets:rotate_key. Después, revoca y regenera todos los tokens de runners CI/CD desde la interfaz de administración (Admin > CI/CD > Runners), luego reconfigura cada agente runner con el nuevo token. Reemplaza las claves SSH desplegadas en los runners. Audita las variables CI/CD de cada proyecto (Settings > CI/CD > Variables) y cambia todos los secretos de despliegue. Notifica a los equipos que usan pipelines CI/CD que sus secretos de despliegue deben considerarse comprometidos hasta nuevo aviso.
Lista de verificación post-parche
- Confirmar la versión instalada:
sudo gitlab-rake gitlab:env:info | grep 'GitLab version'debe mostrar 19.3.2 - Buscar indicadores de compromiso en los logs de Nginx: patrones de peticiones que contengan
../repetidos o codificados (%2e%2e%2f) - Verificar conexiones SSH inesperadas en /var/log/auth.log desde la primera versión 18.7 instalada
- Escanear la instancia con la herramienta de detección publicada por watchTowr para confirmar que el vector está cerrado
- Habilitar la autenticación de dos factores obligatoria para todas las cuentas de administrador
- Verificar que los headers de seguridad HTTP (HSTS, CSP) se emiten correctamente tras la actualización
- Programar una auditoría de seguridad de los permisos de repositorios — una explotación exitosa puede haber creado cuentas de administrador fantasma
Alternativa: migrar a Gitea en VPS para reducir la superficie de ataque
GitLab CE es una forja Git completa pero su arquitectura monolítica y su voluminosa base de código en Ruby on Rails amplían mecánicamente la superficie de ataque. CVE-2026-85706 no es un incidente aislado: GitLab ha tenido cuatro CVE críticos (CVSS ≥ 9.0) en los últimos dieciocho meses. Gitea es una alternativa en Go, de binario único, con una huella de memoria aproximadamente diez veces menor y un historial de CVE críticos significativamente más corto. En un VPS con acceso root, mantienes control total sobre el calendario de actualizaciones, las copias de seguridad y la rotación de secretos, sin depender de un proveedor externo para decidir cuándo se parchea tu instancia.
Desplegar Gitea en un VPS ServOrbit en 4 pasos
Provisionar un VPS y seleccionar el template de Gitea
Desde el portal de cliente ServOrbit, crea un nuevo VPS (mínimo 2 vCPU, 2 GB RAM para un equipo de hasta 20 desarrolladores) y selecciona el template de aplicación Gitea. El template preconfigura Gitea con systemd, un proxy inverso Nginx con TLS automático vía Let's Encrypt y copias de seguridad diarias.
Configurar el dominio y TLS
Apunta tu subdominio (ej. git.tu-dominio.com) a la IP del VPS mediante un registro A en tu zona DNS. El script de post-instalación detecta el dominio, solicita un certificado Let's Encrypt y configura Nginx exclusivamente en HTTPS con HSTS.
Importar los repositorios desde GitLab
Gitea incluye un asistente de migración (Administración > Importar repositorios) que acepta la URL de tu instancia GitLab y un token de acceso personal. Importa repositorios, ramas, etiquetas, issues abiertas y wikis. Para organizaciones con muchos proyectos, la herramienta de línea de comandos
gitea-cli migratepermite automatizar la importación por lotes.Configurar los runners CI/CD y revocar la instancia antigua
Despliega Forgejo Actions o conecta un runner Gitea Act. Actualiza los secretos de despliegue en cada repositorio migrado. Una vez validados los pipelines en Gitea, revoca los tokens de la antigua instancia GitLab, desactiva los runners y programa la desinstalación de GitLab para liberar recursos.
Para instancias GitLab detrás de una VPN o red interna: no postergues el parche suponiendo que el aislamiento de red es suficiente. El vector CVE-2026-85706 es HTTP en los puertos 80 y 443 — cualquier usuario con acceso VPN, cualquier equipo comprometido en la red interna, o cualquier servicio que llame a la API de GitLab puede desencadenar la explotación sin credenciales de GitLab. La CISA KEV confirma que actores maliciosos están apuntando activamente a este vector, incluso en entornos empresariales. El parche sigue siendo la única remediación fiable.
GitLab CE autoalojado vs Gitea — criterios de seguridad y operación
Desplace la tabla
| Criterio | GitLab CE 19.x | Gitea 1.22.x |
|---|---|---|
| Lenguaje / arquitectura | Ruby on Rails + Go (híbrido) | Go — binario único |
| Huella de memoria mínima | ~2–4 GB RAM | ~150–300 MB RAM |
| CVE críticos (CVSS ≥ 9) en 18 meses | 4 incluido CVE-2026-85706 | 0 |
| Autenticación 2FA integrada | Sí | Sí |
| Control del calendario de parches | Tú (autoalojado) | Tú (autoalojado) |
| SaaS ya parcheado disponible | GitLab.com (gratuito) | Gitea Cloud (beta) |
| Integración CI/CD nativa | GitLab CI (completo) | Gitea Actions / Forgejo Actions |
| Migración desde GitLab | N/A | Asistente integrado + API |
Lección de seguridad: gestionar tu forja Git en un VPS con acceso root
CVE-2026-85706 ilustra un principio fundamental de la seguridad del software autoalojado: la ventana de exposición entre la divulgación de un CVE crítico y la aplicación del parche es el período más peligroso en la vida de una instancia. En GitLab.com, esta ventana fue cero — el equipo de GitLab parcheó silenciosamente antes de la divulgación. En una instancia autoalojada, la ventana depende íntegramente de tu capacidad para recibir alertas, probar y desplegar rápidamente. Un VPS con acceso root te da control total sobre este ciclo: puedes automatizar las actualizaciones de seguridad, configurar alertas de CVE y probar el parche en un entorno de staging antes de producción. En un VPS ServOrbit, las copias de seguridad automáticas y el acceso root directo permiten cumplir este calendario sin depender de un servicio gestionado cuyos plazos y procedimientos no controlas.