A malicious beneficiary can easily DoS the contract partially and prevent others from withdrawing ETH from the Smart Wallet.
The withdrawInheritedFunds
function distributes ETH to beneficiaries when _asset == address(0)
using a push-based approach within a loop:
When ETH is sent via .call, it triggers the recipient’s receive() or fallback() function (if implemented). If a beneficiary is a contract that reverts during ETH receipt—e.g., by explicitly calling revert(), lacking a receive() function, or running out of gas—the .call
returns success = false. The subsequent require(success, "something went wrong") then reverts the entire transaction.
This allows a single malicious or misconfigured beneficiary to prevent all beneficiaries from withdrawing ETH, as the function requires all transfers to succeed. Unlike ERC-20 transfers (which use safeTransfer and handle reverts individually), the ETH dispersal logic lacks resilience against reverting receivers, creating a DoS vulnerability. Such cases are:
Not accepting ETH
Explicit Revert
High. The beneficiaries will not be able to withdraw ETH from the contract, leaving the funds locked
Manual Review
Implement a pull-payment pattern to mitigate DoS by allowing beneficiaries to withdraw their ETH shares individually, rather than distributing funds in a single transaction. This isolates the impact of a malicious beneficiary to their own withdrawal. Suggested fix:
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.