OAK — OnChain Attack Knowledge

Worked example · 2026-08

TAC — the upstream fix was three days old and the attack method had been published two days earlier, so the chain was drained through a bug it could have patched and then froze for ten days — TAC (Cosmos EVM / TON-connected L1) — 2026-08-22

Loss
Nominal and realised are three orders of magnitude apart, and the gap is the story. TAC's postmortem records 2,985,651,403.40 TAC drained — 28.6% of total supply; early reporting carried a figure ten times larger (29.86B) and a ~$7.5M headline valuation. What the attacker actually converted was far smaller: approximately 1.21B TAC sold on BNB Chain for ~950,000 USDT and 49.9M TAC on TON for ~55,000 USDT — about $1.0M realised against a nominal 28.6% of the money supply, because dumping a quarter of a token's supply into its own book destroys the price it is being sold at. Response cost dominated: the network halted at block 24,671,475 and stayed frozen for over ten days, and the recovery plan required the Foundation to replace 1.26B TAC from treasury reserves, freeze 65.1M TAC on-chain, and write off 1.66B TAC sitting on BNB Chain. TAC's second incident of 2026, after a ~$2.85M bridge exploit in May.
OAK Techniques observed
OAK-T9.007 (Fork-Substrate Vulnerability Not Mitigated — primary, confirmed mechanism. The defect was in Cosmos EVM, an execution stack TAC adopted rather than wrote: the EVM StateDB tracked only spendable balances while the Cosmos SDK bank ledger also counted locked vesting tokens as delegatable, and the asymmetry let a caller delegate beyond its actual balance, driving an unchecked subtraction to wrap toward 2^256. Affected versions were Cosmos EVM below 0.6.2 and 0.7.0–0.7.1. See techniques/T9.007-fork-substrate-vulnerability-not-mitigated.md). OAK-T7.003 (Cross-Chain Bridge Laundering — the drained TAC was moved to BNB Chain and TON to be sold, which is also what put 1.66B of it beyond the reach of the on-chain freeze).
Attribution
unattributed. No named individual, group, or link to a tracked OAK actor. TAC's public communications were notably sparse: at the time of the halt the project did not identify the unauthorised amount, a dollar loss, the exploit transaction or block height, the vulnerable component, affected wallets, user losses, or a restart timetable. The technical detail above comes from the 2026-09-01 postmortem and from upstream Cosmos EVM disclosure, not from the halt announcement.
Key teaching point
For a chain built on someone else's execution stack, the window between an upstream fix and a downstream deployment is a published, machine-readable countdown that the attacker can read too. The sequence here is fully documented and leaves nothing to interpretation: reported to the Cosmos bounty programme 2026-04-25, patched on main 2026-05-15, backported into releases 2026-08-19, publicly described as an attack method by Push Chain on 2026-08-20, and exploited on TAC on 2026-08-22. The exploitable interval was not the four months of latent vulnerability — it was the two days between a public write-up and an available patch that had not been applied. The control is not faster patching in the abstract but a named upstream-tracking owner with authority to force an emergency upgrade, because the fix existed, was released, and needed only to be run. The second lesson sits in the recovery: TAC could freeze what remained on its own chain and could do nothing about the 1.66B TAC already on BNB Chain, which is why halting fast bounds the loss and bridging out defines the floor.

Summary

TAC is a Cosmos SDK Layer-1 with an EVM execution environment, positioned as a bridge between EVM tooling and the TON ecosystem. Its EVM layer runs Cosmos EVM, a shared upstream component.

Cosmos EVM carried a balance-accounting asymmetry. The EVM StateDB tracked only spendable tokens; the Cosmos SDK bank/staking ledger also treated locked vesting tokens as eligible for delegation. Because the two views disagreed about what an account held, a caller could delegate more than it actually owned, and the resulting subtraction underflowed — wrapping an account balance toward 2^256. The bug was reported to the Cosmos bug-bounty programme on 2026-04-25 and fixed on the main branch on 2026-05-15. The fix reached released versions in a backport on 2026-08-19. On 2026-08-20, Push Chain publicly described the attack method.

On 2026-08-22, TAC — running an unpatched build — was exploited. 2,985,651,403.40 TAC (28.6% of total supply) left a custodial account. TAC halted block production at block 24,671,475 (23:58 UTC) and published almost nothing. The attacker bridged out and sold: ~1.21B TAC on BNB Chain for roughly 950,000 USDT, and 49.9M TAC on TON for roughly 55,000 USDT.

The chain stayed frozen for more than ten days while validators converged on a patched binary. The recovery plan published with the 2026-09-01 postmortem was an accounting reconstruction rather than a recovery: freeze 65.1M TAC still reachable on-chain, accept that 1.66B TAC on BNB Chain was gone, and replace 1.26B TAC out of Foundation treasury reserves so that honest holders were made whole against a supply the protocol no longer controlled.

