Une image est une pile de couches de système de fichiers plus une configuration, et un registre est le serveur qui les stocke et les sert. Les deux sont des cibles de chaîne d'approvisionnement. Un registre atteignable sans authentification, ou avec des identifiants faibles, permet à un attaquant de tirer des images privées (et les secrets qu'elles contiennent) et parfois d'en pousser des malveillantes. Les images elles-mêmes fuient des secrets ajoutés pendant le build et que l'on a cru supprimés plus tard, car chaque couche est conservée. Et une image de base qu'un attaquant peut influencer empoisonne chaque image construite dessus.
Trouver des registres et inspecter des images :
# registry API v2 is unauthenticated to probe by default
curl -s http://<registry>:5000/v2/_catalog
curl -s http://<registry>:5000/v2/<repo>/tags/list
# pull and inspect an image's build history for secrets
docker pull <registry>:5000/<repo>:<tag>
docker history --no-trunc <registry>:5000/<repo>:<tag>
Sous-thèmes#
- Registry enumeration : lister les dépôts, les tags et les manifestes.
- Registry access : tirer et pousser avec des identifiants trouvés ou faibles.
- Unauthenticated registry access : un registre ouvert sans authentification.
- Secrets in image layers : extraire les identifiants intégrés dans les couches.
- Base image poisoning : compromettre une image amont pour atteindre les avals.
- Image backdooring : modifier une image pour exécuter du code attaquant au lancement.