Aug 28, 2026·6 min read·25 visits
Unauthenticated remote attackers can register rogue nodes in Arc database clusters, enabling silent query interception and extraction of administrative API keys.
CVE-2026-55678 defines a critical security vulnerability in the Enterprise clustering implementation of Arc, an open-source SQL-native time-series database. When clustering is enabled but a shared secret is not defined, the cluster coordinator fails to enforce authentication on cluster join requests and node status updates. Remote, unauthenticated attackers can exploit this behavior to register a rogue node, hijack telemetry routing, and harvest sensitive client authentication headers.
Arc is an open-source, SQL-native time-series database designed for telemetry ingestion and high-performance querying. In enterprise deployments, Arc supports multi-node clustering controlled by a centralized coordinator component. The coordinator listens on TCP port 9100 by default and manages member registrations, cluster state distribution, and peer routing.
Between versions 26.02.1 and 26.06.2, Arc suffers from an authentication bypass vulnerability within its cluster-coordinator join protocol. The vulnerability surfaces when clustering is enabled but the optional shared secret (cluster.shared_secret) is left unconfigured. In this configuration, the coordinator fails to validate the identity of joining nodes or enforce signature verification, allowing any network-adjacent entity to manipulate the topology.
While standalone or unlicensed open-source single-node deployments are unaffected due to clustering being disabled by default, Enterprise environments that activate clustering without explicitly defining a secure shared secret are fully vulnerable. This issue exposes clusters to arbitrary node registration, metadata tampering, and active man-in-the-middle operations.
The root cause of CVE-2026-55678 resides within the conditional verification logic implemented in internal/cluster/coordinator.go. During the initial execution of a cluster join handshake, the coordinator performs cryptographic signature validation of incoming requests only if a shared secret is explicitly specified in the database configuration.
// Logical flaw in legacy join validation path:
if c.cfg.SharedSecret != "" {
// Perform HMAC validation of the join request
if err := security.ValidateHMAC(...); err != nil {
return err // Rejected
}
}
// If SharedSecret was empty, the validation block was silently skipped,
// immediately falling through to accept the JoinRequest!If cluster.shared_secret is left blank, the validation block is skipped entirely. The coordinator falls back to matching only the static, non-random, and highly predictable cluster name string (defaulting to arc-cluster). This design allows arbitrary JoinRequest messages containing the correct cluster name to succeed without cryptographic proof of identity.
Furthermore, the legacy heartbeat protocol implemented in internal/cluster/protocol/messages.go lacked any authentication field or transaction verification. This omission meant that even if a cluster configured a shared secret for initial joins, subsequent node state changes and liveness check heartbeats occurred completely unauthenticated. Attackers could spoof heartbeats for arbitrary node IDs, altering the coordinator's status registry without possessing the cluster secret.
Finally, the query router (internal/cluster/router.go) performs request forwarding to specific nodes based on target partition keys. When the query router forwards a request, it clones and transmits the exact administrative headers—including the user's Authorization bearer tokens and x-api-key values—directly to the target node. By registering as a valid cluster member, a rogue node becomes an active recipient of these forwarded HTTP requests and their corresponding authentication tokens.
A detailed review of the patch in commit 38402ad2ebddd32c15bf4a0fc9c22c920e5685df reveals how the validation gaps were closed. The developers replaced the fail-open logic with a strict startup guard inside cmd/arc/main.go, making a shared secret mandatory whenever clustering is enabled:
// cmd/arc/main.go
+ // Clustering requires shared-secret auth on the coordinator
+ // protocol. Without it, the coordinator validates no HMAC on
+ // join/heartbeat/leave messages (the checks are gated on a
+ // non-empty secret), so any host that can reach the coordinator
+ // port could join as a trusted node. Fail closed rather than
+ // run an unauthenticated cluster (GHSA-p378-jp5r-gpgw).
+ if cfg.Cluster.SharedSecret == "" {
+ log.Error().Msg("cluster.enabled requires ARC_CLUSTER_SHARED_SECRET to be set")
+ os.Exit(1)
+ }In addition, cryptographic validation variables were appended directly to the base Heartbeat schema within internal/cluster/protocol/messages.go. This guarantees that liveness state updates are bound to signature validation mechanisms:
// internal/cluster/protocol/messages.go
type Heartbeat struct {
State string `json:"state"`
IsLeader bool `json:"is_leader"`
Timestamp time.Time `json:"timestamp"`
+ AuthNonce string `json:"auth_nonce,omitempty"`
+ AuthTimestamp int64 `json:"auth_timestamp,omitempty"`
+ AuthHMAC string `json:"auth_hmac,omitempty"`
}Lastly, the coordinator handles the validation inside internal/cluster/coordinator.go by verifying the calculated HMAC against the inbound heartbeat parameters, ensuring unauthenticated heartbeats are dropped:
// internal/cluster/coordinator.go
+ if c.cfg.SharedSecret != "" {
+ if hb.AuthHMAC == "" {
+ c.logger.Warn().Str("node_id", hb.NodeID).Msg("Heartbeat rejected: shared secret required")
+ return
+ }
+ if err := security.ValidateHMAC(
+ c.cfg.SharedSecret, hb.AuthNonce, hb.NodeID, c.cfg.ClusterName,
+ hb.AuthTimestamp, hb.AuthHMAC, security.HMACTimestampTolerance,
+ ); err != nil {
+ c.logger.Warn().Err(err).Str("node_id", hb.NodeID).Msg("Heartbeat rejected: auth failed")
+ return
+ }
+ }Exploiting CVE-2026-55678 requires the attacker to have direct network visibility of the coordinator port (default :9100) and knowledge of the non-random cluster name. The execution sequence involves crafting a malicious JoinRequest and monitoring incoming connections to harvest forwarded user query details.
Initially, the attacker constructs a structured payload simulating a legitimate database host. The payload maps its local interface as the registration endpoint for routing:
{
"node_id": "rogue-node-01",
"role": "writer",
"raft_addr": "attacker_ip:9101",
"api_addr": "attacker_ip:8080",
"coord_addr": "attacker_ip:9100"
}Upon transmitting this packet directly to the coordinator, the target environment validates the request parameters. Since no cluster secret is present, the signature validation phase is bypassed. The registry database appends rogue-node-01 into its topological routing table.
As clients submit write requests or query telemetry, the database routing engine evaluates the partitioning hashes. When a query is directed to a partition mapped to rogue-node-01, the query router replicates the HTTP payload to attacker_ip:8080. The attacker extracts the inbound HTTP header Authorization or x-api-key values, yielding administrative credentials.
While the implemented patch mitigates the default authentication bypass, a complete security assessment highlights specific operational characteristics that require defense-in-depth controls.
The current patch relies on a timestamp-based tolerance window (security.HMACTimestampTolerance) to evaluate incoming heartbeats and join messages. Because the implementation lacks a stateful cache to record and invalidate consumed AuthNonce values within the tolerance timeframe, a network adversary capable of sniffing local coordinator traffic can capture a valid heartbeat and successfully replay it until the expiration threshold is exceeded.
Additionally, if TLS transport security (cluster.tls_enabled) is disabled, cluster coordination packets and client queries pass across the local network in plaintext. While the control plane payload is cryptographically signed, transit encryption is necessary to block passive interception of the data payloads and authorization structures themselves. Implementation teams must ensure that both authentication and encryption parameters are strictly configured.
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| Product | Affected Versions | Fixed Version |
|---|---|---|
arc Basekick-Labs | >= 26.02.1, < 26.06.2 | 26.06.2 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-287, CWE-284, CWE-306 |
| Attack Vector | Network |
| CVSS v4.0 Score | 6.9 (Medium) |
| Exploit Status | Proof of Concept (PoC) available |
| CISA KEV Status | Not Listed |
| Ransomware Association | No known utilization in ransomware campaigns |
The software does not prove or insufficiently proves that a claim asserts that an identity is correct.
CVE-2026-109619 (PHP2Shell) is a critical Use-After-Free vulnerability in the core PHP engine caused by improper global state cleanup during out-of-memory exception handling across persistent worker requests.
In Python virtualenv prior to version 21.14.9, activation script generators and configuration writers use Path.exists() before writing files. Because Path.exists() resolves symbolic links, it returns False for dangling symlinks. Consequently, virtualenv skips unlinking pre-planted symbolic links or hard links, writing data directly to target locations outside the intended virtual environment directory.
A remote code execution vulnerability exists in Microsoft .NET due to untrusted data deserialization within the PresentationCore component. The flaw stems from implicit auto-conversion flags during clipboard data retrieval operations.
An out-of-bounds write vulnerability in Microsoft .NET Framework, .NET runtime, and Visual Studio allows unauthenticated remote attackers to execute arbitrary code via crafted pixel-shader bytecode or auto-converted clipboard payloads.
ASP.NET Core contains a thread deadlock vulnerability (CWE-833) that allows an unauthenticated remote attacker to cause a denial of service over the network by exhausting server thread pool resources.
CVE-2026-70035 is a high-severity Remote Code Execution (RCE) vulnerability in Microsoft .NET Framework, .NET runtime, and Visual Studio caused by improper handling during the deserialization of untrusted data (CWE-502). An unauthenticated attacker can execute arbitrary code within the context of the affected process by delivering a crafted serialized payload.