Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
Herramientas/GitHubGitHub/0xmrma/cve-2026-14361
Análisis de VulnerabilidadesAnálisis de CódigoExplotaciónAprendizaje y Educación
GitHub0xmrma/cve-2026-14361

CVE-2026-14361

El helper writeToFile de Consul Template abría directamente un destino proporcionado por el operador y seguía los componentes de ruta enlazados, permitiendo que la salida renderizada escapara del directorio previsto y sobrescribiera un archivo preexistente.

Ver Repositorio
5hace 2 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-14361

El helper writeToFile de Consul Template abría directamente un destino proporcionado por el operador y seguía los componentes de ruta con enlaces, lo que permitía que la salida renderizada escapara del directorio previsto y sobrescribiera un archivo preexistente.

Introducción

Encontré este problema al revisar HashiCorp Consul Template, con una pregunta directa de seguridad del sistema de archivos en mente:

Si writeToFile recibe una ruta que parece estar dentro del directorio previsto, ¿verifica dónde escribirá realmente el sistema de archivos los datos?

En este caso, la respuesta fue no.

El helper de plantilla writeToFile abría directamente la ruta final proporcionada por el usuario mediante os.Create() u os.OpenFile().

Esas operaciones seguían enlaces simbólicos, junctions de directorio y redirecciones equivalentes del sistema de archivos ya presentes en la ruta de destino.

Eso significaba que la cadena de ruta podía permanecer bajo la raíz prevista por el operador mientras que la escritura real aterrizaba en otro lugar.

En mi prueba de concepto controlada, un directorio padre con enlace redirigió la salida renderizada fuera del árbol previsto y provocó que un archivo de destino preexistente fuera sobrescrito.

Ese problema se convirtió en CVE-2026-14361.

Boletín de HashiCorp: HCSEC-2026-20
Boletín de IBM: boletín de seguridad CVE-2026-14361
CVE: CVE-2026-14361
Corregido en: 0.42.1

photo0


Cadena de ataque

el destino proporcionado por el operador aparece dentro de la raíz prevista -> el atacante coloca de antemano un componente padre o final con enlace -> writeToFile abre la ruta directamente -> el sistema de archivos resuelve la escritura fuera del directorio previsto -> el secreto renderizado es redirigido -> un objetivo preexistente puede ser sobrescrito


Qué hace writeToFile

Consul Template renderiza datos de fuentes como Consul y Vault.

El helper writeToFile permite que una plantilla escriba contenido seleccionado en un archivo local separado mientras aplica un propietario, grupo y modo de permisos solicitados.

La documentación de HashiCorp demuestra específicamente el helper con material PKI:

private key -> writeToFile /my/path/to/cert.key
certificate authority -> writeToFile /my/path/to/cert.pem
certificate -> append to /my/path/to/cert.pem

Eso lo convierte en algo más que un helper de salida ordinario.

El contenido que cruza este límite puede incluir:

  • claves privadas
  • certificados
  • secretos obtenidos de Vault
  • valores de configuración
  • credenciales de servicio

La pregunta importante no era si writeToFile podía crear un nombre de archivo solicitado.

La pregunta real era:

¿El proceso escribe en la ubicación del sistema de archivos prevista por el operador, o simplemente en el objeto al que la ruta se resuelve en el momento de la apertura?

En las versiones vulnerables, confiaba en esto último.


Por qué valía la pena examinar esta superficie

Los helpers de escritura son superficies de seguridad de alto valor porque cruzan de los datos de la aplicación a la mutación del sistema de archivos.

Los fallos interesantes a menudo no son el clásico traversal ../.

Son fallos de resolución:

  • la cadena parece segura
  • el árbol de directorios parece controlado por el operador
  • un componente con enlace cambia el destino real
  • la llamada de apertura sigue esa redirección automáticamente

Eso es especialmente importante cuando el proceso se ejecuta con más privilegios del sistema de archivos que el atacante.

