Vyper's nonpayable default functions are sometimes payable
Description
Published by the National Vulnerability Database
May 19, 2023
Published to the GitHub Advisory Database
May 22, 2023
Reviewed
May 22, 2023
Last updated
Nov 8, 2023
Impact
in contracts with at least one regular nonpayable function, due to the callvalue check being inside of the selector section, it is possible to send funds to the default function by using less than 4 bytes of calldata, even if the default function is marked
nonpayable
. this applies to contracts compiled with vyper<=0.3.7.Patches
this was fixed by the removal of the global calldatasize check in vyperlang/vyper@02339df.
Workarounds
don't use nonpayable default functions
References