NVD has published CVE-2026-66788, a CVSS 9.9 (Critical) vulnerability affecting Lighthouse, the service discovery component of Submariner — the multi-cluster networking solution widely deployed with Red Hat OpenShift and OpenShift Advanced Cluster Management (ACM). The flaw fundamentally breaks the trust boundary between connected clusters: an attacker who has compromised any single spoke cluster can inject unauthorized EndpointSlices and ServiceImports into arbitrary namespaces on peer clusters, including kube-system and the openshift-* system namespaces.
A 9.9 score reflects the worst combination defenders face: the attack is network-exploitable, requires only the privileges an attacker already holds on one compromised spoke cluster, and the impact extends across the entire multi-cluster fabric — confidentiality, integrity, and availability of clusters the attacker never directly touched. If you run Submariner for east-west connectivity between OpenShift clusters, treat this as an emergency change, not a routine patch cycle.
Technical Analysis
Affected Components
- Product: Lighthouse, the service discovery plugin of Submariner (commonly deployed via the Submariner Operator on Red Hat OpenShift, and integrated with OpenShift ACM / RHACM hub-and-spoke topologies)
- CVE: CVE-2026-66788 — CVSS 3.x score 9.9 (Critical), attack vector: Network
- Architecture exposure: Any multi-cluster deployment where a broker facilitates service export/import between clusters. Hub-spoke and peered topologies are both affected.
How the Vulnerability Works
Submariner's architecture relies on a broker — a shared rendezvous point (often hosted on the hub cluster) through which participating clusters exchange service discovery metadata. Lighthouse agents on each cluster watch the broker for ServiceExport/ServiceImport objects and EndpointSlice information, then reconcile those into the local cluster's DNS and service discovery state.
The defect is a classic attacker-controlled metadata trust failure: the destination namespace into which Lighthouse injects resources is derived from a label or annotation on the broker object — metadata that a spoke cluster with broker write access can control. There is no server-side validation binding the destination namespace to the namespace the exporting service actually lives in, or to any allowlist.
The attack chain, from a defender's perspective:
- Initial foothold: Attacker compromises a spoke cluster (any means — stolen credentials, workload escape, exposed console). This is the only prerequisite.
- Broker object manipulation: Using the spoke's broker credentials, the attacker modifies labels/annotations on broker-resident objects to point the destination namespace at a target such as
kube-system,openshift-apiserver,openshift-ingress, or any namespace hosting privileged workloads on a peer cluster. - Resource injection: Lighthouse on the peer cluster faithfully reconciles the broker state, creating attacker-controlled
EndpointSlicesandServiceImportsin the victim namespace. - Impact: Rogue EndpointSlices redirect cluster traffic for targeted services to attacker-controlled endpoints. Pointed at system namespaces, this enables interception or impersonation of cluster-internal control-plane traffic — credential harvesting, API traffic manipulation, and ultimately unauthorized privilege escalation and full compromise of clusters the attacker had no direct access to.
This is a trust-transitive compromise: the security of every cluster in the fabric is now only as strong as the weakest spoke.
Exploitation Status
At time of publication, no public proof-of-concept exploit or confirmed in-the-wild exploitation has been reported, and CVE-2026-66788 has not yet been added to the CISA Known Exploited Vulnerabilities catalog. However, the exploitation path requires no specialized tooling — it is achievable with a standard Kubernetes client and existing broker credentials. Given the criticality and the low barrier post-foothold, organizations should assume motivated actors will weaponize this quickly. Monitor the NVD entry and Red Hat security advisories for updates.
Detection & Response
The highest-fidelity detection surface is the Kubernetes API server audit log. Exploitation leaves two clear signatures: (1) EndpointSlice or ServiceImport objects being created or modified in system namespaces by Submariner/Lighthouse reconciliation, and (2) anomalous label/annotation changes on broker objects. Hunt both.
Sigma Rules
The following rules target Kubernetes audit events ingested into your SIEM. Adapt the logsource to your ingestion pipeline (the kubernetes_audit service is used in Sigma for kube-apiserver audit logs).
---
title: EndpointSlice or ServiceImport Created in System Namespace
description: Detects creation or update of EndpointSlice or ServiceImport objects in kube-system, openshift-*, or default namespaces — consistent with CVE-2026-66788 namespace injection via compromised Submariner Lighthouse broker metadata.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-66788
author: Security Arsenal
date: 2026/06/10
status: experimental
id: 3f7c2a91-8e44-4b5d-9c61-2a4f6d8b0e17
tags:
- attack.privilege_escalation
- attack.persistence
- attack.t1078
logsource:
product: kubernetes
service: audit
detection:
selection_verb:
verb:
- create
- update
- patch
selection_resource:
objectRef.resource:
- endpointslices
- serviceimports
selection_ns:
objectRef.namespace|startswith:
- kube-system
- kube-public
- kube-node-lease
- openshift-
- default
filter_known_importers:
user.username|contains:
- 'system:serviceaccount:submariner-operator'
- 'submariner-lighthouse'
condition: selection_verb and selection_resource and selection_ns and not filter_known_importers
falsepositives:
- Legitimate Lighthouse reconciliation from recognized Submariner service accounts (tune filter to your exact SA names)
- Cluster operators managing network policies in system namespaces
level: high
---
title: Submariner Broker Object Label or Annotation Tampering
description: Detects patch/update operations on broker-resident objects by non-control-plane identities — exploitation of CVE-2026-66788 requires modifying attacker-controlled labels or annotations that define the injection destination namespace.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-66788
author: Security Arsenal
date: 2026/06/10
status: experimental
id: 9d1b5e63-4c28-47af-b3d5-6e8a1c2f9047
tags:
- attack.defense_evasion
- attack.lateral_movement
- attack.t1021
logsource:
product: kubernetes
service: audit
detection:
selection_verb:
verb:
- patch
- update
selection_resource:
objectRef.resource|contains:
- endpointslices
- serviceimports
- serviceexports
- brokers
- clusters
filter_operator:
user.username|startswith:
- 'system:serviceaccount:submariner'
- 'system:admin'
- 'system:kube-'
condition: selection_verb and selection_resource and not filter_operator
falsepositives:
- Administrators editing service exports during legitimate onboarding of new clusters
- GitOps controllers managing Submariner resources (add their service accounts to the filter)
level: medium
KQL (Microsoft Sentinel)
The following query hunts Kubernetes audit logs ingested into Sentinel (via the KubeAuditLogs/ContainerLogV2 pipeline, or Syslog/CEF forwarding of the API server audit log). It flags EndpointSlice/ServiceImport writes into system namespaces originating from outside the expected Lighthouse service accounts.
// CVE-2026-66788: Hunt for unauthorized EndpointSlice/ServiceImport injection into system namespaces
// Assumes kube-apiserver audit logs ingested as Syslog or via AKS/ARC diagnostics
Syslog
| where TimeGenerated > ago(7d)
| where SyslogMessage has_any ("endpointslices", "serviceimports")
| extend Msg = SyslogMessage
| where Msg has_any ("\"verb\":\"create\"", "\"verb\":\"update\"", "\"verb\":\"patch\"")
| where Msg has_any ("kube-system", "openshift-", "kube-public", "kube-node-lease")
| extend User = extract(@'"username\":\"([^\"]+)\"', 1, Msg),
Namespace = extract(@'"namespace\":\"([^\"]+)\"', 1, Msg),
Resource = extract(@'"resource\":\"([^\"]+)\"', 1, Msg),
SourceIP = extract(@'"sourceIPs\":\[\"([^\"]+)\"\]', 1, Msg)
| where User !contains "submariner" and User !startswith "system:kube"
| project TimeGenerated, Computer, Verb=Resource, Namespace, User, SourceIP
| summarize Events=count(), FirstSeen=min(TimeGenerated), LastSeen=max(TimeGenerated) by Namespace, User, SourceIP, Resource
| order by Events desc
For environments forwarding OpenShift audit logs via CEF, swap Syslog for CommonSecurityLog and parse the Message field accordingly.
Velociraptor VQL
For DFIR teams validating a suspect spoke cluster, this artifact reads the kube-apiserver audit log directly on control-plane nodes and extracts suspicious EndpointSlice/ServiceImport activity.
-- CVE-2026-66788: Parse kube-apiserver audit logs for EndpointSlice/ServiceImport writes into system namespaces
LET audit_logs <= SELECT FullPath
FROM glob(globs=['/var/log/kube-apiserver/audit.log', '/var/log/kubernetes/audit*.log'])
SELECT FullPath,
Line,
get(member='verb') AS Verb,
get(member='user.username') AS Actor,
get(member='objectRef.namespace') AS Namespace,
get(member='objectRef.resource') AS Resource,
get(member='sourceIPs') AS SourceIPs
FROM foreach(row=audit_logs,
query={
SELECT parse_json(data=Line) AS Parsed, Line, FullPath
FROM parse_lines(filename=FullPath)
WHERE Line =~ '(endpointslices|serviceimports)'
AND Line =~ 'kube-system|openshift-'
AND Line =~ '"verb":"(create|update|patch)"'
})
WHERE Actor !~ 'submariner'
Note: the exact audit log path varies by OpenShift version and audit policy — verify your control-plane audit log location before deploying the hunt.
Remediation and Verification Script
Use the following Bash script on a bastion with oc/kubectl access to (1) identify Submariner/Lighthouse exposure, (2) inventory suspicious injected resources in system namespaces, and (3) baseline broker object annotations for tamper review.
#!/bin/bash
# CVE-2026-66788 triage: OpenShift Submariner Lighthouse namespace-injection exposure check
# Run against EACH cluster in the broker fabric with cluster-admin credentials
echo "=== [1] Submariner/Lighthouse deployment check ==="
oc get submariners.submariner.io -A 2>/dev/null
oc get pods -n submariner-operator 2>/dev/null | grep -i lighthouse
oc get crd | grep -iE 'submariner|multicluster'
echo "=== [2] EndpointSlices in system namespaces NOT labeled by kubernetes.io (suspicious) ==="
for ns in kube-system kube-public kube-node-lease default $(oc get ns -o name | grep -oP '(?<=namespace/)openshift-.*'); do
oc get endpointslices -n "$ns" -o json | \
jq -r '.items[] | select(.metadata.labels["kubernetes.io/service-name"] == null or .metadata.labels["submariner-io"] != null) | "\(.metadata.namespace)/\(.metadata.name) labels=\(.metadata.labels | tostring)"'
done
echo "=== [3] ServiceImports present anywhere (MCS API objects) ==="
oc get serviceimports.multicluster.x-k8s.io -A 2>/dev/null
echo "=== [4] Broker object annotations/labels for tamper review ==="
oc get clusters.submariner.io -A -o json 2>/dev/null | \
jq -r '.items[] | "\(.metadata.name): labels=\(.metadata.labels | tostring) annotations=\(.metadata.annotations | tostring)"'
echo "=== [5] RBAC: who can write EndpointSlices/ServiceImports cluster-wide? ==="
oc get clusterrolebindings -o json | \
jq -r '.items[] | select(.roleRef.name | test("submariner|lighthouse|endpointslice|serviceimport"; "i")) | "\(.metadata.name) -> \(.roleRef.name) subjects=\([.subjects[]?.name] | join(","))"'
echo "=== [6] Recent audit events for endpointslices/serviceimports writes (control plane) ==="
oc adm node-logs --role=master --path=kube-apiserver/audit.log 2>/dev/null | \
grep -E 'endpointslices|serviceimports' | grep -E 'kube-system|openshift-' | grep -E '"verb":"(create|update|patch)"' | tail -50
Any EndpointSlice in a system namespace that does not map to a legitimate, expected service — or any broker annotation referencing a destination namespace that doesn't match the exporting service's origin — should be treated as an indicator of compromise and trigger a full IR engagement across all peer clusters, not just the one where you found it.
Remediation
-
Apply the vendor fix immediately. Track the NVD entry for CVE-2026-66788 and the corresponding Red Hat errata / Submariner upstream release. Update the Submariner Operator via your OpenShift OperatorHub subscription (or upgrade RHACM, which bundles Submariner for managed clusters) to the patched release as an emergency change. Verify the operator CSV version post-upgrade on every cluster in the fabric — patching the hub alone does not close this vulnerability.
-
Until patched, consider disabling Lighthouse service discovery. If cross-cluster DNS-based service discovery is not business-critical, scale down the Lighthouse components (
oc scale deployment -n submariner-operator -l app=submariner-lighthouse-agent --replicas=0and the equivalent CoreDNS plugin component) to eliminate the reconciliation pathway. Gateway connectivity via Submariner's route agents can remain up in many configurations. -
Restrict broker RBAC. Audit every ClusterRoleBinding granting write access to broker objects,
endpointslices, andserviceimports. Ensure spoke cluster credentials can only write to their own cluster-scoped broker resources — never cluster-wide. Apply least privilege ruthlessly; this CVE exists precisely because broker write access was over-trusted. -
Enable and centralize API audit logging. Confirm your OpenShift audit policy logs
RequestResponsemetadata forendpointslicesandserviceimportsin all namespaces, and ship those logs off-cluster to your SIEM. An attacker controlling a spoke can erase local evidence; centralized logs cannot be tampered with from the compromised node. -
Network segmentation as blast-radius control. Restrict spoke-to-broker connectivity to only the required API endpoints. Evaluate admission controls (OPA/Gatekeeper or ValidatingAdmissionPolicy) that deny creation of EndpointSlices in
kube-*/openshift-*namespaces except from explicitly approved service accounts. -
Hunt retroactively. Because exploitation leaves durable artifacts (injected objects), run the detection queries above across at least the last 30 days of audit history before declaring the fabric clean.
Conclusion
CVE-2026-66788 is a reminder that multi-cluster convenience features multiply your attack surface by the number of clusters you connect. A single compromised spoke — which may be a lower-security dev or edge cluster — now has a documented path into the system namespaces of every peer. Patch the Submariner/Lighthouse components across the entire fabric, hunt for injected EndpointSlices and ServiceImports in system namespaces, and re-baseline broker RBAC. Assume breach on your weakest cluster and design accordingly.
Related Resources
Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.