From the solidity documentation: https://docs.soliditylang.org/en/v0.8.17/abi-spec.html?highlight=collisions#non-standard-packed-mode > If you use (abi.encodePacked(a, b))
and both a
and b
are dynamic types, it is easy to craft collisions in the hash value by moving parts of a
into b
and vice-versa. More specifically, abi.encodePacked("a", "bc") == abi.encodePacked("ab", "c")
.
The issue is in these lines of code:
As the solidity docs describe, two or more dynamic types are passed to abi.encodePacked
. Moreover, these dynamic values are user-specified function arguments in external functions, meaning anyone can directly specify the value of these arguments when calling the function
function uri(uint256 _id) public view virtual override returns (string memory) {
return string(abi.encodePacked(_uri, Strings.toString(_id)));
}
Instead of writing functions to accept several arguments that are hashed inside the function, consider rewriting the function to take the hashed value as a function argument directly so that the hashing process happens off-chain. This approach would solve the issue and save gas.
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.