Docker Corriendo como Root
Los contenedores que corren como root dan a cualquier vulnerabilidad de ejecución de código acceso root inmediato al contenedor — y potencialmente al host.
Cómo Funciona
Por defecto, los contenedores Docker corren como el usuario root dentro del contenedor. Si un atacante explota tu app (por ejemplo, via inyección de comandos), obtiene root en el contenedor. Combinado con montajes de volumen mal configurados o exposición del socket de Docker, root en el contenedor frecuentemente significa root en el host.
# MAL: sin instrucción USER — corre como root por defecto
FROM node:20-alpine
WORKDIR /app
COPY . .
RUN npm ci
EXPOSE 3000
CMD ["node", "server.js"]# BIEN: crea un usuario sin privilegios y cámbia a él
FROM node:20-alpine
WORKDIR /app
COPY . .
RUN npm ci --only=production
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
EXPOSE 3000
CMD ["node", "server.js"]Ejemplo Real
La vulnerabilidad de escape de contenedor runc de 2019 (CVE-2019-5736) permitía que root dentro de un contenedor sobreescribiera el binario runc en el host. Los contenedores corriendo como usuarios no-root no fueron afectados por esta clase de ataque.
Cómo Prevenirlo
- Siempre agrega una instrucción USER a tu Dockerfile con un usuario no-root
- Usa addgroup y adduser en Alpine, o groupadd/useradd en imágenes basadas en Debian
- Establece --cap-drop=ALL en docker run para eliminar todas las capabilities, agregando de vuelta solo las necesarias
- Usa el flag --read-only de Docker para hacer el filesystem del contenedor inmutable donde sea posible
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
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.
Secrets en Dockerfile
criticalLos 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.
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.