Root cause
The vault implemented a permissioned lending whitelist: any address added to the whitelist by the governing Safe multisig could call withdraw() and remove aBaswstETH (Aave-wrapped staked ETH on Base) without supplying collateral. There was no time-lock on whitelist changes, no secondary verification of added addresses, and no economic guarantee tied to whitelist membership.
// Simplified vulnerable pattern (reconstructed from on-chain behaviour)
function withdraw(address token, uint256 amount) external {
require(whitelist[msg.sender], "Not whitelisted");
// No collateral requirement — any approved address withdraws freely
IERC20(token).safeTransfer(msg.sender, amount);
}
function setWhitelist(address addr, bool approved) external onlyMultisig {
// No time-lock, no validation of addr
whitelist[addr] = approved;
}
Immunefi researcher Gonçalo Magalhães confirmed the flaw: any approved address could withdraw assets without collateral. A researcher had independently identified and attempted to disclose this vulnerability approximately one week before it was exploited, but found no clear responsible-disclosure pathway to the vault's team.
Attack steps
| # | Time (UTC) | Action |
|---|---|---|
| 1 | 08:52 | Vault's Safe multisig removes a newly-deployed, previously-unseen contract from the whitelist |
| 2 | 08:53 | The same multisig re-adds the identical contract to the whitelist one minute later |
| 3 | 08:53–09:11 | Attacker calls withdraw via the whitelisted contract across 6 separate transfers |
| 4 | 09:11 | 1,783.067 aBaswstETH drained, redeemed through Aave V3 for ~1,783 wstETH |
| 5 | Post-exploit | No team publicly claims the vault or publishes a post-mortem for 24+ hours |
Impact
- Stolen:
1,783 wstETH ($6,000,000) - Remaining at risk: ~$31.7M still in vault at time of exploit
- Chain: Base (Coinbase L2, EVM-compatible)
- No post-mortem: No team had claimed responsibility or disclosed remediation more than 24 hours after the incident
- Disclosure gap: Immunefi publicly noted a researcher had flagged this a week prior without a clear submission path
Lessons for auditors
- Whitelist + collateral-free withdrawal = critical finding: Any pattern where list membership alone entitles a caller to withdraw assets without an economic guarantee (collateral, stake, bond) should be flagged as critical. The whitelist becomes a high-value attack surface.
- Safe multisig ≠ safe without a time-lock: A 3-of-7 (or any threshold) multisig is not sufficient protection against social engineering or compromised signers when whitelist changes are instant. Implement
TimelockControlleror an equivalent on all privileged operations. - Anonymous vaults demand extra scrutiny: When no team claims a vault for 24+ hours post-exploit, auditors should require a named responsible party before certifying production deployments.
- Responsible-disclosure infrastructure is a security control: Protocols must publish a disclosed contact (Immunefi, security.txt, or similar). A known vulnerability with no clear path to the team is effectively unpatched.
- Monitor multisig state changes on-chain: Automated monitoring for whitelist add/remove events can catch suspicious patterns before a full drain completes.