CVE-2026-82331 : résolution impropre de liens symboliques dans le plugin tar d'Apache BuildStream et écrasement de fichiers hôtes
SCORE DE MENACE HERMES & COMPROMISSION DU PÉRIMÈTRE
Cible :Pipelines de build CI/CD, piles d'intégration d'OS & chaîne logistique logicielle Le standard CVSS v3.1 attribue à la CVE-2026-82331 un score de 9.8 Critique (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H). Le Hermes Threat Score lui assigne la note de 91 (CRITIQUE). BuildStream orchestre l'intégration continue et la génération d'images système (notamment GNOME OS et plusieurs distributions automobiles). Dans les fermes de compilation automatisées, le rapatriement d'archives sources tierces est une opération courante ; l'évasion par lien symbolique conduit directement à la compromission des nœuds de build et à l'injection de portes dérobées dans la chaîne de compilation.
SÉVÉRITÉ AGENTIQUE HASS & IMPACT SUR L'ISOLATION DES AGENTS
Cible :Récupérateur de sources et bac à sable d'extraction du plugin tar BuildStream Les agents autonomes d'ingénierie logicielle exécutant des commandes de compilation dans des conteneurs de développement interagissent avec des manifestes d'éléments de build. Une évasion par lien symbolique permet à une archive piégée de franchir les limites du répertoire temporaire pour compromettre l'environnement externe de l'agent ou altérer ses fichiers de configuration persistants.
CVE-2026-82331: Apache BuildStream Tar Plugin Link Resolution and Host File OverwriteVULNÉRABILITÉ
Software platform affected by security vulnerabilities and agentic attack patterns.
🔍 Pourquoi cette relation ? (Preuves & Provenance)
“Confirmed security vulnerability in Apache BuildStream documented in Hermes dossier.”
- [vulnerability_report]
- [government_confirmation]CISA verified active exploitation in the wild and mandated federal remediation deadline in KEV entry. — Source : Cybersecurity & Infrastructure Security Agency (CISA): CISA Adds CVE-2026-59822 to Known Exploited Vulnerabilities Catalog (Fiabilité : VERY_HIGH)
Cascading multi-stage attack chaining context injection, autonomous loop planning, and un-sandboxed execution sinks to achieve persistent root shell compromise on host machines.
🔍 Pourquoi cette relation ? (Preuves & Provenance)
“CVE-2026-82331 weaponizes the agentic attack pattern formalized under AAP-007.”
- [technical_analysis]Pillar Security demonstrated that executing export BASH_ENV in Auto-Run causes bash to source hostile payloads upon subsequent commands. — Source : Pillar Security Research: Bypassing Cursor Auto-Run: When Shell Built-ins Lead to Host RCE (Fiabilité : HIGH)
Adversarial subversion of structured tool execution arguments (SQL, Shell, Filepath) passed from an LLM agent to host OS tools or MCP endpoints.
🔍 Pourquoi cette relation ? (Preuves & Provenance)
“CVE-2026-82331 weaponizes the agentic attack pattern formalized under AAP-003.”
- [technical_analysis]Pillar Security demonstrated that executing export BASH_ENV in Auto-Run causes bash to source hostile payloads upon subsequent commands. — Source : Pillar Security Research: Bypassing Cursor Auto-Run: When Shell Built-ins Lead to Host RCE (Fiabilité : HIGH)
1. Contexte technique et matrice des versions affectées
Section intitulée « 1. Contexte technique et matrice des versions affectées »Le plugin source tar constitue le mécanisme de référence dans BuildStream pour importer et préparer les archives compressées dans les bacs à sable d’étape (Element.stage()).
| Paramètre | Spécification technique | Impact opérationnel |
|---|---|---|
| Identifiant CVE | CVE-2026-82331 | Avis de sécurité Apache / Registre NIST NVD |
| Classe de vulnérabilité | Suivi de lien symbolique (CWE-59) / Traversée de répertoire (CWE-22) | Écriture arbitraire hors du bac à sable temporaire de compilation |
| Composant vulnérable | plugins/sources/tar.py (gestionnaire d’extraction stage()) | Routine d’extraction séquentielle d’archives sans filtrage strict |
| Vecteur d’exploitation | Archive tar piégée contenant des liens symboliques pointant hors du répertoire cible | Écrasement de configurations hôtes (~/.ssh, ~/.bashrc, /etc) |
| Privilèges requis | Aucun (PR:N) | Déclenché automatiquement lors de la récupération ou du build |
| Privilèges obtenus | Utilisateur exécutant BuildStream (uid du runner CI / développeur) | Exécution de commandes persistantes sur les runners de compilation |
| Versions affectées | Apache BuildStream < 2.8.1 (sous Python < 3.12) | Fermes de build Linux, pipelines d’intégration continue |
| Correctifs publiés | Apache BuildStream 2.8.1 | Contrôle canonique des chemins et filtre data de Python 3.12 |
2. Anatomie de la vulnérabilité et analyse de la cause racine
Section intitulée « 2. Anatomie de la vulnérabilité et analyse de la cause racine »Déréférencement non contrôlé de liens symboliques dans tarfile
Section intitulée « Déréférencement non contrôlé de liens symboliques dans tarfile »Lors de l’étape de staging d’un élément source tar, BuildStream s’appuyait traditionnellement sur le module standard tarfile de Python. Avant la version 3.12 de Python (qui introduit la directive de filtrage PEP 706 data), la méthode tarfile.extractall() suivait nativement les liens symboliques préalablement extraits dans la même archive, sans vérifier si les écritures ultérieures demeuraient dans les limites du répertoire racine :
# Logique d'extraction vulnérable dans le plugin tar de BuildStream (avant 2.8.1)def stage(self, directory: str) -> None: # directory représente le répertoire temporaire isolé (ex. /tmp/buildstream-staging-xyz) archive_path = self._get_mirror_file()
with tarfile.open(archive_path, mode="r:*") as tar: # FAILLE : Sous Python < 3.12 sans contrôle explicite de chemin, tar.extractall() # décompresse les éléments sans valider le chemin canonique de destination for member in tar.getmembers(): # Si le membre est un lien symbolique pointant vers "/", ou "../../../home/user", # il est créé sur disque dans directory/symlink_name. # Lorsqu'un élément suivant nommé "symlink_name/fichier_piege" est extrait, # tarfile écrit à travers le lien directement sur le système hôte ! tar.extract(member, path=directory)Mécanisme de l’attaque : l’archive en deux phases
Section intitulée « Mécanisme de l’attaque : l’archive en deux phases »L’adversaire structure une archive contenant deux entrées coordonnées :
- Phase 1 (Le piège symbolique) : Un lien symbolique nommé
escape_linkpointant vers/home/builder/.ssh. - Phase 2 (La charge utile) : Un fichier régulier nommé
escape_link/authorized_keyscontenant la clé publique SSH de l’attaquant.
À l’extraction, escape_link est d’abord créé dans le dossier de staging. Lorsque l’extracteur traite escape_link/authorized_keys, l’appel système sous-jacent open() résout le lien symbolique et écrit directement la clé publique dans /home/builder/.ssh/authorized_keys sur la machine hôte du runner.
3. Vecteurs d’attaque et cinématique forensique d’exécution
Section intitulée « 3. Vecteurs d’attaque et cinématique forensique d’exécution »sequenceDiagram autonumber actor Attacker as Attaquant / Contributeur amont participant Git as Dépôt Git amont / Miroir participant CI as Runner CI/CD / BuildStream participant Plugin as Plugin tar BuildStream participant HostFS as Système de fichiers hôte (~/builder)
Attacker->>Git: Soumission d'une PR contenant une archive tar piégée Git->>CI: Déclenchement du build automatisé via le manifeste .bst CI->>Plugin: Appel de stage() pour extraire l'archive source Plugin->>HostFS: Extraction entrée 1 : lien symbolique "link" -> "~/.ssh" Plugin->>HostFS: Extraction entrée 2 : fichier "link/authorized_keys" (clé publique) Note over HostFS: Lien symbolique déréférencé ! Clés autorisées écrasées sur l'hôte CI-->>Attacker: Le build se termine ou échoue Attacker->>CI: Connexion SSH avec les identifiants injectés (accès complet) Attacker->>CI: Empoisonnement de la chaîne de compilation et des binaires produits- Conception de l’archive piégée : L’attaquant génère une archive contenant un lien symbolique ciblant des fichiers de configuration sensibles (
~/.ssh,~/.bashrcou/etc/cron.d) suivi d’une charge utile écrite à travers ce lien. - Soumission de la recette : L’attaquant soumet un commit ou une pull request modifiant la directive
urld’une recette.bstpour pointer vers l’archive empoisonnée. - Exécution du build : Un runner automatisé ou un développeur lance
bst build cible.bst. BuildStream rapatrie l’archive et exécutestage(). - Traversée et écriture sur l’hôte : Le plugin vulnérable extrait le lien symbolique, puis écrit la charge utile à travers le lien sur le système hôte.
- Persistance et compromission de la chaîne de distribution : L’attaquant utilise la clé SSH injectée pour s’implanter sur le nœud de build et altérer les artefacts logiciels distribués en production.
4. Investigation forensique et réponse à incident
Section intitulée « 4. Investigation forensique et réponse à incident »Les équipes de réponse à incident examinant des runners BuildStream doivent auditer les éléments suivants :
Commandes d’investigation sur les nœuds de compilation
Section intitulée « Commandes d’investigation sur les nœuds de compilation »# 1. Vérifier l'intégrité et la date de modification des clés SSHstat ~/.ssh/authorized_keystail -n 20 ~/.ssh/authorized_keys
# 2. Rechercher les liens symboliques suspects dans les caches BuildStreamfind ~/.cache/buildstream/ -type l -ls
# 3. Auditer les scripts de démarrage shell et les tâches planifiées cronstat ~/.bashrc ~/.profile /etc/cron* -c "%y %n" | sort -r | head -n 20
# 4. Examiner les sockets réseau et processus en cours d'exécution sur le runnerss -tulpnpstree -a $(pgrep -f "bst")
# 5. Identifier d'éventuels binaires récemment altérés dans les répertoires d'outilsfind /usr/local/bin /opt -mtime -3 -type f -ls5. Chasse aux menaces et ingénierie de détection
Section intitulée « 5. Chasse aux menaces et ingénierie de détection »title: Modification de fichier sensible par traversée de lien symboliqueid: 82331c02-buildstream-tar-symlink-frstatus: experimentaldescription: Détecte les écritures non autorisées dans les clés SSH ou la configuration système issues de processus de compilation.author: Hermes Codex Detection Engineeringdate: 2026-09-24logsource: category: file_event product: linuxdetection: selection_process: Image|endswith: - '/bst' - '/python3' - '/python' selection_target: TargetFilename|contains: - '/.ssh/' - '/.bashrc' - '/etc/cron' - '/etc/sudoers' condition: selection_process and selection_targetfalsepositives: - Scripts d'initialisation légitimes configurant les identités des runners.level: criticaltags: - attack.initial_access - attack.t1195.001 - cve.2026-82331# Surveillance des écritures dans les fichiers d'authentification et de persistance-w /root/.ssh/authorized_keys -p wa -k ssh_key_tamper-w /home/*/.ssh/authorized_keys -p wa -k ssh_key_tamper-w /etc/cron.d/ -p wa -k cron_tamper6. Plan de remédiation et durcissement défensif
Section intitulée « 6. Plan de remédiation et durcissement défensif »Mise à jour d’Apache BuildStream
Section intitulée « Mise à jour d’Apache BuildStream »Mettre à jour l’ensemble des postes de travail et runners CI vers Apache BuildStream 2.8.1 ou une version ultérieure :
pip install --upgrade buildstream>=2.8.1Durcissement de l’environnement d’exécution
Section intitulée « Durcissement de l’environnement d’exécution »- Migration vers Python 3.12+ : S’assurer que le runtime hébergeant BuildStream utilise Python 3.12 ou supérieur, activant automatiquement la protection PEP 706
tarfile.data_filter. - Runners CI éphémères et sans privilèges : Exécuter chaque tâche de build au sein de conteneurs non privilégiés (
runAsNonRoot: true) sans volume monté vers les dossiers d’identité hôte (~/.ssh, socket docker). - Immuabilité des artefacts sources : Exiger le verrouillage cryptographique par somme de contrôle SHA-256 de chaque archive déclarée dans les recettes
.bst.
7. Recherches corrélées et références internes
Section intitulée « 7. Recherches corrélées et références internes »- CVE-2026-93616 : traversée de répertoire dans le service web Check Point CPM : Faille de traversée et d’écrasement de fichiers dans les composants d’administration.
- CVE-2026-77521 : évasion de bac à sable dans la plateforme IA MaxKB : Injection de commandes dans les environnements d’exécution automatisés.
- CVE-2026-85102 : débordement de tampon dans Check Point Quantum VPN : Analyse d’attaques sur le périmètre défensif d’entreprise.
- AAP-007 : RCE autonome en cascade : Modèles d’évasion et de compromission des chaînes logicielles.
- AAP-003 : Altération des paramètres d’outils : Manipulation de chemins dans les intégrations d’outils automatisés.
- Moindre privilège et sécurité orientée capacités : Principes de durcissement des runners et bacs à sable d’agents.
- Analyse des processus et de la mémoire sous Linux : Guide d’investigation temps réel sur environnements Linux.
- Playbook de triage des alertes EDR : Procédure opérationnelle de réponse sur nœuds de build compromis.
Sources et références
Section intitulée « Sources et références »- Annonce de sécurité Apache Software Foundation : Avis CVE-2026-82331
- Base de données NIST NVD : Détail de la vulnérabilité CVE-2026-82331
- Base Rapid7 : Analyse de vulnérabilité Apache BuildStream Link Resolution