Un atacante local con pocos privilegios puede no ser capaz de sobrescribir un archivo sensible directamente.

Pero si puede influir en un componente de ruta bajo un directorio de escritura previsto, un proceso de Consul Template más privilegiado puede realizar la escritura por él.

Ese fue el límite en el que me centré.


El límite en el que me centré

No abordé esto como una revisión genérica de path traversal.

La ruta proporcionada no necesitaba segmentos ...

Podía permanecer léxicamente dentro de la raíz prevista todo el tiempo.

La pregunta más sólida era:

¿Se rechazan los componentes de destino con enlaces antes de que se escriba contenido sensible?

Esa pregunta importa para ambos casos:

  • un nombre de archivo final con enlace
  • un componente de directorio con enlace que redirige toda la ruta restante

El segundo caso es especialmente útil porque los registros y la configuración siguen mostrando una ruta de apariencia inocente bajo el directorio esperado.

El sistema de archivos la resuelve en otro lugar.


Causa raíz

La causa raíz era la creación directa de archivos basada en rutas sin validación consciente de enlaces.

En la revisión probada, writeToFile() seleccionaba uno de dos caminos de apertura.

El modo de append usaba:

f, err = os.OpenFile(
    path,
    os.O_APPEND|os.O_WRONLY|os.O_CREATE,
    perm,
)

El modo de escritura normal usaba:

dirPath := filepath.Dir(path)

if _, err := os.Stat(dirPath); err != nil {
    err := os.MkdirAll(dirPath, os.ModePerm)
    if err != nil {
        return "", err
    }
}

f, err = os.Create(path)

Ninguno de los dos caminos rechazaba componentes de destino con enlaces antes de abrir el archivo.

Eso importa porque:

  • os.Create(path) sigue las redirecciones existentes del sistema de archivos y trunca el archivo resuelto
  • os.OpenFile(path, ...) sigue los componentes de ruta con enlaces durante el modo append
  • un directorio con enlace cambia dónde se resuelve el nombre de archivo final
  • un componente final con enlace puede redirigir la apertura a un archivo existente diferente

La misma suposición basada en rutas continuaba después de la escritura.

La propiedad y los permisos se aplicaban usando la ruta nuevamente:

err = os.Chown(path, uid, gid)
err = os.Chmod(path, perm)

Eso significaba que las operaciones de metadatos también estaban vinculadas a un nombre de ruta mutable en lugar del descriptor de archivo ya abierto.

Por qué esto es explotable

Porque el atacante puede preparar la redirección antes de que writeToFile se ejecute.

No se requiere una condición de carrera probabilística para el ataque básico.

La secuencia es sencilla:

  • el operador configura un destino bajo una raíz esperada
  • el atacante obtiene suficiente acceso local para crear o reemplazar un componente con enlace debajo de esa ubicación de escritura
  • la cadena de ruta todavía parece permanecer bajo la raíz prevista
  • writeToFile la abre directamente
  • el sistema operativo sigue el enlace o junction
  • la salida renderizada aterriza en el destino resuelto
  • si ese destino ya existe, el modo de creación normal lo trunca y sobrescribe

Esa es toda la vulnerabilidad.


Qué hace que esto sea un problema de seguridad, no solo el comportamiento normal de los symlinks

Es cierto que los sistemas operativos normalmente siguen los symlinks durante las aperturas de archivos basadas en rutas.

Eso no hace que este sea un comportamiento seguro de la aplicación.

La pregunta de seguridad no es:

"¿Go se comportó como está documentado?"

La pregunta real es:

¿Un helper que escribe datos sensibles renderizados verificó que el destino resuelto coincidiera con la ubicación prevista por el operador?

En las versiones vulnerables, no lo hizo.

Esa distinción importa porque Consul Template puede ejecutarse:

  • como un servicio de larga duración
  • con acceso a secretos derivados de Vault
  • bajo una cuenta elevada
  • con acceso de escritura que el atacante local no tiene directamente
Descargar herramienta