Taiko bridge exploit: leaked SGX key, weak attestation
Published Oct 13, 2026
- Project
- Taiko
- Chain
- Ethereum
- Date
- Jun 21, 2026
- Loss
- $1.75M
- Class
- Leaked key, weak attestation
- Basis
- Project post-mortem or audit firm analysis
Taiko's bridge relied on SGX provers: a proof was trusted if it came from a registered enclave. Registration checked an attestation quote on-chain.
The attack started off-chain. An RSA-3072 key, enclave-key.pem, was committed to the public taikoxyz/raiko repository. On-chain, AutomataDcapV3Attestation.verifyParsedQuote() did not check the enclave's localEnclaveReport.attributes, so it did not reject a prover running in debug mode, where the enclave offers no real protection. With the key and a debug-mode enclave, the attacker registered their own address through SgxVerifier.registerInstance(), and verifyProof() accepted the forged proofs that followed.
Between 19:04 UTC on June 21 and 02:10 UTC on June 22, 2026 about 30 checkpoints covering roughly 6,100 blocks were finalized from forged proofs. About $1.75M left the bridge (roughly 278 ETH, stablecoins and TAIKO), while more than $11M was protected. The bridge was paused at 05:40 UTC on June 22 and reopened on July 2.
Taiko fixed the debug-mode check, voided the forged checkpoints, and later made a ZK proof mandatory for every block.
How to protect your protocol
- Secrets never go into a repository, public or private. Scan every commit for key material in CI, and treat any key that ever touched git as burned.
- Attestation must check everything that makes the enclave trustworthy. Debug mode, measurement, signer and security version are all part of the claim. Checking the quote's signature without its attributes proves only that some enclave, configured any way, produced it.
- Don't let one proof system be the only line. A single trusted prover type is a single point of failure. Requiring a second, independent proof (as Taiko later did with ZK) means one broken assumption does not move funds.
- Rate-limit withdrawals from a bridge. Hours of forged checkpoints draining the vault is a monitoring and limits problem as much as a code one.
Sources
- Taiko Labs post-mortem
- BlockSec analysis
- Instance registration:
0x2f44dc1b883522a88f9b0cbbdfabf9ec33884b69dd4326600c3fab7fb2277260 - Forged proof and withdrawal:
0x017292a7de5fef52a3274e37dda5ace4c4d0cdafe91b7b4ac9c700f02fae35ee - Last forged proof:
0x68ff8e072ff76dc90af1cba793b5923eda87945052e078478e35e90aa7ef7955 - Pause (Proposal #31):
0xebd565d77e02e9b1cdff8a06a9dcc38c70630281c13b1cb0ae5e521cf2f5ee20 - Fix: Proposal #34 (June 29), reviewed by OpenZeppelin with no critical, high or medium findings; mandatory ZK proofs from Proposal #36 (August 6).
How this was prepared: compiled from the sources above with the help of automated tools, then reviewed by the Foothold security team before publication.
Give Atlant a task
Could the same thing happen in your code?
Get it checked →