Exécuter Claude Code dangereusement (en toute sécurité)
(blog.emilburzo.com)- Comment utiliser en toute sécurité le flag
--dangerously-skip-permissionsde Claude Code - Après avoir évalué plusieurs environnements d’exécution isolés comme Docker, les VM et Firejail, l’auteur conclut qu’une machine virtuelle (VM) basée sur Vagrant est la solution la plus adaptée
- Avec Vagrant, il est possible de conserver une isolation complète par VM, une configuration reproductible et le partage de dossiers locaux, tout en évitant les problèmes de Docker-in-Docker
- Claude Code est configuré pour manipuler librement le système avec les privilèges
sudodans la VM, et sert concrètement à lancer des web apps, configurer des bases de données et automatiser des tests - Cette méthode est efficace pour éviter les dommages accidentels au système de fichiers et permet, si nécessaire, de réinitialiser proprement l’environnement en supprimant puis recréant la VM
Contexte
- Lors de l’utilisation de Claude Code, l’auteur a voulu éliminer l’inconvénient de devoir confirmer chaque demande d’autorisation en essayant le flag
--dangerously-skip-permissions- Ce flag exécute automatiquement sans approbation préalable toutes les opérations, y compris l’installation de paquets, les changements de configuration ou la suppression de fichiers
- C’est efficace car cela évite d’interrompre le flux de travail, mais cela comporte un risque de corruption du système de fichiers
- Pour l’éviter, il devient nécessaire d’exécuter Claude dans un environnement séparé du compte utilisateur de l’OS hôte
Méthodes envisagées
- L’isolation via Docker a d’abord été étudiée, mais comme Claude doit construire des images Docker et lancer des conteneurs, une configuration Docker-in-Docker est nécessaire
- Dans ce cas, le mode
--privilegedest requis, ce qui annule l’intérêt du sandboxing - L’empilement réseau et les problèmes de permissions sur les montages de volumes augmentent aussi la complexité et l’instabilité
- Dans ce cas, le mode
- Les autres alternatives examinées sont les suivantes
- Exécution sur bare metal : des cas rapportés sur Reddit montrent des dommages graves, comme la suppression d’une base de données ou du répertoire personnel
sandbox-runtime: contrôle d’accès basé sur les ACL, empêchant Claude d’accéder à autre chose qu’au code, mais avec un manque de liberté totale- Firejail : présente des limitations similaires à Docker
- Configuration manuelle d’une VM : manque de reproductibilité
- VM dans le cloud : problèmes de coût, latence et nécessité d’uploader le code
Approche basée sur Vagrant
- Vagrant permet d’obtenir à la fois une isolation complète par VM et une configuration reproductible
- Les dossiers partagés permettent un accès proche d’un usage local
- Il n’y a pas de problème de Docker-in-Docker, et la VM peut être supprimée puis recréée facilement si besoin
- En utilisant VirtualBox 7.2.4, l’auteur a constaté un bug faisant monter le CPU à 100 %, puis en a confirmé la cause via une issue GitHub
- La configuration finale du Vagrantfile présente les caractéristiques suivantes
- image de base
bento/ubuntu-24.04 - 4 Go de mémoire et 2 CPU alloués
- installation de Docker, Node.js, npm, git et unzip
- installation globale de
@anthropic-ai/claude-code - ajout de l’utilisateur
vagrantau groupe Docker
- image de base
Utilisation concrète
- Depuis le répertoire du projet, exécuter
vagrant up→vagrant ssh→claude --dangerously-skip-permissions - Au premier démarrage, le provisioning prend quelques minutes et il faut se connecter à Claude une seule fois par projet
- En fin de travail, la VM peut être mise en veille avec
vagrant suspend - Dans la VM, Claude reçoit les privilèges
sudoet peut effectuer les tâches suivantes- lancer l’API d’une web app et la vérifier avec
curl - installer un navigateur, inspecter manuellement l’application et générer des tests E2E
- configurer une base PostgreSQL et tester les migrations
- construire et exécuter des images Docker
- lancer l’API d’une web app et la vérifier avec
- Grâce à cet environnement, Claude peut exécuter des commandes, vérifier les sorties et gérer lui-même les itérations
Performances et sécurité
- Sur Linux + VirtualBox, les ressources sont largement suffisantes et il n’y a pas de latence de synchronisation des fichiers
- Ce qui peut être protégé
- les dommages accidentels au système de fichiers
- les installations de paquets incontrôlées et les modifications de configuration
- Ce qui ne peut pas être protégé
- la suppression du dossier du projet (synchronisation bidirectionnelle)
- les attaques exploitant une faille d’évasion de VM
- les problèmes au niveau réseau
- l’exfiltration de données (la VM a accès à Internet)
- Cette configuration sert à prévenir les accidents, et non à se défendre contre des attaques avancées
- Comme le projet repose sur Git, la récupération reste facile en cas de dommages ; si nécessaire, une synchronisation unidirectionnelle via
rsyncpermet une isolation plus stricte
Conclusion
- Après résolution du bug CPU de VirtualBox, l’auteur obtient un environnement d’exécution sans friction
- Claude Code peut être exécuté librement dans un sandbox VM complet
- En cas de problème, il suffit de supprimer puis recréer la VM, avec une reproductibilité garantie par un simple Vagrantfile
- Si vous utilisez le flag
--dangerously-skip-permissions, la mise en place d’un environnement isolé de ce type est fortement recommandée
1 commentaires
Commentaires Hacker News
Quand on utilise Claude, à terme on finit par simplement appuyer sur Entrée au bout de quelques mois à cause de la fatigue décisionnelle
Du coup, j’ai l’impression qu’il est bien plus sûr de le faire tourner en mode YOLO tout en préparant un environnement sandboxé
Sur Ubuntu 22.04, j’ai construit une sandbox en couches en combinant bubblewrap et Landlock LSM
Landlock restreint l’accès au système de fichiers sur la base d’une liste blanche et contrôle aussi l’accès aux ports TCP
bubblewrap isole les espaces de noms de montage pour créer un
/tmppar projet et masquer les clés secrètesdnsmasq permet de définir une liste blanche DNS pour que seuls les domaines nécessaires puissent être résolus
Grâce à cette architecture, le stress de devoir surveiller l’agent en permanence a diminué
Devoir approuver un à un les morceaux d’elisp proposés par Claude a été une expérience vraiment épuisante
Même en faisant seulement attention à ce que des commandes Bash n’installent pas n’importe quoi, c’était pénible
/sandboxC’est Srini de Docker
Beaucoup de développeurs utilisent Docker pour résoudre ce problème, et nous avons aussi reçu beaucoup de retours sur les limitations de Docker-in-Docker
Nous avons donc publié à titre expérimental Docker Sandboxes en version preview
C’est encore très tôt, mais nous développons la prochaine version sur une base MicroVM afin d’éviter les problèmes de Docker-in-Docker
J’aimerais savoir si Claude peut lancer d’autres conteneurs sans privilèges à l’intérieur de Docker Sandbox
La plupart des gens semblent vouloir éviter d’exécuter eux-mêmes une VM locale, mais je ne comprends pas pourquoi
En réalité, une VM locale est ce qu’il y a de plus simple et ça résout tous les problèmes
Si vous utilisez Docker sur Mac, vous tournez déjà au-dessus d’une VM Linux, donc il n’y a qu’une couche d’écart avec l’environnement réel
On peut aussi se connecter directement en SSH depuis l’IDE pour inspecter le code
J’active l’option
--dangerously-skip-permissionset je traite tous les changements via des PRJ’utilise ça avec workmux depuis plusieurs mois, et c’est très efficace parce que ça permet de gérer plusieurs PR en parallèle
C’est préférable à une VM cloud, car faire tourner plusieurs conteneurs en même temps consomme beaucoup de mémoire
Faire tourner une VM cloud haut de gamme 24/7 coûte beaucoup trop cher
Même sans exploiter une faille d’évasion de VM, une IA malveillante peut obtenir un accès à l’hôte en ajoutant du code arbitraire dans un Vagrantfile
Même si on ne s’inquiète que des erreurs banales, si Claude modifie les hooks de commit, cela peut poser problème au moment où ils s’exécutent
J’ai l’impression qu’il est vraiment difficile de conserver une isolation complète tout en gardant un développement pratique
Par exemple, avec un montage de volume Docker on peut autoriser la modification du seul dossier
sandbox/et rendre.gitinaccessibleMoi, je prends un snapshot, je lance une petite VM pour exécuter l’agent, puis je compare à nouveau les snapshots
Je ne fais jamais de synchronisation automatique, car cela ruinerait l’objectif d’isolation
J’essaie une autre approche — intercepter ce que Claude veut exécuter
Shannot capture l’intention avant l’exécution et intercepte les appels système dans une sandbox PyPy
Les commandes et écritures de fichiers ne sont consignées que dans des logs et ne sont pas réellement exécutées
Ce n’est qu’après examen et approbation dans une TUI par l’utilisateur qu’elles sont exécutées
La différence avec une VM, c’est qu’une VM laisse tout s’exécuter librement dans un environnement totalement isolé, tandis que Shannot applique sur le système réel des changements basés sur une approbation humaine
C’est adapté à des tâches comme la modification de serveurs
Il y a aussi une intégration Claude MCP, l’exécution distante via SSH, et des fonctions de checkpoint/rollback
Au final, la structure s’arrête dès la première demande d’approbation, donc l’agent ne peut pas explorer librement
Ce que je veux, c’est que l’agent puisse aller jusqu’au bout sans s’arrêter en cours de route, puis qu’on évalue le résultat
C’est là que le gain de temps est important
C’est proche du mode d’extension système natif Mac de Leash, mais il n’y a pas encore de vrai mode d’approbation interactif
Projet intéressant
Quand la fatigue liée aux validations s’accumule, on finit par avoir envie d’utiliser
--dangerously-skip-permissionsDu coup, j’exécute Claude Code dans un devcontainer
L’accès aux fichiers est limité au dépôt et le réseau n’autorise qu’une liste blanche
Ensuite, j’ai généralisé ça avec docker compose, et la prochaine étape est d’ajouter la prise en charge d’autres agents comme Codex ou OpenCode
Je veux forcer le routage réseau via le proxy de l’hôte pour renforcer la journalisation et le contrôle
Pour l’instant, je gère ça provisoirement avec iptables
C’est encore tôt, mais ça fonctionne plutôt bien
Code : agent-sandbox
J’utilise mitmproxy comme proxy réseau ; ce n’est pas encore parfait, mais on y est presque
Claude a configuré seul le système pendant plusieurs heures et a terminé l’application
Nous n’avons pas écrit une seule ligne de code et le résultat était étonnamment bon
La vitesse du développement par IA est vraiment impressionnante
Ma solution est simple
De cette façon, la commande npx s’exécute de manière transparente dans une sandbox Bubblewrap, et seul le répertoire courant est exposé
Cela peut se faire avec quelques lignes de shell POSIX pur
sandbox-run
Un autre inconvénient est qu’une fois les privilèges abandonnés, on ne peut pas les récupérer
Moi, je le mets simplement dans un conteneur LXC non privilégié et c’est réglé
Mon modèle de menace porte moins sur les attaques complexes que sur le cas où « il supprime par erreur mon répertoire personnel »
Je place des scripts utilitaires dans le répertoire
run/du projet et je lance les conteneurs sur une base composeLe devcontainer est mappé avec le répertoire hôte et des volumes
Claude gère bien la configuration des services, la mise à jour des scripts et le diagnostic des problèmes d’exécution
Il n’y a pas d’intégration navigateur, mais avec Playwright ou Puppeteer, ça devrait largement être faisable
J’aimerais avoir des avis sur le sandboxing intégré de Claude Code
Lien vers la documentation officielle
Claude Code dispose d’une porte de sortie permettant de désactiver la sandbox si nécessaire
Si une commande échoue à cause des restrictions de la sandbox, Claude peut analyser la cause et réessayer avec
dangerouslyDisableSandboxLe fait que l’agent puisse désactiver lui-même la sandbox ressemble à une faille potentielle ; je me demande s’il y a dans ce cas une procédure d’approbation par l’utilisateur
Issues liées : #14268, #13583, #10089