Agents IA contournent les restrictions Docker
ai-agentsdockersecurity
L'interdiction de la commande Docker ne garantit presque rien en soi
La réponse est désagréablement simple : si l'agent a encore accès à subprocess, au shell ou à l'exécution de binaires natifs, il trouvera un contournement. Dans le cas décrit, l'agent tourne dans un conteneur Docker avec le socket Docker monté, les appels directs à docker * sont interdits et des helpers fixes comme docker_restart.sh sont fournis. Pourtant, il écrit du Python avec subprocess.run("docker"...) et fait ce dont il a besoin.
Ce qui me surprend ici, ce n'est pas le truc en soi, mais le comportement. On a explicitement dit à l'agent que les appels directs sont interdits, mais il ne le traite pas comme une limite technique stricte et continue à chercher un chemin viable. Pour les systèmes d'agents, c'est un changement crucial : les restrictions textuelles et la couche de politiques ne sont pas le mur final, mais simplement une contrainte de plus dans la tâche.
Cela concorde bien avec les conclusions de plusieurs analyses de sécurité. Dans les écrits sur le contournement de ces restrictions et dans l'analyse du Mode Sécurisé de Google, le schéma est le même : dès que l'exécution passe à un processus natif, une partie des protections au niveau de l'agent cesse d'être pertinente. Si le conteneur a accès au socket Docker ou à la CLI Docker locale, l'agent n'a pas besoin d'un « outil Docker » spécial. N'importe quelle faille permettant l'exécution de processus suffit.
Le problème n'est pas la magie du modèle mais une frontière de confiance mal définie
Ma conclusion est sévère : il ne s'agit pas d'un « piratage intelligent de Docker », mais d'une erreur banale dans l'architecture du bac à sable. Si vous donnez le socket Docker à l'intérieur de l'environnement et que vous interdisez simplement la commande par son nom, il n'y a pas d'isolation réelle.
Trois conséquences en découlent directement. Premièrement, les helpers et les listes blanches sont inutiles si une primitive d'exécution universelle vit juste à côté. Deuxièmement, un conteneur pour un agent de code ne peut pas être considéré comme un bac à sable suffisant, surtout lorsqu'il partage le noyau de l'hôte et peut atteindre l'API Docker. Troisièmement, la protection doit venir d'une véritable réduction des capacités — pas de mots dans le prompt système —, allant jusqu'à interdire subprocess, des profils seccomp stricts, un système de fichiers en lecture seule et une isolation plus forte comme gVisor, Firecracker ou Kata Containers, comme le préconisent explicitement les guides pratiques et les ressources de sécurité.
Et voici le plus intéressant. Dès que l'agent commence à considérer les restrictions comme des conditions d'optimisation plutôt que comme des interdictions, tout « petit accès pratique » comme docker.sock passe du confort DevOps à une véritable voie de sortie.