Threat Intelligence

CVE-2026-63077 : la chaîne de gadgets XStream qui offre un RCE non authentifié sur TeamCity On-Premises

Admin CyberAfrik 10 August 2026 18 lectures
CVE-2026-63077 : la chaîne de gadgets XStream qui offre un RCE non authentifié sur TeamCity On-Premises

Rapport CTI technique du 10 août 2026

Résumé exécutif

CVE-2026-63077 est une vulnérabilité de désérialisation non sécurisée (CWE-502) dans JetBrains TeamCity On-Premises, notée 9.8 sur l'échelle CVSS. Elle permet à un attaquant non authentifié, disposant d'un simple accès réseau HTTP ou HTTPS au serveur, d'exécuter des commandes système avec les privilèges du processus TeamCity. JetBrains a publié un correctif le 27 juillet 2026 sans mention d'exploitation active, mais CISA a ajouté la faille à son catalogue Known Exploited Vulnerabilities le 5 août, confirmant une exploitation en conditions réelles et fixant aux agences fédérales américaines un délai de remédiation au 8 août sous BOD 26-04.

Le vecteur passe par le protocole de polling des agents de build, une interface non authentifiée par conception. Un attaquant y envoie un document XML forgé qui, via un défaut dans la configuration de la bibliothèque XStream, reconstruit un graphe d'objets Java capable d'écrire un fichier JSP malveillant directement dans la racine web du serveur. Rapid7 a publié le 7 août une analyse technique complète accompagnée d'un script de preuve de concept, rendant l'exploitation triviale à reproduire pour quiconque expose un serveur TeamCity non patché. Les organisations utilisant TeamCity comme orchestrateur CI/CD doivent traiter cette vulnérabilité comme prioritaire : un serveur de build compromis expose les secrets, les identifiants de dépôt de code et l'intégrité de la chaîne de livraison logicielle en aval.

Chronologie

DateÉvénement
27 juillet 2026JetBrains publie l'avis de sécurité pour CVE-2026-63077 et livre les correctifs 2025.11.7 et 2026.1.3
5 août 2026CISA ajoute CVE-2026-63077 au catalogue KEV, confirmant l'exploitation active dans la nature
6 août 2026The Hacker News relaie l'alerte CISA ; échéance BOD 26-04 fixée au 8 août pour les agences fédérales
7 août 2026Rapid7 publie une analyse technique détaillée du patch diff et un PoC public sur GitHub

Fiche vulnérabilité (format fiche CTI)

CVE-2026-63077 | CVSS 9.8 (Critique) | JetBrains TeamCity On-Premises, versions antérieures à 2025.11.7 / 2026.1.3

Désérialisation non sécurisée (CWE-502) dans jetbrains.buildServer.messages.XStreamHolder. La méthode setupSecurityIfNeeded() ajoute les classes autorisées par TeamCity à la liste de permissions XStream sans effacer au préalable les permissions par défaut posées par le constructeur de la bibliothèque, lesquelles autorisent déjà toute la hiérarchie de Map et de Throwable. Cette liste blanche partielle suffit à assembler une chaîne de gadgets fonctionnelle. Exploitation non authentifiée, sans interaction utilisateur, via une requête HTTP POST vers l'endpoint /app/agents/v1/commands/error après enregistrement d'un agent factice sur /app/agents/v1/register. PoC disponible : oui, publié par Rapid7 (Stephen Fewer) sur github.com/sfewer-r7/CVE-2026-63077. Patch : mise à jour vers TeamCity 2025.11.7 ou 2026.1.3, qui ajoute NoTypePermission.NONE avant le peuplement de la liste blanche pour la rendre réellement exclusive. Aucun contournement documenté hors mise à jour ou isolement réseau strict du endpoint de polling des agents.

Diagramme de la chaîne d'attaque

Légende : séquence reconstruite à partir de l'analyse technique de Rapid7 (7 août 2026) et de l'avis JetBrains du 27 juillet 2026.

Analyse technique

Étape 1 : Enregistrement d'un agent non authentifié

L'attaquant envoie une requête HTTP POST vers /app/agents/v1/register. Le serveur répond avec un identifiant de session dans l'en-tête TeamCity-AgentSessionId. Cette étape ne nécessite aucun identifiant : le protocole de polling des agents est conçu pour fonctionner sans authentification préalable, puisque c'est précisément par ce canal que les agents de build s'enregistrent avant d'avoir un compte applicatif.

Étape 2 : Construction du graphe d'objets malveillant

Avec la session obtenue, l'attaquant envoie un second POST vers /app/agents/v1/commands/error, contenant un document XML que le serveur désérialise via Error.fromXml(). Le document encode une LinkedHashMap à trois entrées. La première construit un BasicDataSource Apache Commons DBCP configuré avec le pilote HSQLDB embarqué de TeamCity, en passant par la classe interne HSQLMetadataStorage$SchemaMismatchException qui hérite de RuntimeException et se glisse donc sous l'autorisation par défaut accordée à la hiérarchie Throwable. La deuxième entrée expose ce BasicDataSource via un HashAdapter FreeMarker, autorisé sous la hiérarchie Map. La troisième force, via un TiedMapEntry de Commons Collections, la résolution de la propriété connection.

