L'agent aux commandes : détecter une post-exploitation pilotée par LLM
Le 10 mai 2026, Sysdig a capté sa première intrusion où un agent LLM pilotait la post-exploitation en temps réel — de CVE-2026-39987 sur marimo à un dump PostgreSQL complet en moins d'une heure. L'indice médico-légal est la forme des commandes.
De quoi s’agit-il ?
Le 10 mai 2026, la Sysdig Threat Research Team a enregistré ce qu’elle décrit comme sa première intrusion captée où un agent à base de grand modèle de langage pilotait la phase de post-exploitation en temps réel, plutôt que d’exécuter un playbook préétabli. La chaîne complète — d’un notebook marimo compromis à un dump PostgreSQL interne complet — s’est déroulée de bout en bout en moins d’une heure, l’exfiltration de la base prenant elle-même moins de deux minutes. Sysdig a publié son analyse le 26 mai 2026 ; The Hacker News l’a relayée le 29 mai.
Le point d’entrée était CVE-2026-39987, une exécution de code à distance pré-authentification critique dans marimo (toutes versions ≤ 0.20.4), corrigée en 0.23.0 et désormais inscrite au catalogue KEV de la CISA. La CVE n’est pas le sujet ici — c’est la porte connue. Ce qui est nouveau, c’est le moteur de l’autre côté de la connexion.
Comment ça marche
L’intrusion a suivi un chemin classique en quatre pivots : RCE marimo → récolte d’identifiants cloud sur le disque → récupération d’une clé privée SSH depuis AWS Secrets Manager → sessions SSH contre un bastion interne pour dumper PostgreSQL. Aucune primitive d’exploitation nouvelle n’a été introduite, et aucune n’est reproduite ici.
Ce qui distingue un agent d’un script automatisé, c’est la composition en temps réel. Sysdig a identifié quatre signatures médico-légales, dont aucune ne s’explique par un playbook préétabli :
Signature À quoi ça ressemble
-------------------------------- ----------------------------------------------
1. Dump improvisé sur la cible SELECT sur six tables d'un hôte opaque, dont une
table `credential` absente du schéma
2. Texte de planification Un commentaire chinois « 看还能做什么 » (« voir ce
qu'on peut faire d'autre ») laissé en plein milieu,
shell en anglais — sur six IP à cadence infraseconde
3. Commandes pour la machine Séparateurs `echo '---'`, HEREDOCs entre quotes,
captures bornées `| head -N`, `-P pager=off`, `2>/dev/null`
4. Sortie consommée en entrée PGPASSWORD extrait de `cat ~/.pgpass` ; un secret
ID choisi dans la réponse `ListSecrets` précédente
Un bloc de reconnaissance représentatif, secret récolté retiré :
PGPASSWORD=[REDACTED] psql -h internal-db -U app -d app -P pager=off << 'EOF'
SELECT * FROM api_key;
SELECT * FROM credential;
SELECT * FROM "user";
EOF
Les cinq indices de mise en forme — délimiteurs entre les sondes, un HEREDOC regroupant des requêtes sans rapport en un seul aller-retour, une sortie plafonnée pour tenir dans une fenêtre de contexte, le pager et stderr supprimés — apparaissent chacun individuellement dans des scripts humains bien conçus. Empilés dans une session improvisée de 113 secondes contre un hôte dont l’opérateur n’avait aucune preuve sur disque, ils désignent un modèle dans une boucle d’usage d’outils, lisant chaque résultat et décidant de l’appel suivant. L’egress était réparti sur onze IP de Cloudflare Workers en 22 secondes, déjouant toute corrélation par IP source.
Pourquoi c’est important
Sysdig décrit le basculement comme une question de coût, pas de capacité. Un opérateur scripté paie en temps d’ingénierie pour ajouter chaque nouvelle cible ; un opérateur agentique porte des a priori généraux sur une classe d’applications et compose la chaîne en direct, si bien que le coût devient le budget d’inférence. Une composition moins chère signifie plus d’intrusions de cette complexité, plus vite.
La propriété qui intéresse le défenseur, c’est l’adaptabilité. Un script qui tombe sur un schéma inattendu ou un fichier absent s’arrête ou bascule vers un repli codé en dur. Un agent lit la surprise et continue — ici, il a trouvé une table credential dans une base identifiée par son seul nom d’hôte. Comme le dit Sysdig : « L’attaquant n’a plus besoin de voir votre environnement pour y opérer. » Corollaire : la détection par signature d’une séquence de commandes connue se dégrade vite, puisque l’agent compose une séquence différente contre chaque cible.
Défenses
- Corrigez et inventoriez marimo. Passez en 0.23.0 ou supérieur immédiatement ; CVE-2026-39987 est un shell en une requête WebSocket sur toute instance non corrigée et exposée. Si la mise à jour est impossible, restreignez ou désactivez l’endpoint
/terminal/ws. - Faites tourner tout ce qui est accessible depuis un processus marimo. Traitez toute instance publiquement exposée comme compromise : faites tourner les clés AWS, clés d’API, mots de passe de base et clés SSH, et auditez les fichiers
.env, variables d’environnement et secrets sur disque. - Détectez sur l’intention, pas la séquence. Comme l’ordre des commandes de l’agent est propre à chaque cible, ancrez la détection sur les objectifs — lecture de fichiers d’identifiants,
secretsmanager:GetSecretValuesur des secrets de clé SSH,SELECT *massifs sur des tables credential/user — plutôt que sur des TTP ou des chaînes User-Agent spécifiques. - Corrélez sur l’identité, pas l’IP source. Les pools d’egress façon Workers cassent la détection par IP. La même clé SSH ou la même clé d’accès AWS qui se répartit sur de nombreux points de présence en quelques secondes est un signal plus fort qu’une adresse isolée.
- Sortez la télémétrie du périmètre. Le pivot s’est déroulé à l’intérieur du réseau. La détection runtime sur les couches bastion et base de données — pas seulement les actifs exposés — est ce qui rattrape le mouvement latéral.
- Gardez les secrets hors des hôtes applicatifs. Une machine marimo avec des identifiants cloud sur disque est un dispositif de pivot d’une heure. Utilisez des identifiants éphémères et restreints, et une identité au niveau de l’instance, plutôt que des clés à longue durée dans des fichiers
.env.
Statut
| Élément | Référence | Date | Notes |
|---|---|---|---|
| Intrusion observée | Sysdig TRT | 2026-05-10 | Première post-exploitation pilotée par agent LLM captée |
| Analyse Sysdig publiée | Sysdig | 2026-05-26 | Quatre signatures d’agent, IOC, recommandations |
| Couverture The Hacker News | THN | 2026-05-29 | Reprise indépendante |
| CVE-2026-39987 | GHSA-2679-6mx9-h9xc | corrigée en 0.23.0 | RCE pré-auth, marimo ≤ 0.20.4, sur la KEV de la CISA |
| Exploitation marimo antérieure | Sysdig | 2026-04 | De la divulgation à l’exploitation en moins de 10 heures |
Le titre n’est pas « l’IA a remplacé l’attaquant ». Comme l’a formulé Michael Clark, de Sysdig : « Nous regardons les attaquants remplacer leurs scripts par de l’IA. » L’enseignement défensif : cessez de détecter la séquence de commandes d’hier et commencez à détecter ce que l’attaquant cherche à accomplir.
Sources
- → https://www.sysdig.com/blog/ai-agent-at-the-wheel-how-an-attacker-used-llms-to-move-from-a-cve-to-an-internal-database-in-4-pivots
- → https://thehackernews.com/2026/05/attackers-use-llm-agent-for-post.html
- → https://github.com/marimo-team/marimo/security/advisories/GHSA-2679-6mx9-h9xc
- → https://www.sysdig.com/blog/marimo-oss-python-notebook-rce-from-disclosure-to-exploitation-in-under-10-hours
- → https://thehackernews.com/2026/04/marimo-rce-flaw-cve-2026-39987.html