Parce que docker.sock n’est pas « un peu d’API ». C’est le démon Docker, et le démon Docker est root sur l’hôte. Monter /var/run/docker.sock dans un conteneur, c’est donner à ce conteneur le droit de dire : crée un autre conteneur --privileged, monte / de l’hôte, lis /etc/shadow.
Le scénario tient en quatre lignes, et tout recruteur sérieux s’attend à ce que vous le racontiez :
conteneur « CI » → socket → dockerd (root)
→ docker run -v /:/host -u 0 alpine
→ chroot /hostÀ partir de là, namespaces et USER du premier conteneur ne comptent plus. Vous avez quitté l’isolement.
Les endroits où ça arrive « pour de bonnes raisons » : un agent Jenkins, un outil de preview, Traefik qui lit les labels, Portainer, un sidecar qui « gère » les autres conteneurs. La raison n’annule pas le privilège.
Que vous refusez l’argument « c’est un réseau interne, on se fait confiance ». Le socket est un privilège d’hôte, pas une commodité d’équipe. Il veut les alternatives, pas seulement la peur :
create + logs, jamais run --privileged. Réduit, ne supprime pas.La phrase qui clôt : si ce conteneur est compromis — dépendance npm, RCE dans le dashboard — l’attaquant n’a plus un pod. Il a l’hyperviseur de fortune.
« On le monte en lecture seule, ça va ? »
Non. L’API Docker s’exprime en requêtes HTTP sur le socket. Lecture seule au montage Unix n’empêche pas un POST /containers/create. C’est une fausse mitigation qu’il faut savoir écarter.
« Et sur Kubernetes, le socket du nœud ? »
Pire : le rayon devient tous les nœuds qui acceptent ce DaemonSet. Le même raisonnement, à l’échelle du cluster.