CVE-2026-82406: Klever-Go: Zombie-order theft: `Buy` missing `IsClaimed` guard in native marketplace
Location: core/kapp/market/market.go — Buy() (approx. L281–436)
Severity: High
The native marketplace enforces an IsClaimed guard in Claim (market.go:752), CancelOrder (market.go:1125), and orderEscrowAmount (market.go:251), but not in Buy.
Marketplace escrow is virtual: the market KApp account never custodies currency. A bid burns funds from the bidder (bidderAcc.SubFromBalance, ~L378), and refunds/payouts mint to the recipient (AddToBalance, e.g. the prior-bidder refund at ~L349). Soundness depends on each order’s CurrentBid being paid out exactly once.
A seller can settle a resting-bid auction early via the seller-accept branch of Claim (~L776) → executeBuyMarket (~L656). That path sets IsClaimed=true, delivers the NFT, pays the seller, and re-saves the order (SetMarketOrder, ~L726) — but, unlike every other settle path, it does not reset EndTime (contrast immediate-buy Buy ~L416 and CancelOrder ~L1206), and no code path deletes the order. The result is a “zombie” order: already settled, yet still loadable with EndTime in the future and a stale CurrentBidder.
Because Buy has no IsClaimed guard, a new bidder can still Buy on that settled order (the bid guard at ~L317 only forces the new amount Y > CurrentBid X). The new bidder is debited Y; the prior bidder is refunded X (funded by the new bidder, not minted); the new bidder becomes CurrentBidder on an IsClaimed order and can then neither Claim (reverts on IsClaimed) nor CancelOrder (reverts on IsClaimed). Their funds are lost permanently.
Attack sequence (permissionless , anyone can create a sell order):
- Attacker (seller
S) creates a resting-bid auction (Price=0,ReservePrice>0) for an NFT and self-bidsXas bidderA(Sybil). SacceptsA’s bid early viaClaim→ NFT goes toA(= attacker, keeps it),S(= attacker) collects the owner payout, order markedIsClaimed=truebut left “live”.- Victim
BbidsY > Xon the still-live-looking auction viaBuy.Buyrefunds prior bidderAthe amountX(AddToBalance, L349) and burnsYfromB(SubFromBalance, L378). Bis nowCurrentBidderon a claimed order and can neitherClaimnorCancelOrder— both revert onIsClaimed.B’sYis unrecoverable;Xof it was siphoned toA;Y−Xis destroyed.
References
- github.com/advisories/GHSA-26r5-4mm2-px5c
- github.com/klever-io/klever-go/commit/063bb3ed98f9a84a4b1f7286680613a5fc3c91b2
- github.com/klever-io/klever-go/pull/16
- github.com/klever-io/klever-go/releases/tag/v1.7.20
- github.com/klever-io/klever-go/security/advisories/GHSA-26r5-4mm2-px5c
- nvd.nist.gov/vuln/detail/CVE-2026-82406
Code Behaviors & Features
Detect and mitigate CVE-2026-82406 with GitLab Dependency Scanning
Secure your software supply chain by verifying that all open source dependencies used in your projects contain no disclosed vulnerabilities. Dependency Scanning using SBOM also detects vulnerabilities from proprietary advisories that this site does not include. Learn more about Dependency Scanning using SBOM →