Saltar al contenido principal

Whaler

Herramienta que realiza ingeniería inversa de una imagen Docker para reconstruir el Dockerfile original. Útil para auditar imágenes de terceros, entender cómo fueron construidas y detectar posibles riesgos de seguridad.

Instalación

go install github.com/P3GLEG/Whaler@latest

Uso básico

# Reconstruir Dockerfile a partir de una imagen local
whaler nginx:latest
# Usando el ID de la imagen
whaler abc123def456

La salida muestra las instrucciones del Dockerfile reconstruido: FROM, RUN, COPY, ENV, EXPOSE, etc.

Exportar Dockerfile reconstruido

# Guardar en archivo para revisión
whaler myapp:latest > myapp.dockerfile
# Con imagen de un registry remoto (pull primero)
docker pull registry.example.com/app:v2.1
whaler registry.example.com/app:v2.1 > app-v2.1.dockerfile

Escaneo masivo de imágenes locales

Reconstruir el Dockerfile de todas las imágenes presentes en el daemon local.

#!/usr/bin/env bash
set -euo pipefail
OUT=./reports
mkdir -p "$OUT"

docker images --format "{{.Repository}}:{{.Tag}}|{{.ID}}" | while IFS='|' read -r repo id; do
name=$(echo "$repo" | awk -F'/' '{print $NF}' | tr ':' '_')
echo "==> $repo ($id)"
whaler "$id" > "$OUT/${name}.dockerfile" 2>&1 || true
done

Casos de uso en seguridad

  • Auditar imágenes de terceros — revisar qué comandos se ejecutaron durante el build (descargas sospechosas, usuarios creados, puertos abiertos)
  • Detectar secretos en capas — identificar instrucciones COPY o RUN que pudieron incluir tokens, llaves o credenciales
  • Verificar imagen base — confirmar que la imagen realmente usa el FROM declarado y no fue modificada
  • Comparar versiones — reconstruir Dockerfiles de dos tags distintos y hacer diff para ver qué cambió
# Comparar dos versiones de una imagen
whaler myapp:v1.0 > v1.dockerfile
whaler myapp:v2.0 > v2.dockerfile
diff v1.dockerfile v2.dockerfile

Complemento con otras herramientas

Whaler funciona bien combinado con otras herramientas del toolkit Docker:

  • Whaler → reconstruir el Dockerfile (qué instrucciones se ejecutaron)
  • Dive → explorar capas individuales (qué archivos contiene cada una)
  • Trivy → escanear vulnerabilidades conocidas (CVEs)
# Flujo completo de auditoría
whaler suspicious:latest > suspicious.dockerfile
dive suspicious:latest --ci
trivy image --severity CRITICAL,HIGH suspicious:latest

Limitaciones

  • No recupera argumentos de build (ARG, --build-arg) — estos no se almacenan en la imagen
  • COPY vs ADD — Whaler no siempre distingue entre ambos; los archivos copiados se muestran pero no su origen en el contexto de build
  • Multi-stage builds — solo reconstruye el stage final (la imagen resultante)
  • Imágenes scratch — imágenes sin base pueden generar output incompleto

Errores comunes

  • Imagen no encontrada — Whaler opera sobre el daemon local. Haz docker pull antes si la imagen está en un registry remoto.
  • Output vacío — puede ocurrir con imágenes muy minimalistas (scratch/distroless). Usa docker history <image> como alternativa básica.

Referencias