Secrets en Dockerfile
Los secrets agregados via ENV, ARG o COPY .env en un Dockerfile quedan grabados en las capas de la imagen y son legibles por cualquiera que descargue la imagen.
Cómo Funciona
Las imágenes Docker son por capas. Aunque elimines un secret en un comando RUN posterior, sigue siendo legible en la capa anterior via docker history o extrayendo el tarball de la imagen. Cualquiera que descargue tu imagen — incluyendo sistemas CI, registros o usuarios no autorizados — puede extraerlo.
# MAL: secrets grabados en capas de imagen — permanentes y extraíbles
FROM node:20-alpine
ENV DATABASE_URL=postgres://usuario:secret@host/db
ARG STRIPE_SECRET_KEY
COPY .env /app/.env # el contenido de .env está en la capa para siempre# BIEN: usa Docker BuildKit secrets para valores en tiempo de build
# syntax=docker/dockerfile:1
FROM node:20-alpine
# Secrets en runtime se pasan como variables de entorno al iniciar el contenedor
# docker run -e DATABASE_URL=$DATABASE_URL myapp
# Para secrets en tiempo de build: usa el flag --secret con BuildKit
RUN --mount=type=secret,id=npmrc,target=/root/.npmrc npm ciEjemplo Real
En 2021, investigadores escaneando imágenes públicas de Docker Hub encontraron miles de imágenes con credenciales AWS, contraseñas de base de datos y API keys hardcodeadas en capas de imagen — incluyendo de empresas Fortune 500.
Cómo Prevenirlo
- Nunca uses ENV ni ARG para pasar secrets a imágenes Docker
- Usa Docker BuildKit --secret mounts para secrets en tiempo de build (no aparecen en las capas)
- Pasa secrets en runtime como variables de entorno al iniciar el contenedor, no los hornees en la imagen
- Escanea las imágenes con Trivy o docker scout antes de pushear a cualquier registro
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
Docker Corriendo como Root
mediumLos contenedores que corren como root dan a cualquier vulnerabilidad de ejecución de código acceso root inmediato al contenedor — y potencialmente al host.
Docker Tag Latest
lowUsar FROM image:latest significa que un nuevo pull puede cambiar silenciosamente tu imagen base, rompiendo la reproducibilidad y potencialmente introduciendo vulnerabilidades.
Puertos Expuestos Innecesarios
lowHacer EXPOSE de puertos que tu aplicación no usa realmente aumenta la superficie de ataque sin ningún beneficio.
Sin Health Check en Docker
lowSin una instrucción HEALTHCHECK, Docker y los orquestadores no pueden detectar cuando tu contenedor está corriendo pero roto — enrutando tráfico a una app muerta.