Les agents IA appellent votre API : 5 erreurs d'authentification qui créent des portes dérobées
80 % des équipes utilisent des agents IA en production, mais seulement 22 % les traitent comme des identités indépendantes. Cinq erreurs d'authentification qui transforment votre API en porte ouverte.
Une enquête réalisée en 2026 auprès de plus de 900 praticiens a révélé que 80,9 % des équipes d'ingénierie utilisent des agents d'IA en test ou en production. La même enquête a révélé que seulement 21,9 % traitent ces agents comme des entités identitaires indépendantes. Le reste partage informations d'identification, ignorez les pistes d'audit et accordez un accès API global au code qui s'exécute sans supervision.
Cette lacune constitue un problème de sécurité. L'OWASP a publié son Top 10 des applications agentiques en 2026, ainsi que l'utilisation abusive d'outils et L'escalade de privilèges arrive en tête de liste avec 520 incidents signalés. Meta a documenté un agent d'IA malveillant qui a réussi chaque contrôle d'identité car il détenait des informations d'identification valides provenant d'un scénario d'adjoint confus. 48,9 % des organisations ne peuvent pas voir même ce que font leurs agents avec l'accès à l'API.
Cet article couvre les cinq erreurs d'authentification qui transforment votre API en une porte ouverte pour les agents IA, et comment les fermer. un avec un code fonctionnel.
Erreur 1 : partager une seule clé API entre tous les agents
44 % des équipes utilisent des clés API statiques pour les agents IA. Lorsque plusieurs agents partagent une clé, vous perdez trois choses : l'audit trails (quel agent a fait cette demande ?), révocation granulaire (la révocation d'un agent les tue tous) et limitation du taux par agent (un agent en fuite épuise le quota pour chaque agent).
# Three different agents share one API key
# Agent A: summarizes support tickets
# Agent B: processes refunds
# Agent C: exports customer PII
curl -X POST https://api.acme.com/v1/customers/export \\
-H "Authorization: Bearer sk_live_shared_key_for_all_agents" \\
-H "Content-Type: application/json" \\
-d '{"format": "csv", "include_pii": true}'
# Which agent made this request? You can't tell.
# Need to revoke Agent C? You break A and B too.
La solution : émettre un identifiant unique par agent. Chaque clé correspond à une identité d'agent spécifique, une portée définie de points de terminaison et sa propre limite de débit. Lorsque vous devez révoquer l'agent C, les agents A et B continuent de fonctionner.
# Each agent gets its own scoped API key
curl -X POST https://api.acme.com/v1/tickets/summary \\
-H "Authorization: Bearer sk_live_agent_a_tickets_readonly" \\
-H "X-Agent-ID: agent-ticket-summarizer" \\
-H "Content-Type: application/json" \\
-d '{"ticket_id": "TKT-4829"}'
Utilisez le X-Agent-ID en-tête à côté de la clé API afin que vos journaux attribuent toujours les requêtes à un
agent spécifique. Décodez le jeton pour vérifier que ses revendications correspondent à l'agent qui effectue l'appel.
# Inspect what permissions an agent token carries
curl -s -X POST https://api.botoi.com/v1/jwt/decode \\
-H "Content-Type: application/json" \\
-d '{"token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZ2VudC1yZWZ1bmQtcHJvY2Vzc29yIiwic2NvcGVzIjpbInJlZnVuZHM6d3JpdGUiLCJvcmRlcnM6cmVhZCJdLCJleHAiOjE3NDk2MDAsMDAwLCJpc3MiOiJhY21lLWF1dGgifQ.signature"}'
{
"success": true,
"data": {
"header": {
"alg": "RS256",
"typ": "JWT"
},
"payload": {
"sub": "agent-refund-processor",
"scopes": ["refunds:write", "orders:read"],
"exp": 1749600000,
"iss": "acme-auth"
}
}
}
Le problème confus des adjoints : L'incident de l'agent voyou de Meta s'est produit parce que l'agent détenait des informations d'identification valides qui accordaient un accès au-delà de la portée prévue. L'agent a passé tous les contrôles d'identité. Le les pouvoirs étaient légitimes. Le problème était que personne ne les adaptait à l'objectif de l'agent.
Erreur 2 : accorder un accès complet à l'API lorsqu'un agent a besoin d'un point de terminaison
35 % des organisations s'appuient sur des comptes de services partagés pour les agents IA. Un compte de service avec un accès complet à l'API Cela signifie que votre agent de synthèse des tickets peut également traiter les remboursements, exporter les informations personnelles des clients et supprimer des enregistrements. C'est un principe de violation du moindre privilège.
Étendez chaque jeton d'agent aux points de terminaison et aux actions minimum dont il a besoin. Un agent de traitement des remboursements obtient
refunds:write et orders:read. Rien de plus.
// Mint a scoped token for each agent at deploy time
interface AgentTokenClaims {
sub: string; // unique agent identity
scopes: string[]; // minimum required permissions
exp: number; // short TTL: 1-24 hours
iss: string; // your auth service
rate_limit: number; // requests per minute for this agent
}
const agentClaims: AgentTokenClaims = {
sub: "agent-refund-processor",
scopes: ["refunds:write", "orders:read"],
exp: Math.floor(Date.now() / 1000) + 3600, // 1 hour
iss: "acme-auth",
rate_limit: 30,
};
Avant de déployer un agent, vérifiez que son jeton comporte les étendues correctes et n'a pas expiré. Décoder le
jeton avec le point de terminaison Botoi JWT pour inspecter les réclamations et les is_expired drapeau.
# Decode the token and check expiry before trusting claims
curl -s -X POST https://api.botoi.com/v1/jwt/decode \\
-H "Content-Type: application/json" \\
-d '{
"token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZ2VudC10aWNrZXQtc3VtbWFyaXplciIsInNjb3BlcyI6WyJ0aWNrZXRzOnJlYWQiXSwiZXhwIjoxNzQ5Njg2NDAwfQ.abc123"
}'
{
"success": true,
"data": {
"header": {
"alg": "HS256",
"typ": "JWT"
},
"payload": {
"sub": "agent-ticket-summarizer",
"scopes": ["tickets:read"],
"exp": 1749686400
},
"signature": "abc123",
"is_expired": false,
"expires_at": "2025-06-11T22:40:00.000Z",
"expires_in_seconds": 3600
}
}
| Approche | Contrôle de la portée | Révocation | Piste d'audit | Risque |
|---|---|---|---|---|
| Compte de service partagé | Aucune | Brise tous les agents | Aucune attribution | Haut |
| Clé API statique par agent | Niveau clé uniquement | Par agent | Par clé | Moyen |
| JWT limité par agent | Point de terminaison + action | Par agent + expiration | Réclamations complètes | Faible |
| Échange de jetons OBO | Hérité + rétréci | Par session | Chaîne complète | Le plus bas |
Les nouvelles solutions IAM pour les agents IA prennent en charge l'échange de jetons On-Behalf-Of (OBO). L'agent reçoit un jeton dérivé de la session de l'utilisateur d'origine, automatiquement limité aux autorisations accordées par l'utilisateur. Ceci Cette approche crée une chaîne d'autorisation complète de l'utilisateur à l'agent en passant par l'API.
Erreur 3 : pas d'expiration des identifiants de l'agent
43 % des équipes utilisent l'authentification par nom d'utilisateur/mot de passe pour les agents IA. Ces informations d'identification n'expirent pas. API statique les clés n'expirent pas non plus, à moins que vous n'intégriez l'expiration dans votre système. Un titre d'agent qui dure pour toujours est un identifiant qui peut être volé, divulgué dans les journaux ou enregistré dans un référentiel et exploité des mois plus tard.
Définissez une durée de vie maximale de 1 à 24 heures sur les jetons d'agent. Générez un nouvel identifiant à chaque déploiement ou sur un calendrier. Utilisez le générateur de mots de passe Botoi pour créer des secrets à haute entropie pour la signature HMAC.
# Generate a high-entropy secret for HMAC signing
curl -s -X POST https://api.botoi.com/v1/password/generate \\
-H "Content-Type: application/json" \\
-d '{"length": 64, "uppercase": true, "lowercase": true, "numbers": true, "symbols": false}'
{
"success": true,
"data": {
"password": "kX9mT2vR8nL4wQ6jY3bA5cF7hD1gP0sE9uI2oK4lM6nB8xZ3vC5tR7yW0qJ1aG"
}
}
Ajouter la signature de requête HMAC
Au-delà de l'authentification basée sur des jetons, signez chaque charge utile de demande avec HMAC-SHA256. Votre API vérifie la signature avant traiter la demande. Cela prouve que la charge utile n'a pas été altérée pendant le transport et lie chaque demande à un secret d'agent spécifique.
# Sign a request payload so your API can verify the sender
PAYLOAD='{"agent_id":"agent-refund-processor","action":"refund","order_id":"ORD-7291"}'
curl -s -X POST https://api.botoi.com/v1/hash/hmac \\
-H "Content-Type: application/json" \\
-d "{
\\"text\\": \\"$PAYLOAD\\",
\\"key\\": \\"kX9mT2vR8nL4wQ6jY3bA5cF7hD1gP0sE9uI2oK4lM6nB8xZ3vC5tR7yW0qJ1aG\\",
\\"algorithm\\": \\"sha256\\"
}"
{
"success": true,
"data": {
"hmac": "a3f8c2d1e5b7094f6d2c8a1e3b5f7d9e4c6a8b0d2f4e6c8a0b2d4f6e8c0a2b4",
"algorithm": "sha256"
}
}
Votre serveur API recalcule le HMAC à l'aide de sa copie stockée du secret de l'agent. Si les hachages correspondent, le la demande est authentique. Si ce n’est pas le cas, rejetez-le.
Automatisez la rotation des secrets
La rotation manuelle ne s'adapte pas lorsque vous exécutez des dizaines d'agents. Créez un script de rotation qui génère un nouveau secret, le déploie, vérifie la connectivité, puis révoque l'ancien.
import Botoi from "@botoi/sdk";
const botoi = new Botoi({ apiKey: process.env.BOTOI_API_KEY });
async function rotateAgentSecret() {
// Generate a new 64-character secret
const { data } = await botoi.password.generate({
length: 64,
uppercase: true,
lowercase: true,
numbers: true,
symbols: false,
});
console.log("New secret generated. Deploy to agent, then revoke the old one.");
// Hash the new secret for storage (never store plaintext)
const hashed = await botoi.hash.sha256({ input: data.password });
console.log("Hashed for DB:", hashed.data.hash);
return { secret: data.password, hash: hashed.data.hash };
}
rotateAgentSecret();
Erreur 4 : ignorer la journalisation des demandes pour les appels de machine à machine
48,9 % des organisations ignorent le trafic de machine à machine. Ils enregistrent les appels d'API humains mais exemptent les appels internes communication de service à service à partir de leur pile d'observabilité. Les agents de l’IA tombent dans cet angle mort.
Lorsqu'un agent se comporte mal, envoie un flot de requêtes, accède à des points de terminaison en dehors de sa portée ou obtient compromis, vous devez répondre à trois questions : quel agent, quand et qu'a-t-il touché ? Sans demande en vous connectant, vous ne pouvez répondre à aucune d'entre elles.
// Express middleware: log every agent request
app.use("/v1/*", (req, res, next) => {
const agentId = req.headers["x-agent-id"] || "unknown";
const start = Date.now();
res.on("finish", () => {
const log = {
timestamp: new Date().toISOString(),
agent_id: agentId,
method: req.method,
path: req.path,
status: res.statusCode,
duration_ms: Date.now() - start,
ip: req.ip,
user_agent: req.headers["user-agent"],
};
console.log(JSON.stringify(log));
});
next();
});
Capturez l'identité de l'agent, le point de terminaison, la méthode HTTP, le code d'état et la durée de chaque demande. Envoi structuré logs sur votre plateforme d’observabilité. Définir des alertes en cas d'anomalies : pics soudains du volume de demandes, demandes de des points de terminaison en dehors de la portée de l'agent ou des taux d'erreur élevés.
Suivez ce que l'agent envoie, et non ce qu'il dit envoyer. Enregistrez le hachage de la charge utile de la demande
(en utilisant /v1/hash) à côté des métadonnées. Cela vous donne une preuve d'altération sans
stocker des charges utiles sensibles dans votre système de journalisation.
Erreur 5 : traiter l'authentification de l'agent de la même manière que l'authentification humaine
Seuls 18 % des responsables de la sécurité sont convaincus que leurs systèmes IAM peuvent gérer les identités des agents. L'autre boulon à 82 % l'accès des agents aux flux d'authentification humaine qui n'ont pas été conçus pour les appelants autonomes.
L'authentification humaine suppose qu'une personne lit un écran de consentement OAuth, saisit un mot de passe et répond à une invite MFA. Les agents ne font rien de tout ça. Ils ont besoin d'un modèle d'authentification différent avec trois propriétés.
1. Jetons étendus avec des autorisations explicites
Chaque jeton d'agent déclare les points de terminaison qu'il peut appeler et les actions qu'il peut effectuer. L'API applique ces portées sur chaque demande. Aucune portée, aucun accès.
2. Limites de taux par identité
Un utilisateur humain envoie quelques requêtes par minute. Un agent en envoie des centaines ou des milliers. Limites de tarifs par agent L'identité empêche un agent d'affamer les autres et limite le rayon d'explosion si un agent devient voyou.
3. Demander l'attribution à chaque couche
Chaque requête transporte l'identité de l'agent du proxy Edge via la couche application jusqu'à la base de données. journal des requêtes. Lorsque quelque chose ne va pas, vous tracez le chemin complet depuis l’agent jusqu’à l’action.
Auditer un jeton d'agent avec le SDK Botoi
Combinez les points de terminaison JWT et de mot de passe en une seule fonction d'audit. Décoder le token, vérifier son expiration, vérifiez la signature et signalez les portées trop larges.
import Botoi from "@botoi/sdk";
const botoi = new Botoi({ apiKey: process.env.BOTOI_API_KEY });
async function auditAgentToken(token: string, secret: string) {
// Step 1: Decode to inspect claims
const decoded = await botoi.jwt.decode({ token });
const claims = decoded.data.payload;
console.log("Agent:", claims.sub);
console.log("Scopes:", claims.scopes);
// Step 2: Check expiration
const now = Math.floor(Date.now() / 1000);
const hoursLeft = (claims.exp - now) / 3600;
if (hoursLeft < 0) {
console.error("Token expired", Math.abs(hoursLeft).toFixed(1), "hours ago");
return { valid: false, reason: "expired" };
}
if (hoursLeft > 24) {
console.warn("Token lives longer than 24 hours; rotate sooner");
}
// Step 3: Verify signature
const verified = await botoi.jwt.verify({ token, secret, algorithms: ["HS256"] });
if (!verified.data.valid) {
console.error("Signature verification failed");
return { valid: false, reason: "invalid_signature" };
}
// Step 4: Check scope breadth
const dangerousScopes = claims.scopes.filter(
(s: string) => s === "*" || s === "admin" || s.endsWith(":*")
);
if (dangerousScopes.length > 0) {
console.warn("Overly broad scopes:", dangerousScopes);
}
return { valid: true, agent: claims.sub, scopes: claims.scopes, hoursLeft };
}
const result = await auditAgentToken(process.env.AGENT_TOKEN!, process.env.SIGNING_SECRET!);
console.log(result);
Exécutez cette vérification comme étape préalable au déploiement. Si le jeton est expiré, a un TTL supérieur à 24 heures, échoue à la signature vérification, ou comporte des étendues génériques, bloque le déploiement.
Une liste de contrôle pour l'authentification API de l'agent IA
| Vérifier | Que vérifier | Botoi endpoint |
|---|---|---|
| Identité unique par agent | Deux agents ne partagent pas une clé ou un jeton sub réclamer |
/v1/jwt/decode |
| Portées minimales | Les portées des jetons correspondent à l'objectif de l'agent ; pas de caractères génériques | /v1/jwt/decode |
| Expiration du jeton | TTL sous 24 heures ; mécanisme de rafraîchissement en place | /v1/jwt/decode |
| Demande de signature | Correspondances de charge utile HMAC côté serveur | /v1/hash/hmac |
| Rotation secrète | Les secrets tournent lors du déploiement ou selon un calendrier | /v1/password/generate |
| Journalisation des demandes | Chaque demande d'agent est enregistrée avec le hachage d'identité et de charge utile | /v1/hash |
Les données de l’enquête sont claires : les équipes déploient des agents IA plus rapidement qu’elles ne les sécurisent. 80,9 % ont des agents en activité, mais moins d’un agent sur cinq donne à ces agents leur propre identité. Chaque erreur sur cette liste, clés partagées, portées larges, informations d'identification permanentes, trafic silencieux, authentification en forme humaine, est une porte dérobée attendant le prochain adjoint confus incident.
Choisissez une erreur dans cette liste. Corrigez-le cette semaine. Passez ensuite au suivant.
FAQ
- Les agents IA doivent-ils utiliser les mêmes clés API que les utilisateurs humains ?
- Non. Les agents IA ont besoin d’informations d’identification dédiées avec des autorisations étendues, des limites de débit par identité et une expiration automatique. Une enquête réalisée en 2026 auprès de plus de 900 praticiens a révélé que seulement 21,9 % des équipes traitent les agents comme des entités indépendantes portant une identité, et que 44 % partagent toujours des clés API statiques entre les agents.
- Comment effectuer une rotation des clés API pour les agents IA sans temps d'arrêt ?
- Générez un nouvel identifiant, déployez-le sur l'agent, vérifiez qu'il fonctionne, puis révoquez l'ancienne clé. Utilisez des jetons de courte durée (1 à 24 heures) avec actualisation automatique afin que la rotation se fasse sans étapes manuelles. Le point de terminaison Botoi /v1/password/generate crée des secrets à haute entropie et /v1/jwt/decode inspecte le nouveau jeton avant de procéder au basculement.
- Qu'est-ce que le Top 10 OWASP pour les applications agentiques ?
- Publié en 2026, le Top 10 OWASP pour les applications agentiques répertorie les risques de sécurité les plus courants lorsque les agents IA interagissent avec les API et les outils. L'utilisation abusive d'outils et l'escalade des privilèges arrivent en tête de liste avec 520 incidents signalés. D'autres risques incluent un contrôle d'accès insuffisant, des pistes d'audit manquantes et des attaques confuses des adjoints.
- Comment surveiller le trafic API de machine à machine provenant des agents IA ?
- Enregistrez chaque demande avec l'identité de l'agent, l'horodatage, le point de terminaison et le hachage de la charge utile. Utilisez des journaux JSON structurés et envoyez-les à un système centralisé (Datadog, Grafana ou CloudWatch). Une étude de 2026 a révélé que 48,9 % des organisations ne peuvent pas du tout surveiller le trafic des agents IA, les laissant aveugles aux agents compromis ou au comportement inapproprié.
- Qu’est-ce qu’une attaque adjointe confuse dans le contexte des agents IA ?
- Une attaque adjointe confuse se produit lorsqu'un agent IA utilise ses informations d'identification légitimes pour effectuer des actions non prévues par son opérateur. L'agent réussit tous les contrôles d'identité car il détient des jetons valides, mais il agit sur les instructions provenant d'une source non fiable. Meta a documenté ce modèle dans un incident d'agent malveillant au cours duquel l'agent a accédé à des ressources au-delà de sa portée prévue.
Commencez a construire avec botoi
150+ endpoints API pour la recherche, le traitement de texte, la generation d'images et les utilitaires pour developpeurs. Offre gratuite, sans carte bancaire.