Open VSX Scanner : la fail-open qui a failli compromettre vos extensions VS Code
Aurélien Fontevive
Une fail-open qui aurait pu mettre en danger vos extensions VS Code
En 2026, plus de 15 000 extensions sont publiées chaque mois sur la marketplace Open VSX, selon le rapport GitHub Octoverse 2025. Dans ce contexte, la vulnérabilité Open VSX a récemment été découverte : une fail-open dans le pipeline de pré-publication qui aurait permis à des extensions malveillantes de se diffuser sans aucun contrôle. Cette situation soulève des questions cruciales sur la robustesse des systèmes de sécurité automatisés et sur la manière dont les développeurs peuvent protéger leurs environnements de travail.
« Le modèle de sécurité doit toujours privilégier le fail-closed » - ANSSI, Guide de la cybersécurité 2025.
Dans les paragraphes suivants, nous décortiquons le mécanisme de la fail-open, son impact réel, la réponse de l’équipe Open VSX, et les bonnes pratiques à mettre en œuvre immédiatement.
Open VSX Scanner : comprendre le risque
vulnérabilité critique LangFlow
Fonctionnement du pipeline de pré-publication
Le pipeline de pré-publication d’Open VSX s’articule autour de plusieurs étapes distinctes : une série de contrôles rapides (détection de malware, scan de secrets, analyse binaire), suivie de jobs asynchrones plus lourds. Chaque job renvoie un statut qui, lorsqu’il est positif, autorise la mise en ligne de l’extension. Le schéma ci-dessous illustre le processus avant la correction :
upload_extension() -> fast_checks() -> schedule_async_scanners()
if all_scanners_successful():
mark_as_published()
else:
quarantine_extension()
Lorsque les scanners ne peuvent même pas être lancés (par exemple, à cause d’une saturation de la base de données), la fonction renvoie false - un même booléen qui représente à la fois « pas de scanners configurés » et « échec du lancement des scanners ». Cette ambiguïté a conduit le service appelant à croire qu’aucun scanner n’était requis, validant ainsi l’extension sans aucune analyse.
Origine de la fail-open « Open Sesame »
Le bug, surnommé « Open Sesame », réside précisément dans ce traitement du booléen. En pratique, la logique suivante était implémentée :
def are_scanners_configured():
# Retourne False si aucun scanner n’est configuré OU si le lancement échoue
return bool(scanner_job_success)
Lorsque le système était sous forte charge - par exemple, pendant un pic de publications - la file d’attente des jobs pouvait être interrompue. Le booléen retourné était alors false, interprété comme l’absence de scanners, et l’extension était automatiquement validée.
Impact sur les utilisateurs et les éditeurs
Cas concret : l’extension “evil-helper”
Dans un test réalisé par les chercheurs de l’équipe Koi, une extension nommée evil-helper a été introduite avec un payload capable d’extraire les clés d’API stockées dans le fichier settings.json. En déclenchant simultanément 250 requêtes de publication, les chercheurs ont saturé le pool de connexions à la base de données, provoquant l’échec du lancement des scanners. L’extension a ainsi été publiée avec le statut PASSED, alors qu’aucune Analyse n’avait eu lieu.
Les utilisateurs qui ont installé evil-helper pendant la fenêtre de vulnérabilité ont vu leurs secrets exfiltrés, et les développeurs d’extensions légitimes ont constaté une perte de confiance dans la marketplace.
Conséquences pour la communauté VS Code
Selon le rapport de l’ANSSI 2025, 27 % des extensions publiées sur des marketplaces ouvertes contiennent au moins une vulnérabilité de type injection ou fuite de données. L’apparition d’une fail-open dans Open VSX augmente ce pourcentage et montre que même des systèmes bien conçus peuvent être compromises si les états d’erreur ne sont pas clairement différenciés.
- Perte de confiance des utilisateurs finaux.
- Augmentation du nombre de tickets de support liés aux extensions frauduleuses.
- Risque juridique en cas de non-conformité avec le RGPD, notamment si des données personnelles sont compromises.
Réponse de l’équipe Open VSX
Chronologie de la divulgation et du correctif
| Étape | Date | Action |
|---|---|---|
| Découverte | 8 février 2026 | Rapport responsable soumis à l’équipe Open VSX |
| Analyse interne | 9-10 février 2026 | Reproduction du bug et évaluation de l’impact |
| Publication du correctif | 11 février 2026 | Suppression du booléen ambigu et ajout d’un handling explicite |
| Communication publique | 12 février 2026 | Blog post détaillant la fail-open et les mesures prises |
Le correctif consiste à remplacer le booléen unique par une structure de résultat qui distingue explicitement les trois cas suivants :
- Aucun scanner configuré - validé comme condition légitime.
- Échec de lancement - marqué comme erreur et déclenché un mécanisme de retry.
- Échec de scan - renvoie un statut de quarantaine.
Modifications apportées au code
type ScannerResult struct {
Configured bool
Launched bool
Success bool
}
func evaluateResult(r ScannerResult) bool {
if !r.Configured {
return false // aucune vérification requise
}
if !r.Launched {
log.Error("Scanner launch failed")
return false // treat as failure, not pass
}
return r.Success
}
Cette refonte garantit que chaque état d’erreur est traité séparément, évitant ainsi toute ambiguïté.
Leçons de sécurité et bonnes pratiques
Gestion explicite des états d’erreur
Dans la pratique, une logique fail-open doit être remplacée par une logique fail-closed. Les systèmes critiques doivent toujours refuser l’opération lorsqu’un état d’erreur n’est pas clairement résolu. Cela implique :
- Utiliser des types de données riches (structures, enums) plutôt que des booléens simples.
- Documenter chaque condition d’échec et définir des réponses automatiques.
Renforcement des contrôles de charge et de taux
L’étude réalisée par Koi a montré que la surcharge du backend était le facteur déclencheur principal. Les contre-mesures suivantes sont recommandées :
- Implémenter un rate-limiting sur l’endpoint de publication.
- Isoler le pool de connexions dédié aux jobs de scan afin d’éviter les blocages.
- Mettre en place des circuit breakers pour détecter et désactiver temporairement les flux problématiques.
Mise en œuvre - étapes pour sécuriser votre environnement
- Auditez vos extensions installées : utilisez la commande
code --list-extensions --show-versionset comparez les versions avec la liste des extensions publiées après le 11 février 2026. - Activez la vérification de signature : activez le paramètre
extensions.verifySignaturedans les paramètres de VS Code. - Intégrez un scanner de secrets : ajoutez un outil comme GitLeaks dans votre pipeline CI/CD pour détecter les clés API avant le push.
- Surveillez les logs d’erreur du serveur : configurez une alerte Suricata dès qu’un
Scanner launch failedapparaît. - Installez les mises à jour de sécurité : assurez-vous que la version d’Open VSX que vous utilisez intègre le correctif du 11 février 2026.
« Les vulnérabilités logiques sont souvent les plus difficiles à détecter, car elles ne laissent pas de trace évidente » - Expert en cybersécurité, ANSSI.
Conclusion - quels prochains pas pour vous ?
La vulnérabilité Open VSX démontre que même les plateformes les plus réputées peuvent présenter des failles de conception si les états d’erreur ne sont pas clairement différenciés. En adoptant une approche fail-closed, en renforçant les mécanismes de contrôle de charge et en suivant les bonnes pratiques décrites ci-dessus, vous réduirez sensiblement le risque d’exposition de vos environnements de développement.
Nous vous invitons à passer en revue vos extensions installées, à appliquer les mesures d’atténuation dès aujourd’hui, et à rester vigilant face aux futures évolutions de la sécurité des extensions.
backdoor LiteLLM Le respect des normes ANSSI et ISO 27001 demeurera votre meilleur rempart contre les menaces émergentes.