Upgrade signature validation#
Medium Risk
Fixed
Fixed according to the recommendation.
This is the code in OrderValidator.sol that validates signatures:
bytes32 hash = LibOrder.hash(order);
if (_hashTypedDataV4(hash).recover(signature) != order.maker) {
if (order.maker.isContract()) {
require(
ERC1271(order.maker).isValidSignature(_hashTypedDataV4(hash), signature) == MAGICVALUE,
"contract order signature verification error"
);
} else {
revert("order signature verification error");
}
}
recover
reverts internally so isValidSignature
can't be called#
A problem with this code is that the recover()
function reverts internally if it determines a signature to be invalid.
It is possible for ERC1271(order.maker).isValidSignature
to validate a signature differently. What may be valid for ERC1271(order.maker).isValidSignature
may not be valid for recover
.
But ERC1271(order.maker).isValidSignature
will never get a chance to validate signatures if recover
reverts.
recover
does not support short signatures#
The recover
function comes from LibSignature.sol
which is coped from ECDSAUpgradeable.sol#release-v4.3, which is an older version that does not support short signatures.
Current versions of recover
in ECDSAUpgradeable.sol
from OpenZeppelin support short signatures.
Recommendation#
Delete LibSignature.sol
and use the isValidSignatureNow
function from SignatureCheckerUpgradeable.sol instead.
The isValidSignatureNow
function combines the recover
and isValidSignature
function calls into a single function call in a way that solves Item 1 and Item 2 mentioned above.
The code could look like this:
At the top of the OrderValidate.sol
file import SignatureCheckerUpgradeable
: