﻿﻿{"id":2695,"date":"2026-04-08T15:30:00","date_gmt":"2026-04-08T13:30:00","guid":{"rendered":"https:\/\/elearningsamba.com\/index.php\/hazmat-vos-agents-ia-en-cage-sous-macos\/"},"modified":"2026-04-08T15:30:00","modified_gmt":"2026-04-08T13:30:00","slug":"hazmat-vos-agents-ia-en-cage-sous-macos","status":"publish","type":"page","link":"https:\/\/elearningsamba.com\/index.php\/hazmat-vos-agents-ia-en-cage-sous-macos\/","title":{"rendered":"Hazmat &#8211; Vos agents IA en cage sous macOS"},"content":{"rendered":"<p>J&#8217;sais pas si vous vous en rendez compte mais les agents IA qui codent sur votre machine ont acc\u00e8s \u00e0 vos cl\u00e9s SSH, vos credentials AWS, votre Keychain et compagnie. Ils ont acc\u00e8s \u00e0 TOUT ! C&#8217;est comme filer les cl\u00e9s de votre appart \u00e0 un gars que vous avez crois\u00e9 sur le parking de Leclerc y&#8217;a pas 5 min.<\/p>\n<p>\n<a href=\"https:\/\/github.com\/dredozubov\/hazmat\">Hazmat<\/a><br \/>\nprend le probl\u00e8me \u00e0 l&#8217;envers : au lieu de demander poliment \u00e0 l&#8217;agent de se tenir tranquille, il l&#8217;enferme dans un compte macOS s\u00e9par\u00e9. Du coup, vos <code>~\/.ssh<\/code>, <code>~\/.aws<\/code>, votre Keychain deviennent structurellement inaccessibles. Pour en profiter, faut faire un<\/p>\n<div class=\"highlight\">\n<pre class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">brew install dredozubov\/tap\/hazmat\n<\/span><\/span><\/code><\/pre>\n<p>puis<\/p>\n<div class=\"highlight\">\n<pre class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">cd \/tmp\n<\/span><\/span><\/code><\/pre>\n<div class=\"highlight\">\n<pre class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">hazmat init --bootstrap-agent claude\n<\/span><\/span><\/code><\/pre>\n<p>Et hop, 10 minutes plus tard votre agent tourne dans sa cage. (le premier snapshot est ultra loooong mais apr\u00e8s c&#8217;est de l&#8217;incr\u00e9mental donc \u00e7a ira plus vite)<\/p>\n<p>L&#8217;isolation repose sur 3 couches ind\u00e9pendantes, un peu comme les sas d&#8217;un sous-marin. Il y a d&#8217;abord un utilisateur <code>agent<\/code> d\u00e9di\u00e9 (vos fichiers perso deviennent alors hors de port\u00e9e, point). Ensuite, une politique seatbelt g\u00e9n\u00e9r\u00e9e dynamiquement \u00e0 chaque session qui consiste \u00e0 ce que le kernel de macOS v\u00e9rifie chaque acc\u00e8s fichier et refuse tout ce qui n&#8217;est pas explicitement autoris\u00e9 pour cette session pr\u00e9cise.<\/p>\n<p>\n<img decoding=\"async\" src=\"https:\/\/korben.info\/cdn-cgi\/image\/width=1200,fit=scale-down,quality=90,f=avif\/hazmat-sandbox-macos-agents-ia\/hazmat-sandbox-macos-agents-ia-2.png\" alt=\"\" loading=\"lazy\">\n<\/p>\n<p>Et par-dessus, des r\u00e8gles pf firewall qui emp\u00eachent l&#8217;agent d&#8217;envoyer du trafic SMTP, IRC, FTP, Tor ou VPN. Comme \u00e7a, un agent qui tentera d&#8217;exfiltrer vos donn\u00e9es par mail se retrouvera bloqu\u00e9 net au niveau du noyau.<\/p>\n<p>C\u00f4t\u00e9 supply chain, Hazmat force <code>npm ignore-scripts=true<\/code> par d\u00e9faut. Comme \u00e7a, par exemple<br \/>\n<a href=\"https:\/\/korben.info\/axios-lune-des-bibliotheques-les-plus-populaires-de-npm-piratee-pour-installer-un-cheval-de-troie.html\">le fameux hack axios<\/a><br \/>\nqui livrait un RAT via un hook <code>postinstall<\/code> en 2 secondes chrono n&#8217;est plus possible ici ! Y&#8217;a aussi une blocklist DNS qui redirige les services de tunnel connus (ngrok, pastebin, webhook.site) vers localhost. Contre un domaine perso fra\u00eechement enregistr\u00e9, \u00e7a passera mais les vecteurs d&#8217;exfiltration classiques, \u00e7a devrait r\u00e9sister.<\/p>\n<p>Hazmat utilise TLA+, le m\u00eame formalisme que les ing\u00e9s d&#8217;Amazon utilisent pour v\u00e9rifier les protocoles de DynamoDB. Genre, l&#8217;installation des r\u00e8gles sudoers AVANT le firewall (\u00e9videmment, \u00e7a cr\u00e9e une fen\u00eatre de vuln\u00e9rabilit\u00e9), les restrictions qui bloquaient les lectures mais pas les \u00e9critures, ou encore une restauration cloud sans v\u00e9rifier qu&#8217;un snapshot existait&#8230;etc, c&#8217;est le genre de truc qu&#8217;aucun test unitaire n&#8217;aurait chop\u00e9.<\/p>\n<p>\u00c7a supporte Claude Code (y compris le fameux <code>--dangerously-skip-permissions<\/code>), OpenCode et Codex. Attention par contre, si votre projet utilise Docker, y&#8217;a deux cas de figure : soit le daemon Docker est priv\u00e9 au projet et Hazmat le route automatiquement vers un mode Docker Sandbox, soit c&#8217;est un daemon partag\u00e9 et l\u00e0 faudra passer <code>--docker=none<\/code> explicitement.<\/p>\n<p>La commande <code>hazmat explain<\/code> montre aussi exactement ce que le sandbox autorise avant de lancer quoi que ce soit&#8230; et \u00e7a, c&#8217;est pas du luxe quand on sait pas trop ce qu&#8217;on va l\u00e2cher dans la nature. Le <code>hazmat diff<\/code> qui affiche les changements faits par l&#8217;agent depuis le dernier snapshot Kopia, c&#8217;est plut\u00f4t bien pens\u00e9. Et si l&#8217;agent casse un truc ? <code>hazmat restore<\/code> et c&#8217;est reparti, comme un Ctrl+Z g\u00e9ant pour tout votre projet.<\/p>\n<p>Si vous avez d\u00e9j\u00e0<br \/>\n<a href=\"https:\/\/korben.info\/teabase-environnement-developpement-macos-securise.html\">configur\u00e9 votre Mac avec teaBASE<\/a><br \/>\npour s\u00e9curiser votre env de dev, c&#8217;est un compl\u00e9ment logique.<\/p>\n<p>C\u00f4t\u00e9 limites, faut \u00eatre honn\u00eate, Seatbelt n&#8217;est pas document\u00e9 par Apple depuis macOS 10.5 et c&#8217;est du defense-in-depth, et pas une vraie fronti\u00e8re de VM. Quand \u00e0 l&#8217;exfiltration HTTPS elle n&#8217;est pas bloqu\u00e9e car l&#8217;agent peut toujours <code>curl<\/code> n&#8217;importe quoi sur le port 443. C&#8217;est logique mais bon, c&#8217;est pas \u00e9tanche \u00e0 100% quoi&#8230;<\/p>\n<p>Et surtout c&#8217;est macOS only pour l&#8217;instant (le port Linux est en chantier), et bien s\u00fbr le <code>\/tmp<\/code> partag\u00e9 entre les comptes locaux reste un vecteur potentiel. J&#8217;aurais aim\u00e9 aussi que le r\u00e9seau soit coup\u00e9 par d\u00e9faut sauf whitelist, mais bon, faudra attendre. Apr\u00e8s entre \u00e7a et laisser Claude Code en roue libre avec les pleins pouvoirs sur votre machine&#8230; y&#8217;a pas photo.<\/p>\n<p>Bref, pour du vibe coding sur Mac, c&#8217;est le minimum vital.<\/p>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>J&#8217;sais pas si vous vous en rendez compte mais les agents IA qui codent sur votre machine ont acc\u00e8s \u00e0 vos cl\u00e9s SSH, vos credentials AWS, votre Keychain et compagnie. Ils ont acc\u00e8s \u00e0 TOUT ! C&#8217;est comme filer les cl\u00e9s de votre appart \u00e0 un gars que vous avez crois\u00e9 sur le parking de Leclerc y&#8217;a pas 5 min. Hazmat prend le probl\u00e8me \u00e0 l&#8217;envers : au lieu de demander poliment \u00e0 l&#8217;agent de se tenir tranquille, il l&#8217;enferme dans un compte macOS s\u00e9par\u00e9. Du coup, vos ~\/.ssh, ~\/.aws, votre Keychain deviennent structurellement inaccessibles. Pour en profiter, faut faire un brew install dredozubov\/tap\/hazmat puis cd \/tmp hazmat init &#8211;bootstrap-agent claude Et hop, 10 minutes plus tard votre agent tourne dans sa cage. (le premier snapshot est ultra loooong mais apr\u00e8s c&#8217;est de l&#8217;incr\u00e9mental donc \u00e7a ira plus vite) L&#8217;isolation repose sur 3 couches ind\u00e9pendantes, un peu comme les sas d&#8217;un sous-marin. Il y a d&#8217;abord un utilisateur agent d\u00e9di\u00e9 (vos fichiers perso deviennent alors hors de port\u00e9e, point). Ensuite, une politique seatbelt g\u00e9n\u00e9r\u00e9e dynamiquement \u00e0 chaque session qui consiste \u00e0 ce que le kernel de macOS v\u00e9rifie chaque acc\u00e8s fichier et refuse tout ce qui n&#8217;est pas explicitement autoris\u00e9 pour cette session pr\u00e9cise. Et par-dessus, des r\u00e8gles pf firewall qui emp\u00eachent l&#8217;agent d&#8217;envoyer du trafic SMTP, IRC, FTP, Tor ou VPN. Comme \u00e7a, un agent qui tentera d&#8217;exfiltrer vos donn\u00e9es par mail se retrouvera bloqu\u00e9 net au niveau du noyau. C\u00f4t\u00e9 supply chain, Hazmat force npm ignore-scripts=true par d\u00e9faut. Comme \u00e7a, par exemple le fameux hack axios qui livrait un RAT via un hook postinstall en 2 secondes chrono n&#8217;est plus possible ici ! Y&#8217;a aussi une blocklist DNS qui redirige les services de tunnel connus (ngrok, pastebin, webhook.site) vers localhost. Contre un domaine perso fra\u00eechement enregistr\u00e9, \u00e7a passera mais les vecteurs d&#8217;exfiltration classiques, \u00e7a devrait r\u00e9sister. Hazmat utilise TLA+, le m\u00eame formalisme que les ing\u00e9s d&#8217;Amazon utilisent pour v\u00e9rifier les protocoles de DynamoDB. Genre, l&#8217;installation des r\u00e8gles sudoers AVANT le firewall (\u00e9videmment, \u00e7a cr\u00e9e une fen\u00eatre de vuln\u00e9rabilit\u00e9), les restrictions qui bloquaient les lectures mais pas les \u00e9critures, ou encore une restauration cloud sans v\u00e9rifier qu&#8217;un snapshot existait&#8230;etc, c&#8217;est le genre de truc qu&#8217;aucun test unitaire n&#8217;aurait chop\u00e9. \u00c7a supporte Claude Code (y compris le fameux &#8211;dangerously-skip-permissions), OpenCode et Codex. Attention par contre, si votre projet utilise Docker, y&#8217;a deux cas de figure : soit le daemon Docker est priv\u00e9 au projet et Hazmat le route automatiquement vers un mode Docker Sandbox, soit c&#8217;est un daemon partag\u00e9 et l\u00e0 faudra passer &#8211;docker=none explicitement. La commande hazmat explain montre aussi exactement ce que le sandbox autorise avant de lancer quoi que ce soit&#8230; et \u00e7a, c&#8217;est pas du luxe quand on sait pas trop ce qu&#8217;on va l\u00e2cher dans la nature. Le hazmat diff qui affiche les changements faits par l&#8217;agent depuis le dernier snapshot Kopia, c&#8217;est plut\u00f4t bien pens\u00e9. Et si l&#8217;agent casse un truc ? hazmat restore et c&#8217;est reparti, comme un Ctrl+Z g\u00e9ant pour tout votre projet. Si vous avez d\u00e9j\u00e0 configur\u00e9 votre Mac avec teaBASE pour s\u00e9curiser votre env de dev, c&#8217;est un compl\u00e9ment logique. C\u00f4t\u00e9 limites, faut \u00eatre honn\u00eate, Seatbelt n&#8217;est pas document\u00e9 par Apple depuis macOS 10.5 et c&#8217;est du defense-in-depth, et pas une vraie fronti\u00e8re de VM. Quand \u00e0 l&#8217;exfiltration HTTPS elle n&#8217;est pas bloqu\u00e9e car l&#8217;agent peut toujours curl n&#8217;importe quoi sur le port 443. C&#8217;est logique mais bon, c&#8217;est pas \u00e9tanche \u00e0 100% quoi&#8230; Et surtout c&#8217;est macOS only pour l&#8217;instant (le port Linux est en chantier), et bien s\u00fbr le \/tmp partag\u00e9 entre les comptes locaux reste un vecteur potentiel. J&#8217;aurais aim\u00e9 aussi que le r\u00e9seau soit coup\u00e9 par d\u00e9faut sauf whitelist, mais bon, faudra attendre. Apr\u00e8s entre \u00e7a et laisser Claude Code en roue libre avec les pleins pouvoirs sur votre machine&#8230; y&#8217;a pas photo. Bref, pour du vibe coding sur Mac, c&#8217;est le minimum vital.<\/p>\n","protected":false},"author":1,"featured_media":2696,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"give_campaign_id":0,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_kadence_starter_templates_imported_post":false,"footnotes":""},"class_list":["post-2695","page","type-page","status-publish","has-post-thumbnail","hentry"],"campaignId":"","_links":{"self":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages\/2695","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/comments?post=2695"}],"version-history":[{"count":0,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages\/2695\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/media\/2696"}],"wp:attachment":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/media?parent=2695"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}