système : OPÉRATIONNEL
← retour à tous les hacks
AGENTS CRITICAL NEW

OpenCode : une requête cross-site vers l'endpoint de mise à jour pouvait installer des paquets arbitraires

Datadog Security Labs (24 sept. 2026) détaille comment une page web malveillante pouvait atteindre un serveur OpenCode local et déclencher l'installation d'un paquet choisi par l'attaquant. Corrigé en 1.18.22.

2026-10-05 // 5 min affects: opencode

De quoi s’agit-il ?

Le 24 septembre 2026, Datadog Security Labs (découverte attribuée à Christophe Tafani-Dereeper) et les mainteneurs d’OpenCode ont publié les détails d’une vulnérabilité d’OpenCode, un agent de codage IA open source pouvant exposer un serveur HTTP local via opencode serve ou opencode web. L’avis GitHub (GHSA-632h-h47v-g4x4, gravité High, CVSS 7,5, sans CVE attribué) décrit une requête cross-site capable de pousser le serveur à installer des paquets choisis par l’attaquant, ce qui mène à l’exécution de code sur la machine du développeur.

La chronologie est un exemple de divulgation coordonnée : signalement le 11 août 2026, correctif publié en version 1.18.22 le 24 août 2026, divulgation publique après un embargo d’un mois, le 24 septembre.

Comment ça fonctionne

Deux faiblesses se combinent. D’abord, l’endpoint de mise à jour du serveur acceptait une URL arbitraire comme cible d’installation, au lieu de se limiter à un numéro de version. Ensuite, le serveur interprétait le corps des requêtes comme du JSON sans vérifier que l’en-tête Content-Type l’indiquait. Une page web peut faire envoyer par le navigateur un formulaire cross-site avec un type de contenu texte brut sans déclencher la protection habituelle par préflight, et ce corps peut malgré tout être du JSON valide.

Ainsi, une page visitée par un développeur dont le serveur OpenCode local est actif pouvait amener le navigateur à demander à ce serveur d’installer un paquet provenant d’un emplacement contrôlé par l’attaquant. Pour les installations gérées par npm, pnpm ou Bun, les scripts de cycle de vie du paquet s’exécutent pendant l’installation. Selon l’avis, l’attaque peut aussi fonctionner lorsque l’authentification HTTP Basic est activée si le navigateur a mis les identifiants en cache. Les installations via curl, Homebrew, Chocolatey ou Scoop ne sont pas exposées à ce vecteur d’installation précis.

Pourquoi c’est important

L’attaquant n’a besoin d’aucun point d’appui sur la machine : il suffit que la victime ouvre une page web pendant qu’un serveur d’agent local est à l’écoute. C’est la même classe de problème que celle observée plus tôt en 2026 avec les passerelles d’IA locales accessibles depuis le navigateur : « localhost » n’est pas une frontière de sécurité si n’importe quelle page web peut lui envoyer des requêtes. Les agents de codage s’exécutent en outre souvent avec les identifiants, les dépôts et l’accès shell du développeur ; le code exécuté par le propre mécanisme de mise à jour de l’agent en hérite.

Défenses

  • Mettez à jour vers OpenCode 1.18.22 ou plus récent. L’avis ne documente aucun contournement autre que la mise à jour.
  • Exigez une authentification par mot de passe pour opencode serve et opencode web, et ne les exposez pas au-delà de la machine locale sans nécessité.
  • Vérifiez le mode d’installation d’OpenCode (par exemple avec ls -l "$(command -v opencode)") ; le vecteur d’installation de paquets concerne les installations npm, pnpm et Bun.
  • Traitez les serveurs d’agent locaux comme des services exposés sur Internet : liste blanche d’origines, rejet des types de contenu non JSON sur les endpoints JSON, et aucun endpoint acceptant une cible d’installation arbitraire.
  • Arrêtez les serveurs d’agent locaux lorsqu’ils ne servent pas, et évitez de naviguer sur des sites non fiables dans la même session.

Statut

AspectDétail
Source principaleDatadog Security Labs, 24 septembre 2026
AvisGHSA-632h-h47v-g4x4 (High, CVSS 7,5, sans CVE attribué)
Signalé / corrigé / public11 août 2026 / 24 août 2026 (1.18.22) / 24 sept. 2026
Versions affectéesOpenCode à partir de 1.14.30 (l’avis indique jusqu’à 1.18.16 ; Datadog jusqu’à 1.18.21)
Corrigé1.18.22 et ultérieures

Sources