The Abracadabra Hack ($1.8M Logic Error)

Published on: October 9, 20256 Mins Read

Author:

On October 4, 2025, the Abracadabra protocol suffered an exploit targeting its Cauldron V4 contracts, resulting in the theft of approximately 1,793,766 MIM (~$1.8M). The attacker abused a logic flaw in the cook() multi-action flow: Action 5 (borrow) set needsSolvencyCheck = true, but Action 0 reset CookStatus, allowing the final solvency check to be bypassed and enabling under-collateralized borrowing.

Although these contracts were deprecated, they remained active and had not undergone recent audits, leaving the vector open. The attacker drained funds, routed them through Curve and Uniswap into ETH, and later obfuscated proceeds via Tornado Cash.
 

Hack Analysis

The cook() function enables execution of multiple operations, structured as an array of uint8 actions, where each unit value corresponds to a specific action.

Screenshot 2025-10-08 at 6.28.27 PM.png

Action 5 is used to borrow assets, which sets CookStatus.needsSolvencyCheck = true . This indicates that, after the action, the protocol must verify whether sufficient collateral has been provided.

Screenshot 2025-10-08 at 6.28.37 PM.png

Action 0 creates a new action but simply returns an empty CookStatus . This effectively resets the solvency check, removing the requirement to validate collateral for the borrowed asset.

Screenshot 2025-10-08 at 6.23.00 PM.pngScreenshot 2025-10-08 at 6.23.25 PM.png

The attacker exploited this mechanism by repeatedly alternating between these actions, ultimately draining 1,793,766 MIM tokens (~$1.8M).

Screenshot 2025-10-08 at 6.29.32 PM.png

The stolen funds were then laundered through Curve to stablecoins, and later swapped for ETH on Uniswap.

Screenshot 2025-10-08 at 6.30.10 PM.png

Root Cause

The core vulnerability was a logic error in the cook() function's handling of the shared CookStatus struct. While Action 5 sets needsSolvencyCheck to true during borrowing, Action 0 resets the entire struct via _additionalCookAction(), which is defined as:

function _additionalCookAction(CookStatus memory, bytes memory) internal pure returns (CookStatus memory) {
    return CookStatus(false);
}


This reset allows bypassing the final solvency check (_isSolvent(msg.sender, _exchangeRate)). The contracts were deprecated but not deactivated, and no audits had been conducted on the base CauldronV4 since November 2023, as focus shifted to new features.

Funds Flow After Attack

Following the exploit, the attacker obtained 395 ETH, which was subsequently laundered through Tornado Cash across 46 separate transactions.

Screenshot 2025-10-08 at 6.43.23 PM.pngScreenshot 2025-10-08 at 6.43.12 PM.png

Post Attack Mitigation

Abracadabra mitigated the incident by immediately pausing all borrowing from the Cauldron contracts.

Screenshot 2025-10-08 at 6.36.37 PM.png

To address the market impact, the DAO treasury repurchased the dumped MIM from secondary markets, claiming that the attack’s effects were fully neutralized. The team confirmed that no user funds were affected, and the overall impact was described as minimal.

Screenshot 2025-10-08 at 6.41.34 PM.png

Relevant Address and Transactions

Conclusion

The Abracadabra hack highlights the risks of leaving deprecated contracts active without proper audits or deactivation, especially in a protocol with a history of vulnerabilities. While the $1.8 million loss was mitigated through DAO buybacks and had no direct user impact, it underscores the need for rigorous security practices in DeFi. Lessons include prioritizing security audits for legacy code, implementing fail-safes for status resets in multi-action functions, and swift deactivation of unused components. Abracadabra maintains $154 million in TVL and plans continued development, but repeated incidents could erode user trust.

Subscribe to our Newsletter

Your weekly dose of Web3 innovation and security, featuring blockchain updates, developer insights, curated knowledge, security resources, and hack alerts. Stay ahead in Web3!