Below a curated collection of my most relevant contributions to Web3 security: public contests and private audits whose clients kindly agreed to share reports publicly.
- 10/24 Kakarot (L2 - Cairo0) - 🏅1st place in team RadiantLabs, report
- 8/24 Reserve Core (DeFi - Go) - 🏅1st place in team RadiantLabs, report
- 7/24 Optimism Superchain (L2 - Solidity) - 🏅1st place in team RadiantLabs, report
- 5/24 Canto (Cosmos SDK - Go) on Code4rena - winnings forfeited for judging:
- 4/24 Renzo (Restaking - Solidity) on Code4rena - 🏅1st place in team LessDupes, report
- 12/23 Ethereum Credit Guild (Staking app - Solidity) on Code4rena - 7th place:
- Double-counting of reward realization in ERC20RebaseDistributor self-transfers exposes distribution funds to theft and insolvency
- Updates to "creditMultiplier" can prevent bidding to pre-existing loan auctions
- Newly created lending markets can be bricked by burning credit tokens
- New distributions create unwanted fat-tail dilution of previous distributions
- Rounding errors can cause ERC20RebaseDistributor transfers and mints to fail for underflow
- ProfitManager's "creditMultiplier" calculation does not count undistributed rewards; this can cause value losses to users
- 11/23 usemoon.ai (Wallet backend - TypeScript/Go) private audit in solo: report
- 10/23 Party Protocol (Governance app - Solidity) on Code4rena - 🥉3rd place:
- A host can abuse "abdicateHost" to inflate arbitrarily the number of hosts that voted a proposal
- ETHCrowdfundBase.delegationsByContributor can be manipulated via zero-value front-running donations
- PartyGovernanceNFT advertises but does not honor the ERC-4906 standard
- PartyGovernanceNFT.rageQuit burns tokens without honoring minWithdrawAmounts when amounts to be transferred are zero
- ETH Crowdfunds that aim at raising exact amounts and require a minimum contribution can be bricked
- QA report
- 9/23 Maia DAO Ulysses (LayerZero app - Solidity) on Code4rena - 4th place:
- Permissionless VirtualAccount.payableCall enables direct theft of assets
- Several instances of assumptions on LayerZero refundee can lead to refunded tokens being permanently locked
- Unused native tokens airdropped to RootBridgeAgent and BranchBridgeAgent are exposed to theft
- Messages under-funded in remote gas temporarily halt Agents' communication via LayerZero
- Incorrect source address decoding in RootBridgeAgent and BranchBridgeAgent’s _requiresEndpoint breaks LayerZero communication
- QA report
- 8/23 GoodEntry (Uniswap V3 app - Solidity) on Code4rena - 🏅1st place:
- TokenisableRange's incorrect accounting of non-reinvested fees in "deposit" exposes the fees to a flash-loan attack
- V3Proxy swapTokensForExactETH does not send back to the caller the unused input tokens
- Incorrect Solidity version in FullMath.sol can cause permanent freezing of assets for arithmetic underflow-induced revert
- New from fees rework: fees can still be stolen with a flash-loan on GeVault
- : Incorrect boundaries check in GeVault's "getActiveTickIndex" can temporarily freeze assets due to Index out of bounds error
- V3 Proxy does not send funds to the recipient, instead it sends to the msg.sender
- User can steal refunded underlying tokens from initRange operation inside RangeManager
- Transaction origin check in ROE Markets make Options positions opened by contract users impossible to reduce or close
- UniswapV3 trading fees are always locked in treasury instead of going back to the protocol users through GeVault
- QA report
- 6/23 Canto (Cosmos SDK - Go) on Code4rena - 🥉3rd place:
- 2023-10-26 Testing for audits: there is no spoon