Signature Malleability 2
Ну, и еще одна уязвимость от того же автора из Твиттер.
Посмотрите на скрин. Вероятно, вы видели или сами реализовывали такое восстановление подписи у себя в контракте.
Но тут чего-то не хватает?
А точнее, тут не хватает валидации S значения!
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 ) {
return (address(0), RecoverError.InvalidSignatureS);
}
Если открыть контракт от OpenZeppelin, то там увидите довольно большой комментарий, зачем нужна проверка этого значения.
Из-за особенностей работы системы, сюда вы можете передать две разные подписи (с одинаковым подписанным сообщением) и получить один и тот же восстановленный адрес!
В этой ветке дается объяснения почему это происходит, и как это связано с EIP2 и secp256k1n/2. Спойлер: особенности шифрования.
Как я понял, вообще нужно быть очень аккуратными и внимательными с этими подписями и их восстановлением.
#security #signature #eip2
Post #596
302

- 👍 1