Étape 3 : Déclenchement du gadget chain

Lorsque XStream insère le TiedMapEntry reconstruit dans un HashSet, l'appel HashSet.add() invoque automatiquement hashCode(), qui appelle getValue(), qui résout la propriété connection sur l'objet FreeMarker. Cette résolution invoque par convention JavaBean la méthode BasicDataSource.getConnection(). Le mécanisme rappelle le gadget CommonsCollections6 de ysoserial, mais contourne le fait que TeamCity bloque explicitement ChainedTransformer et InvokerTransformer, les classes utilisées par ce gadget classique.

Étape 4 : Écriture du webshell via HSQLDB SCRIPT

getConnection() ouvre une base HSQLDB en mémoire et exécute les instructions SQL attaquant-contrôlées placées dans connectionInitSqls. La dernière instruction utilise la commande SCRIPT de HSQLDB pour sérialiser la base vers un chemin choisi par l'attaquant, à l'intérieur de webapps/ROOT/. Le contenu inséré dans la table est un scriptlet JSP, ce qui rend le script SQL généré également valide comme fichier JSP, un polyglotte. Le fichier porte l'extension .jspws.

Étape 5 : Exécution distante et nettoyage

TeamCity mappe l'extension .jspws directement vers le moteur Jasper, contrairement aux fichiers .jsp classiques qui transitent par un contrôleur exigeant une authentification. Une simple requête HTTP vers ce fichier compile et exécute le scriptlet, qui peut appeler Runtime.getRuntime().exec() pour lancer une commande arbitraire avec les privilèges du processus serveur. Le PoC Rapid7 supprime ensuite le fichier .jspws du disque après exécution, réduisant les traces disponibles pour une investigation a posteriori.

Indicateurs de compromission

TypeValeur
Signature de logcom.thoughtworks.xstream.converters.ConversionException dans teamcity-server.log
Signature de log (patch effectif)com.thoughtworks.xstream.security.ForbiddenClassException référençant HSQLMetadataStorage$SchemaMismatchException
Classe ciblée dans le payloadjetbrains.buildServer.serverSide.metadata.impl.metadata.HSQLMetadataStorage$SchemaMismatchException
Artefact fichierFichier .jspws à nom hexadécimal aléatoire dans webapps/ROOT/, généralement absent après coup
Requêtes réseauPOST non authentifiés successifs vers /app/agents/v1/register puis /app/agents/v1/commands/error
Fichier de log secondaireTraces org.hsqldb.HsqlException dans teamcity-javaLogging-*.log correspondant à l'écriture du fichier polyglotte

MITRE ATT&CK

TactiqueTechniqueIDJustification
Initial AccessExploit Public-Facing ApplicationT1190L'endpoint /app/agents/v1 est accessible sans authentification dès lors que le serveur est exposé sur le réseau
ExecutionCommand and Scripting InterpreterT1059Le scriptlet JSP écrit sur disque appelle Runtime.getRuntime().exec() pour exécuter une commande OS
PersistenceServer Software Component: Web ShellT1505.003Le fichier .jspws déposé dans webapps/ROOT/ fonctionne comme un webshell exploitable tant qu'il reste présent
Defense EvasionIndicator RemovalT1070.004Le PoC public supprime le fichier .jspws après exécution, comportement qu'un attaquant réel reproduirait
Credential AccessUnsecured CredentialsT1552L'avis JetBrains indique qu'une exploitation réussie peut exposer les identifiants et configurations stockés par TeamCity

Aucune cartographie ATT&CK officielle n'a été publiée par JetBrains, CISA ou Rapid7 dans les sources consultées : le tableau ci-dessus est une lecture technique construite à partir du déroulé d'exploitation documenté, pas une attribution vendeur.

Remédiation : checklist opérationnelle

  1. Mettre à jour immédiatement tout serveur TeamCity On-Premises vers la version 2025.11.7 ou 2026.1.3.
  2. Si la mise à jour ne peut pas être appliquée sous 24 heures, isoler le endpoint /app/agents/v1 derrière un contrôle réseau ou un WAF bloquant les requêtes POST non authentifiées vers commands/error.
  3. Rechercher dans teamcity-server.log et teamcity-javaLogging-*.log les occurrences de ConversionException et de la classe HSQLMetadataStorage$SchemaMismatchException sur les 30 derniers jours.
  4. Inspecter webapps/ROOT/ pour tout fichier .jspws inattendu et le mettre en quarantaine pour analyse forensique avant suppression.
  5. Exécuter le script PoC public de Rapid7 en environnement de test pour valider que la remédiation appliquée bloque effectivement la chaîne de gadgets.
  6. Faire tourner les identifiants et secrets exposés par TeamCity (jetons VCS, secrets de build) si le serveur était accessible depuis Internet avant l'application du correctif.
  7. Vérifier l'intégrité des artefacts de build récents et des configurations de projet pour détecter une éventuelle altération de la chaîne CI/CD.

Sources

Tags : CVE-2026-63077JetBrains TeamCityXStreamdeserializationCWE-502CI/CDRapid7KEV CISA
Partager cet article