Decentralized Finance (DeFi) protocols manage billions in digital assets, making them prime targets for attackers. This guide walks through a professional audit process with real examples from recent hacks to help you identify vulnerabilities before they're exploited.
1. Understand the Protocol Architecture
Before reviewing code, map out the protocol's core components and interactions:
- Create a system diagram showing all smart contracts
- Document all external dependencies (oracles, bridges)
- Identify privileged roles (admins, multisigs)
- Note all value entry/exit points
Example: The Euler Finance hack ($197M) exploited interactions between lending modules that weren't fully documented.
2. Review Economic Incentives
Attackers often exploit incentive mismatches rather than pure code bugs:
// Bad incentive design example (simplified)
function liquidate(address user) external {
// Liquidator gets 100% of collateral
uint collateral = getUserCollateral(user);
safeTransfer(msg.sender, collateral);
// But debt isn't properly accounted for
userDebt[user] = 0;
}
The 2022 Venus Protocol incident ($11M loss) involved flawed liquidation incentives that allowed attackers to profit from small price fluctuations.
3. Check Oracle Implementations
Price manipulation remains the #1 attack vector in DeFi:
- Verify multiple price sources are used
- Check for stale price protections
- Confirm reasonable price deviation thresholds
- Review emergency pause mechanisms
Case Study: The Mango Markets exploit ($114M) manipulated oracle prices through low-liquidity markets.
4. Analyze Access Controls
Overprivileged accounts create systemic risk:
// Dangerous admin function example
function emergencyWithdraw(address token, uint amount) external onlyAdmin {
// No timelock or multisig requirement
IERC20(token).transfer(admin, amount);
}
- Time-delayed changes (>24-72 hours)
- Multisig requirements (3/5 signers)
- Community governance for major changes
5. Test Edge Cases
Simulate unusual conditions that developers might overlook:
- Extreme market conditions: 100x price swings, 0 liquidity
- Protocol interactions: Sandwich attacks, flash loans
- Upgrade scenarios: Storage collisions, initialization
Example: The 2023 Sentiment hack ($1M) exploited an untested edge case in accounting during partial liquidations.
6. Verify Mathematical Formulas
Financial math errors can be catastrophic:
// Incorrect interest calculation example
function calculateInterest(uint principal, uint rate) public pure returns (uint) {
// Missing compounding period adjustment
return principal * rate / 100;
// Should be: principal * (1 + rate/100)^time
}
- Reimplement formulas independently
- Check against academic papers (e.g., AAVE whitepaper)
- Test with extreme values (very small/large numbers)
7. Review Upgrade Mechanisms
Upgradeable contracts introduce unique risks:
- Missing storage gap in base contracts
- Unrestricted upgrade capabilities
- No rollback testing procedure
- Insufficient upgrade notice period
Case Study: The 2021 Uranium Finance hack ($50M) occurred during a poorly tested contract migration.
8. Check Cross-Chain Interactions
Bridges and multichain systems add complexity:
// Vulnerable bridge implementation
function deposit(uint amount) external {
tokens[msg.sender] += amount;
emit Deposit(msg.sender, amount);
// No actual funds locked on source chain
}
- Verify message verification (e.g., Merkle proofs)
- Check delay mechanisms for large withdrawals
- Confirm proper escrow of bridged assets
- Review guardian/validator incentive structure
9. Document Everything
Professional audits require rigorous documentation:
- Executive summary (business impact)
- Technical findings (severity, likelihood)
- Code references (line numbers, GitHub links)
- Exploit scenarios (proof-of-concept code)
- Remediation recommendations
10. Continuous Monitoring
Post-audit surveillance catches new risks:
- Watch for: Anomalous transactions, governance proposals
- Tools: Forta Network, Tenderly alerts
- Processes: Incident response plans, whitehat programs
Example: The 2023 Yearn Finance quick response prevented potential losses when monitoring detected abnormal vault activity.
Final Thoughts
Effective DeFi auditing requires both technical depth and creative thinking about attack vectors. Remember:
- Assume all components can be manipulated
- Quantify potential loss scenarios
- Stay updated on emerging attack patterns
Pro Tip: Study past hacks on rekt.news - they're the best education for aspiring auditors.