Pangram verdict · v3.3
We believe that this text is a mix of AI and human-written content.
AI likelihood · overall
MixedArticle text · 1,470 words · 14 segments analyzed
Note to readers: The information contained in this report is current as of the date of publication and may be updated as the investigation continues. Technical claims are drawn from internal and external documentation, supporting source materials and on-chain analysis. We thank the Liquid Federation Board and functionary node operators for their close coordination throughout and the broader Bitcoin development community for its scrutiny and support.Contents1. Executive Summary2. Liquid Architecture & Security Invariants3. Vulnerability Analysis4. Incident Timeline5. Mitigations, Fixes & Recovery6. Lessons & Corrective Actions7. AcknowledgmentsSection 1: Executive SummaryOn September 6, 2026 at 13:53 UTC (Liquid block 4,050,336), an attacker exploited a vulnerability in Elements' rangeproof verification cache, allowing a single transaction to pass validation even though its output value was not backed by its inputs. Liquid nodes, including federation functionary nodes, accepted the transaction. It inflated the LBTC supply by approximately 4,000 LBTC with no bitcoin behind it.The attacker then moved the unbacked LBTC through Liquid's standard peg-out process, via SideSwap, a Federation member holding a Peg-out Authorization Key (PAK). This produced a withdrawal of approximately 4,000 BTC, confirmed in Bitcoin block 965,783.
Smaller peg-outs confirmed before the network was halted brought the Liquid reserve down from about 4,205 BTC to 197 BTC.All other Liquid-issued assets (USDt, DePix, and other tokenized assets) were unaffected by the incident, though they were unavailable while the network was paused.The attacker identified themselves on-chain within hours of the incident and returned 3,400 BTC (September 7, 16:09 UTC, Bitcoin block 965,950) after several rounds of negotiations.
Approximately 602 BTC remain outstanding.Blockstream coordinated a halt of the Liquid bridge nodes (public nodes that users connect to) shortly after the attack, deployed an emergency interim patch within hours, and shipped a fully reviewed hardening release, Elements v23.3.4, within days.The purpose of this report is to outline what happened, and how Blockstream and the Liquid Network responded to this unprecedented attack.
Section 2: Liquid Architecture & Security InvariantsLiquid is a production Bitcoin sidechain built on Elements, an open-source blockchain platform developed by Blockstream. Liquid runs Elements Core with its own chain parameters, consensus configuration, and active federation, and is operated by 15 geographically distributed functionary nodes. Blocks require signatures from at least 11 of the 15 functionary nodes to be accepted by the network.Three architectural properties are especially important to understanding the September 6 security incident and its impact:1) 1:1 BTC backing. BTC locked on the Bitcoin chain via peg-in is matched 1:1 by LBTC issued on Liquid. BTC is only released on peg-out against a corresponding LBTC burn. This depends entirely on consensus validating correctly that no LBTC can be created without a matching and provably valid transaction. There is no separate, off-chain reserve check at peg-out time; the peg-out mechanism relies on the sidechain's own validated state.2) Confidential Transactions and rangeproof verification.
Liquid blinds transaction amounts and asset types using Pedersen commitments. A zero-knowledge rangeproof attached to each confidential output proves the committed value is in a valid range, without revealing it, and a surjection proof ties the output's asset generator back to a valid input asset. On its own, a rangeproof only proves a value is in range. Consensus rules combine it with the transaction's asset generator and scriptPubKey, so the proof is only meaningful for that exact output, in that exact place. Elements caches the results of these expensive checks to avoid re-verifying identical proofs across mempool and block validation.3) PAK-based peg-out authorization.
Per the Liquid Federation Member Charter and the PAK Entry Creation Instructions, every PAK entry has two keys. Each key does a different job.A) The offline key. This is a Bitcoin extended public key (xpub) derived from the member’s cold wallet.
It allows the functionary node’s HSM to verify that a peg-out destination belongs to a registered PAK entry without needing the wallet’s private keys. Peg-out proceeds go to receiving addresses derived from this key.
The Charter instructs members to "keep the bitcoin receiving wallet offline and secure." This keeps the bitcoin backing LBTC safe, even if an attacker gets past other defenses.B) The online key. This is a secp256k1 key. Its private half lives on a running Elements node, in the node's peg-out wallet. It stays online, because it signs peg-out requests.In other words, the PAK authorization does two things: it controls where BTC can go (offline key), and it controls who can ask for BTC to be sent (online key).The offline key exists as a safety net for upstream failures.
If, for example, consensus validation accepts bad LBTC by mistake, a genuinely offline receiving wallet still holds the released BTC afterward. Someone must manually retrieve the funds from cold storage and move them. This takes time.
That delay gives the Federation a window to catch the problem and act, before the BTC leaves reachable custody.Section 3: Vulnerability AnalysisTwo distinct issues enabled the attacker to steal BTC from Liquid: (1) the consensus vulnerabilities in Elements (described below as Bug A and B); and (2) a gap in how one member’s PAK signing process was configured. Both are described in more detail below.Bug A & BBug A originated in an April 2018 commit included in Elements PR #335, which was merged on May 30, 2018 in Elements v0.14.1. The change simplified the rangeproof cache key so that it no longer included the asset commitment or scriptPubKey, meaning a cached result was not bound to all of the context used to verify the rangeproof.This was a critical consensus bug. Under the right conditions, one node could reuse a previously cached result and accept a rangeproof in a context where it was not actually valid, while another node without that cached result would reject the same transaction. Because consensus requires nodes to reach the same result when validating a block, this difference could cause the network to split, potentially disrupting or halting normal block production. The rangeproof cache key was computed as SHA256(nonce ‖ rangeproof ‖ value_commitment), leaving out the asset commitment and scriptPubKey, even though both were part of the underlying rangeproof verification.
As a result, once a (rangeproof, value commitment) pair had been successfully cached, the node could treat the same pair as already valid when presented with a different asset commitment or script, without running the rangeproof verification again. A node with that cache entry could therefore accept a transaction that a node with a cold cache would reject, creating a consensus mismatch that could split the chain or stall block production.
The defect was introduced in 2018, and the underlying cache-key design was carried into the later Confidential Assets validation implementation during a 2019 refactor. After that, the relevant behavior remained essentially unchanged until 2026.The subtlety and deeply embedded nature of this class of defect is well recognized in the industry. Across the broader blockchain ecosystem, latent vulnerabilities in cryptographic and consensus code have persisted undetected for comparable periods even in heavily audited projects. Security review, by its nature, focuses most closely on new or changing code.
Stable, long-running code that has passed prior review and operated without incident occupies a lower-risk tier in standard audit frameworks - a prioritization approach consistent with widely accepted software security practices.The emergence of AI-assisted analysis tools has begun to shift the landscape for reviewing legacy codebases.
These tools can search large codebases, compare historical changes and test potential exploit paths more efficiently than traditional manual review alone. In light of this incident, Blockstream and the Liquid Network are continuing to incorporate these capabilities into their ongoing review program (see Section 6).Bug A: Disclosure, Validation & Remediation Date Source Notes August 2, 2026 External security researcher, via Blockstream's security mailbox Reported Bug A with two proposed fixes the same day, submitted one after the other: a direct byte-concatenation approach and a more comprehensive length-prefixed serialization approach. August 3, 2026 Blockstream, QA AI-scan review Internal fix opened, extending the cache key through direct byte concatenation; deployed to bridge and testnet bridge nodes the same day. August 4, 2026 Blockstream Liquid team, supplementary AI-scan review Additional AI-assisted review capacity (Kimi-K3) used to scan Elements branches beyond the normal QA cycle. August 5, 2026 Blockstream Fix validated on Liquid testnet against a cache-poisoning transaction; confirmed it resolved Bug A but did not test for the byte-boundary condition behind Bug B, which was unknown at the time. August 7, 2026 External security review engagement Independently identified the same defect with a working proof of concept and direct byte-concatenation approach, alongside five other lower-severity findings. Three separate reviews (the external researcher’s report, Blockstream’s internal review, and a separate external engagement with the Bitcoin Red Team) reached the same root cause within five days. This gave Blockstream strong confirmation that Bug A was real and serious. Work on a fix began within a day of the first report.The external researcher (stutxo) proposed two ways to fix the problem.