
Runtime sandboxé open-source pour agents IA — isolation gVisor/Docker, coffre-fort d’identifiants, journal d’audit immuable. Conçu après CVE-2026-25253.
Le runtime sandboxé open-source pour les agents IA
Exécutez des agents IA en toute confiance. Chaque agent dispose de son propre périmètre d'autorisations, de son coffre-fort d'identifiants, de sa piste d'audit et de son interrupteur d'arrêt d'urgence.
Le 27 janvier 2026, CVE-2026-25253 est devenue la première CVE jamais attribuée à un système IA agentique. Une vulnérabilité critique de détournement WebSocket dans OpenClaw a permis l'exécution de code à distance en un clic contre toute instance exposée — y compris celles liées uniquement à localhost.
La même semaine, la campagne ClawHavoc a infiltré plus de 341 compétences malveillantes dans la marketplace d'OpenClaw. Chaque compétence installée depuis ClawHub s'exécutait avec les mêmes autorisations qu'OpenClaw lui-même — accès complet au disque, jetons OAuth, clés API. Aucun sandbox. Aucune piste d'audit. Aucun interrupteur d'arrêt d'urgence.
« Installer une compétence depuis ClawHub lui accorde l'accès aux mêmes ressources qu'OpenClaw lui-même. Il n'existe aucune isolation par sandbox entre les compétences par défaut. » — Analyse de sécurité DEV Community, avril 2026
Les chiffres :
AgentBox est la solution structurelle. Pas un correctif — un runtime.
Chaque agent que vous exécutez dispose de :
| Protection | Comment |
|---|---|
| Autorisations zéro confiance | Les agents déclarent exactement ce dont ils ont besoin. Rien d'autre n'est accessible. |
| Isolation au niveau du noyau | gVisor intercepte chaque appel système. L'injection de prompt ne peut pas franchir cette frontière. |
| Coffre-fort d'identifiants | Chiffrement AES-256-GCM. Les agents ne voient jamais les secrets bruts — uniquement des jetons limités. |
| Journal d'audit immuable | Chaîne de hachage SHA-256. Chaque action est journalisée. Preuve d'altération. |
| Interrupteur d'arrêt d'urgence | Terminez n'importe quel agent en moins de 100 ms. Arrêt automatique en cas de dépassement de limite. |
| Limites de ressources | Temps, mémoire, nombre de requêtes — appliquées à l'exécution, pas à la configuration. |
Avant AgentBox Après AgentBox
───────────────── ──────────────
Agent → disque complet ❌ Agent → chemins autorisés uniquement ✅
Agent → tout le réseau ❌ Agent → hôtes autorisés uniquement ✅
Agent → secrets bruts ❌ Agent → jetons limités ✅
Aucune piste d'audit ❌ Chaque action journalisée ✅
Aucun interrupteur d'arrêt ❌ Arrêt en <100 ms ✅
Compétences exécutées en root ❌ Sandbox isolé au niveau du noyau ✅
# Installation
go install github.com/siyad01/agentbox/cmd/agentbox@latest
# Valider un manifeste avant l'exécution
agentbox validate manifests/email-sorter.yaml
# Exécuter un agent dans un sandbox
agentbox run --manifest manifests/email-sorter.yaml python agent.py
# Consulter ce que l'agent a fait
agentbox audit --log logs/email-sorter-audit.log
# Vérifier que le journal n'a pas été altéré
agentbox verify logs/email-sorter-audit.log
# Gérer les secrets
agentbox vault add ANTHROPIC_API_KEY
agentbox vault list
Chaque agent déclare exactement ce dont il a besoin. Tout ce qui n'est pas listé est inaccessible.
name: "email-sorter"
version: "1.0.0"
description: "Lit la boîte de réception, catégorise les e-mails, écrit dans le dossier trié"
runtime: docker # ou : gvisor (niveau noyau), firecracker (MicroVM)
permissions:
filesystem:
read:
- "~/Documents/inbox"
write:
- "~/Documents/sorted"
deny: # TOUJOURS bloqué — même s'il figure dans la liste de lecture
- "~/.ssh"
- "~/.aws"
- "~/.config"
- "/etc"
network:
allow:
- "api.anthropic.com"
- "gmail.googleapis.com"
deny:
- "*" # bloquer tout le reste
tools:
allow:
- "read_file"
- "write_file"
- "list_*"
deny:
- "execute_shell" # aucun accès shell, jamais
- "*_delete" # aucun outil de suppression
credentials:
- ANTHROPIC_API_KEY # injecté depuis le coffre-fort à l'exécution
- GMAIL_TOKEN # l'agent ne voit jamais la valeur brute
limits:
max_tokens: 50000 # budget de jetons LLM
max_duration: "30m" # arrêt après 30 minutes
max_memory_mb: 256 # plafond de RAM
max_requests: 500 # nombre maximal d'invocations d'outils
audit:
log_level: full
alert_on:
- filesystem_deny
- network_deny
- token_budget_80pct
log_path: "logs/email-sorter-audit.log"
agentbox run --manifest agent.yaml python agent.py
│
▼
┌─────────────────────────────────────────────────────┐
│ Moteur de politiques │
│ Analyse le manifeste → construit les listes │
│ d'autorisation/refus │
│ Valide les signatures → rejette les compétences │
│ non signées │
│ Injecte les identifiants depuis le coffre-fort │
└──────────────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ Couche d'isolation │
│ │
│ Docker → conteneur + seccomp + cap-drop │
│ gVisor → noyau en espace utilisateur, interception│
│ des appels système │
│ Firecracker → noyau MicroVM dédié par agent │
│ │
│ Système de fichiers : seuls les chemins déclarés │
│ sont montés │
│ Réseau : seuls les hôtes déclarés sont accessibles │
│ Capacités : TOUTES supprimées, aucune ajoutée │
└──────────────────────┬──────────────────────────────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
Journal d'audit Coffre-fort Moniteur de
(chaîne de d'identifiants ressources
hachage) AES-256-GCM arrêt automatique
chaque action jetons limités en cas de
journalisée dépassement
Tous les autres sandbox s'arrêtent à la frontière du conteneur. Un agent exploitant une vulnérabilité du noyau peut s'en échapper.
gVisor intercepte chaque appel système avant qu'il n'atteigne le noyau hôte :
L'agent tente : write("/home/user/.ssh/id_rsa")
│
▼
Noyau en espace utilisateur gVisor
│
Chemin dans la liste de refus ? → OUI
│
▼
EPERM renvoyé immédiatement
Le noyau hôte ne voit jamais cet appel système
L'injection de prompt ne peut pas franchir cette couche
agentbox <commande> [options]
Commandes :
run Exécuter un agent dans un sandbox
validate Valider un fichier manifeste
kill Terminer un agent en cours d'exécution
audit Consulter les journaux d'audit des agents
verify Vérifier l'intégrité du journal d'audit
vault Gérer les identifiants chiffrés
serve Démarrer le serveur API REST
version Afficher la version
Exemples :
agentbox validate manifests/email-sorter.yaml
agentbox run --manifest manifests/email-sorter.yaml python agent.py
agentbox kill agent-abc123
agentbox audit --log logs/email-sorter.log --deny
agentbox audit --log logs/email-sorter.log --last 1h
agentbox verify logs/email-sorter.log
agentbox vault add ANTHROPIC_API_KEY
agentbox vault list
agentbox vault delete OLD_KEY
agentbox serve :8081
Démarrez avec agentbox serve (par défaut : :8081).
| Méthode | Point de terminaison | Description |
|---|---|---|
| GET | /health | Vérification de l'état de santé |
| GET | /dashboard | Tableau de bord web |
| GET | /api/agents | Lister tous les agents |
| POST | /api/agents | Démarrer un nouvel agent |
| DELETE | /api/agents/:id | Tuer un agent |
| GET | /api/audit | Interroger le journal d'audit |
# Lister les agents en cours d'exécution
curl http://localhost:8081/api/agents
# Démarrer un agent
curl -X POST http://localhost:8081/api/agents \
-H "Content-Type: application/json" \
-d '{"manifest":"manifests/email-sorter.yaml","command":["python","agent.py"]}'
# Tuer un agent
curl -X DELETE http://localhost:8081/api/agents/abc123
# Interroger le journal d'audit
curl "http://localhost:8081/api/audit?deny=true&agent=email-sorter"
Chaque action d'agent est journalisée dans un fichier JSON Lines en ajout seul, avec chaîne de hachage :
{"id":1,"hash":"a3f2...","prev_hash":"genesis","timestamp":"2026-05-05T09:00:00Z","agent_id":"abc123","agent_name":"email-sorter","event_type":"agent_start","allowed":true,"resource":"manifests/email-sorter.yaml"}
{"id":2,"hash":"b7c1...","prev_hash":"a3f2...","timestamp":"2026-05-05T09:00:01Z","agent_id":"abc123","agent_name":"email-sorter","event_type":"filesystem_allow","allowed":true,"resource":"read:/home/user/Documents/inbox/mail.txt","rule":"filesystem.read: ~/Documents/inbox"}
{"id":3,"hash":"d9e4...","prev_hash":"b7c1...","timestamp":"2026-05-05T09:00:01Z","agent_id":"abc123","agent_name":"email-sorter","event_type":"filesystem_deny","allowed":false,"resource":"read:/home/user/.ssh/id_rsa","rule":"filesystem.deny: ~/.ssh","reason":"path is explicitly denied"}
Détection d'altération :
agentbox verify logs/email-sorter-audit.log
✅ Le journal d'audit est intact
Entrées : 47 (IDs 1–47)
Chaîne de hachage : ininterrompue
Modifiez n'importe quel caractère dans n'importe quelle entrée et la vérification échoue immédiatement — la chaîne est rompue.
# Stocker un secret (jamais journalisé, jamais en clair dans l'environnement)
agentbox vault add ANTHROPIC_API_KEY
# Lister les noms d'identifiants stockés (les valeurs ne sont jamais affichées)
agentbox vault list
# Vérifier qu'un identifiant peut être déchiffré
agentbox vault test ANTHROPIC_API_KEY
# Pivoter un identifiant
agentbox vault add ANTHROPIC_API_KEY # add met à jour l'existant
Les identifiants sont chiffrés avec AES-256-GCM. La clé maîtresse est dérivée de votre mot de passe de coffre-fort — jamais stockée sur disque. Au démarrage de l'agent, AgentBox injecte les identifiants sous forme de variables d'environnement limitées. L'agent appelle os.getenv("ANTHROPIC_API_KEY") normalement — il ne touche jamais au coffre-fort.
AgentBox tue les agents qui dépassent leurs limites déclarées :
# Cet agent est configuré avec max_duration: 5s
agentbox run --manifest manifests/timeout-test.yaml python long_running_agent.py
Agent started
tick 1
tick 2
tick 3
tick 4
tick 5
🛑 Killing agent timeout-test: duration limit exceeded: 5s
⚠️ Agent timeout-test exited code 137 in 5.2s
Code de sortie 137 = SIGKILL. Arrêt propre, entrée d'audit finale écrite.
# Cloner
git clone https://github.com/siyad01/agentbox
cd agentbox
# Compiler
go build -o agentbox ./cmd/agentbox/
# Exécuter les tests (27 tests, tous réussis)
go test ./...
# Installer globalement
go install ./cmd/agentbox/
Prérequis :
agentbox/
├── cmd/agentbox/main.go ← Point d'entrée CLI
├── internal/
│ ├── policy/
│ │ ├── manifest.go ← Schéma du manifeste YAML
│ │ ├── parser.go ← validation + valeurs par défaut
│ │ └── engine.go ← moteur de décision refus-d'abord (20 tests)
│ ├── audit/
│ │ ├── logger.go ← journal en ajout seul avec chaîne de hachage SHA-256
│ │ ├── verifier.go ← détection d'altération
│ │ └── reader.go ← interrogation + filtrage
│ ├── vault/
│ │ ├── store.go ← stockage d'identifiants chiffré AES-256-GCM
│ │ └── injector.go ← injection à l'exécution (7 tests)
│ ├── sandbox/
│ │ ├── sandbox.go ← interface Sandbox
│ │ ├── docker.go ← backend Docker
│ │ ├── gvisor.go ← backend gVisor (niveau noyau)
│ │ ├── manager.go ← gestion du cycle de vie des agents
│ │ └── util.go ← détection WSL2, utilitaires de chemins
│ ├── monitor/
│ │ └── enforcer.go ← limites de ressources + arrêt automatique
│ └── api/
│ └── server.go ← API REST sur :8081
└── manifests/
├── email-sorter.yaml ← exemple de production
└── timeout-test.yaml ← exemple d'application des limites
Refus-d'abord par défaut. Les agents démarrent avec zéro autorisation. Chaque capacité doit être explicitement déclarée.
La liste de refus l'emporte toujours. Même si un chemin figure à la fois dans la liste de lecture et dans la liste de refus, la liste de refus a priorité. Aucune exception.
Application au niveau du noyau avec gVisor. Les filtres seccomp et la suppression de capacités opèrent à la frontière des appels système. La sortie du modèle — qui est contrôlable par un attaquant — s'exécute en espace utilisateur et ne peut pas modifier la politique au niveau du noyau.
Isolation des identifiants. La clé maîtresse du coffre-fort n'est jamais stockée sur disque. Les identifiants sont injectés sous forme de jetons limités à courte durée de vie au démarrage du sandbox et supprimés à la sortie. La compromission d'un processus d'agent ne compromet pas le coffre-fort d'identifiants.
Piste d'audit immuable. La chaîne de hachage SHA-256 rend détectable toute modification rétroactive du journal. Toute modification d'une entrée rompt la chaîne à partir de ce point.
Consultez SECURITY.md pour signaler des vulnérabilités.
| Fonctionnalité | AgentBox | Sandbox OpenClaw | Docker uniquement | AccuKnox |
|---|---|---|---|---|
| Open source (Apache 2.0) | ✅ | ✅ | ✅ | ❌ |
| Auto-hébergeable | ✅ | ✅ | ✅ | K8s uniquement |
| Isolation gVisor / noyau | ✅ | ❌ | ❌ | ✅ |
| Coffre-fort d'identifiants | ✅ | ❌ | ❌ | ✅ |
| Journal d'audit immuable | ✅ | ❌ | ❌ | ✅ |
| Arrêt automatique en cas de dépassement de limite | ✅ | ❌ | ❌ | ✅ |
| Indépendant du framework | ✅ | ❌ (OpenClaw uniquement) | ✅ | ✅ |
| Déploiement binaire unique | ✅ | ❌ | ✅ | ❌ |
Consultez CONTRIBUTING.md.
Apache 2.0 — libre d'utilisation, de modification et de distribution. Consultez LICENSE.
Conçu avec Go · Zéro dépendance externe pour les fonctionnalités de sécurité essentielles · Auto-hébergeable en une commande
Si CVE-2026-25253 vous a préoccupé, voici la solution. Donnez-lui une ⭐