Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Network-reachable coordinator port, no authentication required by design of the flaw, scope changes as rogue node intercepts other users' requests, high C/I from credential theft and membership mutation, low A from partial availability disruption.
Primary rating from Vendor (https://github.com/Basekick-Labs/arc).
CVSS VectorVendor: https://github.com/Basekick-Labs/arc
Lifecycle Timeline
3DescriptionCVE.org
Summary
Arc Enterprise clustering accepts cluster join requests without authentication when cluster.enabled=true but cluster.shared_secret is not configured. The coordinator validates HMAC authentication only if a shared secret is non-empty; otherwise, a network attacker who can reach the coordinator port can send a join request with attacker-controlled node addresses and role. Accepted nodes are marked healthy, registered locally or added as Raft voters, and can be selected by the cluster router for forwarded authenticated requests.
Details
Cluster defaults include an empty shared secret and TLS disabled:
internal/config/config.go:943-950defaultscluster.enabled=false,cluster.cluster_name="arc-cluster", andcluster.coordinator_addr=":9100".internal/config/config.go:1001-1005defaultscluster.shared_secret=""andcluster.tls_enabled=false.
Startup requires a shared secret only for file replication, not for all clustering/join/routing use:
cmd/arc/main.go:1258-1265hard-fails withoutcluster.shared_secretonly whencluster.replication_enabledis true.
The join request contains attacker-supplied node identity, role, and addresses:
internal/cluster/protocol/messages.go:127-142definesJoinRequestfields includingnode_id,role,raft_addr,api_addr,coord_addr, plus optional auth fields.
The coordinator validates HMAC only when the configured shared secret is non-empty:
internal/cluster/coordinator.go:1066-1081wraps all HMAC checks inif c.cfg.SharedSecret != "" { ... }.- If the secret is empty, the join request proceeds after only the cluster-name check.
An accepted join creates a healthy node from attacker-controlled fields and adds it to cluster trust state:
internal/cluster/coordinator.go:1101-1107creates a node from request fields, sets attacker-provided coordinator/API addresses, and marks it healthy.internal/cluster/coordinator.go:1108-1129adds the attacker-providedraft_addras a Raft voter and stores node info when Raft is configured.internal/cluster/coordinator.go:1133-1138registers the node locally when Raft is not configured.
The router uses healthy nodes from this registry and forwards authenticated requests to their advertised API addresses:
internal/cluster/registry.go:263-270returns healthy writers/readers.internal/cluster/router.go:154-177routes writes to healthy writer nodes.internal/cluster/router.go:203-227routes queries to healthy readers, or writers if no readers exist.internal/cluster/router.go:327-357builds the forwarding target fromnode.APIAddressand copies all original request headers to the peer, includingAuthorizationandx-api-key.cmd/arc/main.go:1887-1897wires the cluster router into MessagePack, line protocol, TLE, and query handlers when the cluster coordinator exists.
A related lower-severity issue is that heartbeat messages are also unauthenticated:
internal/cluster/protocol/messages.go:175-180definesHeartbeatwithout HMAC fields.internal/cluster/coordinator.go:1220-1232records heartbeats and updates node state based only on suppliednode_idandstate.
Proof of concept
Safe local lab reproduction only; do not target external infrastructure.
Prerequisites:
- Enterprise clustering enabled in a lab deployment.
cluster.shared_secretintentionally left empty.- Network access to the coordinator TCP port, default
9100. - The attacker knows or guesses the cluster name; default is
arc-cluster.
Steps:
- Start an Arc cluster node with:
[cluster]
enabled = true
cluster_name = "arc-cluster"
coordinator_addr = ":9100"
shared_secret = ""
tls_enabled = false- Start an attacker-controlled HTTP listener that records request method, path, and headers, for example on
127.0.0.1:18080. - Send a framed cluster join request to the victim coordinator. The protocol uses a 4-byte big-endian length prefix, followed by a 1-byte message type (
MsgJoinRequest == 1), followed by JSON. The payload should include attacker-controlled node fields and omitauth_nonce,auth_timestamp, andauth_hmac:
{
"node_id": "evil-reader-1",
"node_name": "evil-reader",
"role": "reader",
"cluster_name": "arc-cluster",
"raft_addr": "127.0.0.1:19020",
"api_addr": "127.0.0.1:18080",
"coord_addr": "127.0.0.1:19010",
"version": "lab",
"core_count": 1
}Expected vulnerable result: the coordinator accepts the join instead of rejecting it for missing authentication.
- Trigger a forwarded operation from a node that cannot handle the operation locally. Examples depend on cluster roles:
- Join as
readerand trigger a query through a node that routes queries to readers. - Join as
writerand trigger ingestion through a non-writer node that routes writes to writers.
Expected vulnerable result: the attacker-controlled HTTP listener receives forwarded requests. Because forwardRequest copies all original headers, the listener can observe authentication headers such as bearer tokens or API keys along with request paths and bodies.
- In a Raft-enabled lab, observe that the attacker-provided
raft_addris submitted toAddVoter, demonstrating unauthorized membership mutation.
Impact
In affected cluster deployments, an unauthenticated network attacker can become a trusted cluster node. Practical impacts include:
- Interception of forwarded authenticated HTTP requests, including
Authorizationandx-api-keyheaders. - Exposure of query bodies, ingestion data, database/measurement names, and operational metadata.
- Unauthorized cluster membership mutation, including attempted Raft voter addition when Raft is configured.
- Potential data integrity impact if the rogue node returns forged query/write responses or accepts/diverts writes.
- Potential availability impact by blackholing or delaying forwarded operations.
This is not reachable in the default standalone configuration because cluster.enabled=false, but it is a critical trust-boundary issue for Enterprise cluster deployments where clustering is enabled without a shared secret. The code already treats cluster.shared_secret as mandatory for replication, which suggests unauthenticated cluster membership should also fail closed.
Suggested fix
- Fail startup when
cluster.enabled=trueandcluster.shared_secretis empty, not only whencluster.replication_enabled=true. - Reject all trust-mutating coordinator messages when no cluster authentication is configured, including join, heartbeat/state update, forward apply, and file replication messages.
- Require HMAC or mutual TLS before processing any join/heartbeat message.
- Bind authentication to node identity and advertised addresses to reduce replay and address-substitution risks.
- Do not forward end-user
Authorization/x-api-keyheaders to a peer unless the peer identity has been authenticated and authorized. - Add tests proving unauthenticated join and heartbeat requests fail when clustering is enabled.
References / evidence
internal/config/config.go:943-950internal/config/config.go:1001-1005cmd/arc/main.go:1258-1265internal/cluster/protocol/messages.go:127-142internal/cluster/coordinator.go:1066-1081internal/cluster/coordinator.go:1101-1138internal/cluster/router.go:154-177internal/cluster/router.go:203-227internal/cluster/router.go:327-357cmd/arc/main.go:1887-1897
AnalysisAI
Unauthenticated cluster node admission in Arc Enterprise allows a network attacker who can reach the coordinator TCP port to register a rogue node as a trusted cluster member when clustering is enabled without a configured shared secret. Once registered, the cluster router forwards legitimate end-user requests - including full HTTP headers such as Authorization and x-api-key - to attacker-controlled addresses, enabling credential interception. …
Unlock full vulnerability intelligence
- Risk assessment & exploitation conditions
- Attack chain visualization
- Remediation with exact patch versions
- Threat intelligence from 22 sources
- Personal watchlist & email alerts
Free forever · No credit card required
Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata
Vulnerability AssessmentAI
| Exploitation | Exploitation requires three concurrent conditions: (1) cluster.enabled=true in the Arc Enterprise configuration - this is NOT the default (cluster.enabled defaults to false); (2) cluster.shared_secret is empty or not set - the startup check only enforces a non-empty secret when cluster.replication_enabled is true, so a non-replication cluster can start and run fully unauthenticated; and (3) the attacker has TCP network access to the coordinator port (default :9100) and knows or guesses the cluster name (default: 'arc-cluster'). … Additional conditions and limiting factors are described in the full assessment. |
| Risk Assessment | The combination of a network-reachable unauthenticated endpoint, a publicly documented proof-of-concept, and direct credential interception as an outcome places this in a high-priority response category for any operator running Arc Enterprise clustering without a shared secret. … Full risk analysis with EPSS, KEV, and SSVC signal comparison available after sign-in. |
| Exploit Scenario | Full exploit scenario with step-by-step reproduction available after sign-in. |
| Remediation | Upgrade to Arc Enterprise v26.06.2 or any build at or after commit 38402ad2ebddd32c15bf4a0fc9c22c920e5685df, available at https://github.com/Basekick-Labs/arc/releases/tag/v26.06.2 and via the patch at https://github.com/Basekick-Labs/arc/pull/505. … Detailed patch versions, workarounds, and compensating controls in full report. |
Threat intelligence, references, and detailed analysis are available after sign-in.
Same weakness CWE-284 – Improper Access Control
View allSame technique Authentication Bypass
View allVendor StatusVendor
SUSE
Severity: ModerateShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-67945
GHSA-p378-jp5r-gpgw