Omniscia 0xPhase Audit
Manager Manual Review Findings
Manager Manual Review Findings
MRE-01M: Unsafe Length Cast
Type | Severity | Location |
---|---|---|
Mathematical Operations | Manager.sol:L43 |
Description:
The Manager::batchCall
function will fail to encode a call result that is greater than type(uint32).max
in length as it will downcast the length
member unsafely.
Impact:
While a call containing a result output greater than type(uint32).max
in length is infeasible in traditional blockchains, it would still cause the code to corrupt its encoded result thus potentially affecting what the result of consequent calls would supposedly be.
Example:
36bytes memory callResult = CallLib.callFunc(37 target,38 data[offset:offset + callDataLength],39 value40);41
42offset += callDataLength;43result = abi.encodePacked(result, uint32(callResult.length), callResult);
Recommendation:
We advise the code to perform a safe casting operation from uint256
to uint32
by ensuring that callResult.length
is less-than-or-equal-to the maximum value a uint32
data type can hold (i.e. type(uint32).max
).
To note, Solidity's built-in safe arithmetic in pragma
versions 0.8.X
onwards does not cover casting operations.
Alleviation (3dd3d7bf0c2693b2f9c23bacedfa420393f7ea84):
The 0xPhase team opted to instead yield an overflow message whenever the callResult
length exceeded the maximum of a uint32
variable, appending it to the result
sequence. Given that a casting overflow is no longer possible, we consider this exhibit adequately alleviated.