
1. Contexte
NLWeb est un protocole open source développé par Microsoft pour interconnecter les agents IA avec des contenus web via un modèle de langage naturel.
Il permet à un site ou une application de se “brancher” directement dans l’écosystème des agents IA, rendant le contenu navigable et actionnable par un LLM comme un service web classique.
Sa promesse : offrir aux développeurs un “HTML de l’Agentic Web”.
Son talon d’Achille : une implémentation vulnérable à une attaque path traversal non authentifiée.
2. La vulnérabilité : anatomie de l’attaque
2.1 Principe du path traversal
Le path traversal (aussi appelé directory traversal) consiste à exploiter des séquences spéciales comme ../
dans un chemin de fichier pour sortir du répertoire prévu et accéder à d’autres fichiers du système.
Exemple basique :
https://target/nlweb/fetch?file=../../../../etc/passwd
Si le code serveur ne valide pas correctement la variable file
, l’attaquant peut lire le contenu de /etc/passwd
ou tout autre fichier accessible par le processus serveur.
2.2 Exploitation spécifique à NLWeb
Les chercheurs ont découvert que NLWeb utilisait la fonction Python :
os.path.normpath(user_supplied_path)
Le problème est que normpath()
normalise les chemins (/foo/bar/../baz
→ /foo/baz
), mais elle ne bloque pas l’utilisation de ../
si aucune vérification supplémentaire n’est faite.
Dans NLWeb, aucune validation stricte n’était appliquée après la normalisation pour s’assurer que le fichier restait dans le répertoire autorisé.
2.3 Impact concret
Avec un simple appel HTTP :
GET /nlweb/resource?path=../../.env HTTP/1.1
Host: vulnerable-server
Un attaquant pouvait extraire :
- Fichiers
.env
contenant clés API, tokens OAuth, secrets d’API LLM (OpenAI, Gemini, Claude…) - Scripts internes, configs de production, journaux de debug
- Sur systèmes Unix,
/etc/passwd
,/etc/hosts
, etc.
Ces clés exposées permettent l’usurpation d’agent IA, le vol de données via appels API, des attaques à coût élevé (faire exécuter des tâches coûteuses via le LLM compromis), voire une escalade vers RCE si les fichiers récupérés contiennent des scripts exécutés automatiquement.
3. Chaîne d’attaque possible
L’attaque type pourrait se dérouler ainsi :
- Reconnaissance : l’attaquant découvre qu’un site utilise NLWeb (signature HTTP, endpoints spécifiques).
- Exploitation du path traversal pour lire
.env
. - Extraction des clés API LLM et éventuelles URLs internes.
- Abus des API pour lancer des tâches en masse ou siphonner des données.
- Mouvement latéral si d’autres services partagent la même infrastructure et secrets.
4. Pourquoi c’est critique
Cette vulnérabilité est critique pour plusieurs raisons :
- Pas de CVE : pas de suivi formel, donc faible visibilité.
- Aucune authentification : exploitable par n’importe qui connaissant l’URL.
- Nouveau vecteur : cible des infrastructures IA récentes, peu protégées.
- Correction non propagée automatiquement : patch publié le 1er juillet, mais nécessitant une mise à jour manuelle du dépôt par chaque intégrateur.
5. Mitigation et durcissement
5.1 Patch Microsoft
Microsoft a mis à jour le dépôt GitHub de NLWeb, ajoutant une validation stricte du chemin après normalisation.
5.2 Mesures complémentaires recommandées
Une bonne pratique consiste à vérifier le chemin après normpath()
pour s’assurer qu’il reste dans le dossier autorisé :
if not file_path.startswith(allowed_base_dir):
raise PermissionError("Accès non autorisé")
Il est également recommandé de supprimer les fichiers sensibles du répertoire web, de procéder à une rotation immédiate des clés API exposées, de segmenter le réseau pour isoler les services IA et de surveiller les logs pour toute requête contenant ../
.
6. Conclusion
Cette faille illustre que même dans des projets IA de pointe, les erreurs de sécurité web classiques restent un danger majeur.
Ici, un simple ../
a suffi à menacer l’intégrité d’agents intelligents entiers.
Avec l’essor de l’Agentic Web, chaque module interfaçant un LLM devra être audité avec le même niveau de rigueur qu’un serveur d’applications critique.