Timeline (UTC)

When Event OAK ref
(standing) TAC runs Cosmos EVM with the StateDB / bank-ledger vesting-delegation asymmetry (affected: < 0.6.2 and 0.7.0–0.7.1) (standing T9.007 surface)
2026-04-25 Bug reported to the Cosmos bug-bounty programme (upstream disclosure begins)
2026-05-15 Patch merged to Cosmos EVM main branch (fix exists)
2026-08-19 Backport released into shipping versions — the patch becomes deployable (fix available)
2026-08-20 Push Chain publicly describes the attack method exploitation window opens
2026-08-22 TAC exploited on an unpatched build; 2,985,651,403.40 TAC (28.6% of supply) drained via delegation underflow T9.007 exploitation
2026-08-22 23:58 TAC halts block production at block 24,671,475; no amount, transaction, component, or timetable disclosed (operator response — containment without disclosure)
(after) ~1.21B TAC sold on BNB Chain (~950K USDT); 49.9M TAC sold on TON (~55K USDT) T7.003 — cross-chain offramp
2026-09-01 Postmortem published: root cause, freeze 65.1M TAC, 1.66B TAC on BNB Chain unrecoverable, 1.26B TAC replaced from Foundation treasury (recovery plan)
through 2026-09-02+ Network still frozen — 10+ days — pending validator consensus on the patched binary (cost of the halt)

What defenders observed

  • Every element of a working disclosure process functioned, and the chain was still drained. A researcher found the bug, a bounty programme paid for it, maintainers patched it, and a backport shipped. The one step with no owner was "someone at TAC upgrades the binary," and that is the step the whole chain depended on.
  • Public attack-method write-ups compress the deployment window to days. Push Chain's 2026-08-20 description is normal, useful security communication. Its predictable effect is that every downstream chain on an affected version becomes a target within 48 hours. Downstream operators must treat an upstream disclosure as a deployment deadline, not as reading material.
  • Version-inventory is the missing control and it is trivial. The affected range was published (< 0.6.2, 0.7.0–0.7.1). Any chain that could answer "what version of Cosmos EVM are we running, right now?" from a monitored source would have known it was exposed on 2026-08-19. Adopting a shared execution stack means inheriting its CVE feed as an operational obligation.
  • Silence during the halt made the incident harder to reason about for everyone else. Withholding the amount, transaction, and vulnerable component for ten days did not slow the attacker — who had already sold — but it did prevent other Cosmos EVM chains from checking whether they shared the exposure. A halted chain's disclosure is a public-good obligation to its peers, not just to its holders.
  • Nominal supply loss and realised proceeds are different quantities, and only one of them is a threat metric. 28.6% of the supply became roughly $1.0M, because the attacker's inventory was priced in a market they were destroying. Reporting a "$7.5M hack" describes neither what the attacker earned nor what the ecosystem paid — which was ten days of downtime plus 1.26B TAC of treasury.
  • The freeze boundary is the bridge. 65.1M TAC frozen on-chain, 1.66B TAC written off on BNB Chain. The recoverable fraction was decided entirely by how much had already crossed a bridge when block production stopped.

Public references

Discussion

T9.007 entered the corpus as a story about forked contracts — a project copies another protocol's code, upstream patches a bug, the fork does not. BounceBit (2026-08-19) moved it up a layer to an adopted execution stack. TAC is the same layer as BounceBit with the timeline made explicit, and the explicit timeline is what makes it worth filing separately. Where most T9.007 cases are reconstructed after the fact — the fork was running old code, nobody knows since when — TAC's exposure window is documented to the day at every step: bounty report, main-branch merge, backport release, public attack description, exploitation. The interval that killed it was 72 hours long and every hour of it was public.

That precision changes what the case can teach. The usual conclusion from a fork-substrate incident is "track upstream," which is advice without a threshold. Here the threshold is measurable: a backport landed on 08-19, a method write-up on 08-20, an exploit on 08-22. Any downstream chain whose emergency-upgrade path is slower than about two days from upstream release is, in this class, running on the attacker's schedule rather than its own. Cosmos EVM is shared by a large and growing set of chains, and the affected version range was published — so the population at risk on 08-19 was enumerable by anyone, defenders included.

The aftermath is the corpus's cleanest illustration of a pattern also visible in Harmony (2026-08-12) and The Sandbox SAND (2026-08-22): mint or drain capacity is not extraction capacity. 28.6% of a token's supply realised about $1.0M, because the only buyers were the ones the attacker was selling into. The real bill was paid by the project — ten days of frozen chain and 1.26B TAC of treasury — and by the honest validators and users who had no part in any of it. Contributors documenting supply-scale incidents should record nominal, realised, and response cost as three separate figures, because collapsing them into one headline number misstates every question a defender would actually ask.

Techniques demonstrated (2)