La sécurité de vos agents de code, en une commande.
Règles suivies, actions dangereuses bloquées, code corrigé avant le commit, et chaque agent visible par votre équipe.
npx -y @cybedefend/vibedefend@latest installRégion UE ou États-Unis, choisie à l'installation. Le garde-fou décide sur votre machine.
8 fois moins de règles enfreintes.
Vos règles, servies avant chaque modification.
Les règles métier apprises dans votre code et les règles de sécurité de votre stack, choisies pour le fichier modifié.
Claude Code écrit
billing/refund.tsasync function refund(order, amount) { if (amount > 500) await approvals.second(order); await payments.refund(order, amount); return receipt(order); }
Un remboursement de plus de 500 € demande un second validateur.
Approuvée une fois par Sofia M.Écrit avec votre règle, avant que la modification ne s'applique.
Les commandes dangereuses ne s'exécutent jamais.
Suppressions de schéma, sudo, lectures de secrets, push forcés : refusés. L'agent sait pourquoi et prend un autre chemin.
OpenAI Codex veut exécuter
rm -rf ./storage/uploads
- Lu
- Vérifié contre vos garde-fous
- Refusé
- Exécuté
Bloqué : chemin protégé, fichiers des utilisateurs
Corrigé avant le commit.
Quand l'agent termine, ses modifications sont scannées et il corrige chaque faille. Les failles du projet sont dans sa session.
Injection SQL atteignable
CWE-89, src/db/users.repo.ts:42"SELECT * FROM users WHERE id = $1", [id]Corrigée par l'agent avant le commit
Puis prouvé, pas supposé.
Après le commit, BLSA vérifie sa logique métier et prouve chaque verdict : la règle, le chemin, la ligne.
Un remboursement de plus de 500 € demande un second validateur.BLSA, mode preuve
POST /refundsPoint d'entrée
approvals.second(order)Le contrôle de la règle
payments.refund(order)S'exécute après le contrôle
Tient : approuvé avant d'être payé
Tout ce qu'il fait, sur une seule carte.
Chaque règle servie, chaque refus et chaque correction, rattachés à leur agent et à leur développeur dans le Brain.
Cursorsrc/billing/cart-checkout.ts3 règles servies
DROP TABLE invoices;Bloquée
CWE-89, src/db/users.repo.ts:42Faille corrigée
Rattaché à Sofia M., dans le Brain
Personne n'a prévenu votre agent. Désormais, il sait.
Une commande. Tous vos agents. Sans carte bancaire.
npx -y @cybedefend/vibedefend@latest installEn détail
Puis prouvé, pas supposé.
Après le commit, BLSA (Business Logic Security Analysis, construit avec le CNRS et le laboratoire CRIStAL) vérifie la logique métier du changement, et son mode preuve montre pourquoi chaque verdict tient ou casse : la règle, le chemin dans le code, la ligne. BLSA est ouvert aujourd'hui à nos design partners.
Les huit failles de logique métier qu'il évite
des vulnérabilités d'API exploitent la logique métier, pas une CVE connue.
Wallarm, API ThreatStats 2026
Fuite multi-tenantcloisonnement par tenant des requêtesCWE-639
Recherche par id sans filtre tenant : n'importe quel client connecté peut lire cette commande.
avant
// GET /api/orders/:id const order = await db.order.findUnique({ where: { id: req.params.id }, }); return res.json(order);
après
// GET /api/orders/:id const order = await db.order.findUnique({ where: { id: req.params.id, tenantId: req.user.tenantId }, }); if (!order) return res.status(404).end(); return res.json(order);
Règle : cloisonnement par tenant des requêtes
Contournement de remboursementplafond d'autorisation sur les remboursementsCWE-840
Remboursement créé sans contrôle de rôle ni plafond : n'importe quel montant part, sur n'importe quel PaymentIntent.
avant
router.post('/refund', async (req, res) => { await stripe.refunds.create({ payment_intent: req.body.intent, amount: req.body.amount, }); return res.json({ ok: true }); });
après
router.post('/refund', requireRole('finance'), async (req, res) => { const intent = await getOwnedIntent(req.user, req.body.intent); const amount = clampRefund(intent, req.body.amount); await stripe.refunds.create({ payment_intent: intent.id, amount }); return res.json({ ok: true }); });
Règle : plafond d'autorisation sur les remboursements
Idempotence absenteclé d'idempotence sur les webhooksCWE-837
Aucune clé d'idempotence : le même événement Stripe rejoué crédite la commande deux fois.
avant
app.post('/webhook/stripe', async (req, res) => { await orders.markPaid(req.body.id); await ledger.append({ type: 'charge', ... }); res.send('ok'); });
après
app.post('/webhook/stripe', async (req, res) => { const key = req.headers['idempotency-key']; if (await seen.has(key)) return res.send('dup'); await orders.markPaid(req.body.id); await ledger.append({ type: 'charge', key, ... }); await seen.add(key, '24h'); res.send('ok'); });
Règle : clé d'idempotence sur les webhooks
Données personnelles dans les logspolitique de données personnelles dans les logsCWE-532
req.body part entier dans les logs : e-mail et mot de passe en clair chez votre fournisseur de logs.
avant
logger.info('signup', { user: req.body });
après
logger.info('signup', { userId: hash(req.body.email), region: req.body.region, });
Règle : politique de données personnelles dans les logs
Middleware d'auth contournémiddleware d'auth obligatoire sur les routesCWE-306
Route montée sans middleware d'auth : /admin/users est accessible sans session.
avant
// public.routes.ts router.get('/admin/users', listAllUsers);
après
// admin.routes.ts (auth + rbac applied at mount) router.use(requireSession, requireRole('admin')); router.get('/users', listAllUsers);
Règle : middleware d'auth obligatoire sur les routes
Déploiement de feature flagvaleurs par défaut sûres des feature flagsCWE-1188
Flag absent = true par défaut : l'export s'active tout seul en production.
avant
if (flags.allow_anyone_to_export ?? true) { return exportAll(); }
après
if (flags.allow_anyone_to_export === true && req.user.role === 'admin') { audit.log('export.all', req.user); return exportAll(); }
Règle : valeurs par défaut sûres des feature flags
Pas de rate limitingrate limiting sur le loginCWE-307
Aucune limite d'essais sur /login : la force brute sur les identifiants est illimitée.
avant
router.post('/login', loginHandler);
après
router.post('/login', rateLimit({ windowMs: 60_000, max: 8, keyGenerator: ipAndEmail }), loginHandler);
Règle : rate limiting sur le login
Export de tous les tenantscloisonnement par tenant des exports adminCWE-285
findMany sans filtre tenant : l'export CSV renvoie les utilisateurs de tous les clients.
avant
router.get('/admin/export', requireAdmin, async (_req, res) => { const rows = await db.user.findMany({}); res.csv(rows); });
après
router.get('/admin/export', requireAdmin, async (req, res) => { const rows = await db.user.findMany({ where: { tenantId: req.user.tenantId }, }); audit.log('export', req.user); res.csv(rows); });
Règle : cloisonnement par tenant des exports admin
Quatre couches, une seule installation.
Règles servies
Les règles métier extraites de votre code et vos règles de sécurité, servies avant chaque modification.
Claude Code écrit
src/billing/cart-checkout.ts
const total = new Decimal128(cart.sum); const rows = await db.query( "SELECT * FROM carts WHERE id = $1", [id] );
Les montants utilisent Decimal128, jamais Number.
Tirée de src/billing.ts:14Toute requête qui mêle une saisie utilisateur est paramétrée.
OWASP Top 10Servies avant la modification
Garde-fou des secrets
Les lectures brutes de secrets sont refusées ; l'agent reçoit la référence gérée à la place.
Cursorwebhooks.ts
cat .env | grep STRIPEBloqué : lecture brute d'un secret
À la place
process.env.STRIPE_WEBHOOK_SECRETnpm test -- webhooksLes tests passent
Consigné pour l'équipe
Garde-fou des actions
Commandes destructrices, suppressions de schéma, chemins protégés : arrêtés avant de s'exécuter.
OpenAI Codex
rm -rf dist/Autorisé : sortie de build
rm -rf .cache/Autorisé : cache
rm -rf ./storage/uploadsBloqué : chemin protégé, fichiers des utilisateurs
Consigné pour l'équipe
Alertes en direct
Les alertes SAST, SCA, secrets, IaC et CI/CD, en direct dans la session, pour que l'agent les corrige.
GitHub Copilot
SAST
src/db/users.repo.ts:42SQL injection
SCA
package.jsonlodash 4.17.20, CVE-2021-23337
Secrets
config/prod.ymlAWS access key
IaC
infra/main.tfS3 bucket public-read
CI/CD
.github/workflows/deploy.ymlpull_request_target
Dans le contexte de l'agent, en direct
Vos référentiels, servis sous forme de règles.
Les règles de sécurité que reçoit l'agent suivent les référentiels que vos auditeurs vérifient.
- OWASP Top 10
- SOC 2
- RGPD
- ISO 27001
Essayez-le gratuitement sur votre code.
Sans carte bancaire. Pour aller plus loin, nous menons un pilote avec votre équipe et fixons le prix avec vous.
Avant d'installer.
Dans l'étude contrôlée de CybeDefend du 24 août 2026, le même agent a appliqué 89 % des règles précises avec VibeDefend, contre 12 % sans outil et 13 % avec un fichier de règles tenu à la main.