Sep 23, 2026·5 min read·7 visits
An incorrect authorization flaw in klever-go < 1.7.20 allows attackers to overwrite any account's permission set using a malicious contract call, resulting in unauthorized account takeover.
A critical incorrect authorization vulnerability (CWE-863) exists in the Go implementation of the Klever blockchain protocol (klever-go) prior to version 1.7.20. The vulnerability allows an attacker to completely replace a target account's permission set by manipulating the RecipientAddr parameter in a VM built-in function, leading to total account takeover.
The Go implementation of the Klever blockchain protocol (klever-go) contains a critical incorrect authorization vulnerability within its Virtual Machine execution layer. The flaw resides specifically in the KleverUpdateAccountPermission VM built-in function. This function is responsible for managing and modifying cryptographic authorization structures and permissions for user accounts on the blockchain network.
This security vulnerability belongs to the Incorrect Authorization class (CWE-863). During VM execution, the system fails to correctly verify whether the entity invoking the permission modification has the required cryptographic authority to perform the action. Instead, the validation checks rely on an attacker-controlled variable rather than the authenticated transaction caller.
Successful exploitation of this flaw allows an unauthenticated remote attacker to completely overwrite the permission structure of a target wallet. This enables a complete account takeover, leading to the unauthorized transfer of assets and permanent lockout of the legitimate owner. The vulnerability exposes a critical attack surface in the protocol's smart contract execution environment.
The root cause of the vulnerability resides within the authorization check in core/kapp/builtInFunctions/kleverUpdateAccountPermission.go. When a contract triggers the ProcessBuiltinFunction method, the virtual machine loads the target account data into memory. It then invokes the internal helper method contractHasValidPermission to determine whether the transaction execution is authorized.
This helper method validates authorization by comparing registered signers in the target account with the vmInput.RecipientAddr parameter. However, in the context of indirect contract calls, the calling contract controls both the parameters of the call and the value of vmInput.RecipientAddr. Because of this design choice, the target value is entirely under the control of the attacker's execution payload.
By setting vmInput.RecipientAddr to match the target victim's account address, the attacker forces the comparison bytes.Equal(signer.Address, recipientAddr) to evaluate as true. The validation checks identify the victim's self-signing entry and accept its weight as valid authorization. The virtual machine then proceeds to execute the state change without verifying that the actual transaction caller has any authorization over the victim account.
Prior to the patch, the vulnerable helper function evaluated permissions using the uncontrolled recipient address as shown below:
func (e *kleverUpdateAccountPermission) contractHasValidPermission(permissions []*state.Permission, recipientAddr []byte) bool {
for _, permission := range permissions {
for _, signer := range permission.Signers {
if !bytes.Equal(signer.Address, recipientAddr) {
continue
}
if signer.Weight >= permission.Threshold &&
permission.CheckPermissionGrantedForContracts(transaction.TXContract_UpdateAccountPermissionContractType) {
return true
}
}
}
return false
}The security patch resolved this flaw in commit c58740eb74d7ee8f07db1e18a7d6214b5559ba32 by removing the vulnerable helper and passing the authenticated CallerAddr directly to the KApp core:
// Updated call structure passing caller address explicitly
resultCode, err := e.kappController.GetAccountsKApp().UpdatePermission(vmInput.CallerAddr, address, contract)The core KApp function signature was hardened to ensure that permissions can only be updated if the cryptographically verified authorizer matches the target account, or is explicitly registered as an authorized delegate in the permission state:
func (a *accountsKapp) UpdatePermission(authorizer []byte, target []byte, tc *transaction.UpdateAccountPermissionContract) (transaction.Transaction_TXResultCode, error) {
...
if !bytes.Equal(authorizer, target) && !authorizerCanUpdatePermission(ownerAcc.GetPermissions(), authorizer) {
ctx.Receipts().AddError(ctx.ContractID(), common.ErrFieldInvalidPermission, common.ErrNoPermission.Error())
return transaction.Transaction_ParameterInvalid, common.ErrNoPermission
}
...
}To execute this attack, an adversary deploys a malicious smart contract on the target network. This smart contract is configured to trigger the KleverUpdateAccountPermission built-in function via an indirect call. The attack payload specifies the target victim's wallet address as the subject of the permission change.
The exploit sequence operates as follows:
The malicious contract sets the RecipientAddr parameter of the indirect call payload to the victim's account address. When the built-in function processes this input, it locates the victim's own self-signing key within their permission structure. Because the addresses match, the validator confirms that the self-signer key meets the threshold and approves the modification, replacing the legitimate key with the attacker's public key.
The impact of CVE-2026-82405 is critical to the security and integrity of the affected blockchain network. Successful exploitation allows an attacker to seize absolute control of any account on the network that has previously configured custom permissions. Legitimate users are locked out of their accounts because their active keys are deleted from the account's state.
With administrative access established, the attacker can transfer all tokens, interact with contracts as the victim, and modify secondary security settings. This bypasses multi-signature configurations entirely, rendering advanced account protection mechanisms ineffective. This poses a severe threat to decentralized organizations, validators, and individual participants.
The primary remediation for this vulnerability is to upgrade all klever-go nodes, validators, and client software to version 1.7.20 or later. This release contains the formal patch that replaces the vulnerable validation checks with a robust identity check. Users should review their account permission configurations to ensure no unexpected changes occurred prior to patching.
In environments where immediate software upgrades are not feasible, network administrators should implement logging and monitoring controls to capture and analyze call parameters to the UpdateAccountPermission built-in contract. Any pattern of contract-initiated permission updates targeting separate user addresses should be treated as a highly critical security incident.
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N| Product | Affected Versions | Fixed Version |
|---|---|---|
klever-go klever-io | < 1.7.20 | 1.7.20 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-863 |
| Attack Vector | Network |
| CVSS v4.0 Score | 8.7 (High) |
| Exploit Status | PoC Available |
| CISA KEV Status | Not Listed |
| Remediation Status | Patched in v1.7.20 |
The product performs an authorization check when an actor attempts to access a resource or perform an action, but it does not correctly associate the authorization with the identity of the actor.
Prior to version 1.7.20, the default-open WebSocket `/subscribe` endpoint in klever-go was vulnerable to remote resource exhaustion. Unauthenticated, remote attackers could crash validator and node processes by exploiting unbounded frame reads, uncapped concurrent connections, unrestricted memory allocation for subscription address keys, and a permanent memory leak in subscription map tracking on client disconnects.
A Cross-Site Request Forgery (CSRF) vulnerability in REDAXO CMS prior to version 5.21.2 allows unauthenticated remote attackers to trigger unauthorized package updates by exploiting an insecure default configuration in the base API class.
CVE-2026-85724 is a critical vulnerability in the Moquette MQTT broker (versions prior to 0.18.1) where unvalidated substitution of client identifiers and usernames into pattern-based Access Control Lists (ACLs) permits remote authenticated attackers to bypass multi-tenant boundaries and trigger a Denial of Service.
CVE-2026-88974 is an incorrect authorization vulnerability in the WPGraphQL plugin for WordPress. Due to a failure to perform object-level capability checks or validate status-transition requirements in the updatePost mutation handler, authenticated Contributor-level users can publish their own draft posts without editorial approval or modify their previously published posts.
A technical analysis of CVE-2026-73858 / GHSA-gxrg-x694-283w, a server-side template injection vulnerability in the Solspace Freeform plugin for Craft CMS. The vulnerability permits unauthenticated users to trigger dynamic Twig evaluation of input fields during form validation re-rendering, causing local directory path disclosure and PHP runtime information exposure.
An algorithmic complexity vulnerability (CWE-407) in the query decoder of the Elixir Plug library (CVE-2026-54892) allows unauthenticated remote attackers to trigger scheduler starvation and denial of service by transmitting deeply nested brackets in query parameters or URL-encoded post bodies.