Startale Hack
What happened
In September 2026, an attacker drained pre-funded Startale smart accounts on Ethereum. The flaw was in how the accounts guarded initialization. The Startale smart account (ERC-7579, used for ERC-4337 account abstraction) used an EIP-1153 transient-storage flag as its only initialization check. The flag was set in the proxy constructor and was meant to live only during deployment. Transient storage actually lasts for the whole transaction, so right after the factory deployed an account, anyone could call initializeAccount() on it again in the same transaction. That second call ran an attacker-chosen bootstrap contract through delegatecall inside the account, which swept its balance.
The drain ran as roughly 41 batched transactions. The reported total is about $2,876 in USDC and USDT across roughly 330 victim accounts. One example batch, 0x1a021a27c8db5ecd6428a567cedf008872f205c55e590d4dcd2ea10e31a036a2, took 427.55 USDC from 23 accounts. The attack needed no signature, no privileged role and no attacker capital.
How it happened
- Users pre-funded counterfactual Startale accounts, sending USDC or USDT to each account's predicted address before the account contract was deployed.
- The attacker EOA
0x901DafdE7057BC2478d1eF640fb5515EA4757AABdeployed a throwaway contract whose constructor did all the work. In the example transaction, the factory emitted 40AccountCreatedevents, each followed by the normal owner registration in the ECDSA validator. - Each deployment set
INIT_SLOTto 1 withtstoreinside theAccountProxyconstructor. The flag stayed set after the constructor returned because transient storage is cleared only at the end of the transaction. - In the same transaction, the attacker's contract called
initializeAccount()again on each new account with its own bootstrap address.requireInitializable()only read the transient flag, and there was no persistent already-initialized check, so the call passed. - The malicious bootstrap ran through
delegatecallin the account's context and sent the pre-funded balance to the collector0xe2719E3b28EeF69bf3C4A9D7FC7280c5a015EcdE. The 23 funded accounts in the example batch lost 427.55 USDC in total.
Protocol details
Evidence
- code Add PoC: Startale ERC-7579 transient-storage re-init drain (DeFiHackLabs PR #1270) github.com
- analysis DeFiLlama defillama.com
- analysis DeFiHackLabs Startale_exp.sol raw.githubusercontent.com
- analysis DeFiHackLabs README (20260916 Startale entry) raw.githubusercontent.com
- analysis All Major Crypto Hacks To Date (Updated List) crypto-corner.com
Understand the attack patterns
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.