-
Notifications
You must be signed in to change notification settings - Fork 12.1k
Test behavior of SignatureChecker against the identity precompile (0x4) #5501
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Test behavior of SignatureChecker against the identity precompile (0x4) #5501
Conversation
signer when hash starts with 28 zero bytes.
|
Need to update the commit message |
I have a question @Amxx; you write here:
But I can't see any added checks in the Solidity implementation of this PR? |
It's was decided against it for a few reasons:
Overall, 99.99% of the usage are already safe and should not bear any extra cost. The remaining 0.01% are a combination of many things, one of which is bad application design. |
…4) (OpenZeppelin#5501) Signed-off-by: Hadrien Croubois <hadrien.croubois@gmail.com>
Well, the identity precompile will become a predeploy with code probably soon in the future: https://eips.ethereum.org/EIPS/eip-7666. Thus the following line in
and
Fair. |
Wow, thanks for sharing eip-7666. That is one less "safeguard", but I'd say we likelly are still safe. I'd really like to see a vulnerable application to better understand in what case 0x4 being a valid signer of something is an issue. |
My issue here links to a recent hack due to inheriting the ERC-6492 reference implementation. That was the original trigger around this discussion. |
Thank you again for that ! Looking very quickly at https://pbs.twimg.com/media/GiByHVbacAAJQEX?format=jpg&name=4096x4096, I'm not sure I understand how 0x4 is involved here. If I was to deploy the ERC-7666 bytecode at any address that is NOT in the precompile range, using CREATE or CREATE2, and use that address instead of 0x4, wouldn't the vulnerability work just the same ? If 7666 goes through, I feel address 0x4 would be exactly the same as any such address (that has the same code deployed) ... so filterting address 0x4 (or even the range of precompile addresses) would not change anything, whould it? EDIT: I'm partially wrong, with any other address, |
Re the I mean, the vulnerability - as you correctly state - could also be exploited by any arbitrary contract returning |
IMO the actual good fix for that is to use a SenderCreator similar the one used in ERC-4337 EntryPoint |
Do you think it's worth linking this conversation or as a general code comment in the |
Maybe |
* Update ReentrancyGuardTransient documentation (OpenZeppelin#5417) * Optimize `MerkleTree` for loops by using `uint256` iterators (OpenZeppelin#5415) Co-authored-by: Ernesto García <ernestognw@gmail.com> * Update `_revokeRole` documentation in AccessControl (OpenZeppelin#5321) Co-authored-by: Ernesto García <ernestognw@gmail.com> * Merge release-v5.2 branch (OpenZeppelin#5424) Signed-off-by: Hadrien Croubois <hadrien.croubois@gmail.com> Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com> Co-authored-by: Sam Bugs <101145325+0xsambugs@users.noreply.github.com> Co-authored-by: Ernesto García <ernestognw@gmail.com> Co-authored-by: Arr00 <13561405+arr00@users.noreply.github.com> Co-authored-by: wizard <112275929+famouswizard@users.noreply.github.com> Co-authored-by: leopardracer <136604165+leopardracer@users.noreply.github.com> Co-authored-by: cairo <cairoeth@protonmail.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Francisco Giordano <fg@frang.io> Co-authored-by: Simka <0xsimka@gmail.com> Co-authored-by: Voronor <129545215+voronor@users.noreply.github.com> * Add a Calldata library with `emptyBytes` and `emptyString` functions (OpenZeppelin#5422) Co-authored-by: Ernesto García <ernestognw@gmail.com> * Update governor docs (OpenZeppelin#5420) * Add missing `Calldata`, `Bytes`, `CAIP2` and `CAIP10` API references (OpenZeppelin#5428) * Expose `_isTrustedByTarget` internally in ERC2771Forwarder (OpenZeppelin#5416) * Update LICENSE (OpenZeppelin#5434) * Refactor EnumerableSet.behavior.js for reuse in the community repo (OpenZeppelin#5441) * Replace `overriden` with `overridden` in GovernorCountingOverridable.sol (OpenZeppelin#5446) Co-authored-by: Arr00 <13561405+arr00@users.noreply.github.com> Co-authored-by: ernestognw <ernestognw@gmail.com> * Remove Unnecessary Initialisation of `_paused` (OpenZeppelin#5448) Co-authored-by: Ernesto García <ernestognw@gmail.com> * Fix Broken Docs References (OpenZeppelin#5436) * Update actions/upload-artifact action to v4 (OpenZeppelin#4826) * Remove unused `setBaseURI` tests (OpenZeppelin#5456) Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com> * Group typographical errors (OpenZeppelin#5443) Co-authored-by: futreall <86553580+futreall@users.noreply.github.com> Co-authored-by: Marco <wudmytrotest200@gmail.com> Co-authored-by: Dmitry <98899785+mdqst@users.noreply.github.com> Co-authored-by: Dmytrol <46675332+Dimitrolito@users.noreply.github.com> Co-authored-by: Noisy <125606576+donatik27@users.noreply.github.com> Co-authored-by: Danil <37103154+Danyylka@users.noreply.github.com> Co-authored-by: CrazyFrog <anna.shuraeva13@gmail.com> Co-authored-by: Bryer <0xbryer@gmail.com> Co-authored-by: Viktor Pavlik <160131789+Vikt0rPavlik@users.noreply.github.com> Co-authored-by: Skylar Ray <137945430+sky-coderay@users.noreply.github.com> Co-authored-by: Brawn <nftdropped@gmail.com> Co-authored-by: fuder.eth <139509124+vtjl10@users.noreply.github.com> Co-authored-by: FT <140458077+zeevick10@users.noreply.github.com> Co-authored-by: Ann Wagner <chant_77_swirly@icloud.com> Co-authored-by: Hopium <135053852+Hopium21@users.noreply.github.com> Co-authored-by: Arr00 <13561405+arr00@users.noreply.github.com> Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com> * Fix interface docs ordering and add missing interface (OpenZeppelin#5460) * Add a governor extension that implements a proposal guardian (OpenZeppelin#5303) Co-authored-by: Arr00 <13561405+arr00@users.noreply.github.com> Co-authored-by: Ernesto García <ernestognw@gmail.com> * Fix the CLI output of formal verification runs (OpenZeppelin#5445) * Update dependency halmos to v0.2.4 (OpenZeppelin#5461) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Use stable foundry version in CI (OpenZeppelin#5465) * Add stake management function to ERC4337Utils (OpenZeppelin#5471) * Add forum badge correct link (OpenZeppelin#5481) * SafeERC20.trySafeTransfer{,from} (OpenZeppelin#5483) * Improve promise rejections handling in hardhat/async-test-sanity.js (OpenZeppelin#5429) Co-authored-by: Arr00 <13561405+arr00@users.noreply.github.com> * Use slither v0.10.4 (OpenZeppelin#5488) * Add ERC6909 Implementation along with extensions (OpenZeppelin#5394) Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com> Co-authored-by: Ernesto García <ernestognw@gmail.com> * Rename ERC4337Utils ENTRYPOINT to ENTRYPOINT_V07 (OpenZeppelin#5472) Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com> * Add Bytes32x2Set (OpenZeppelin#5442) Co-authored-by: Ernesto García <ernestognw@gmail.com> * Add clear function to Enumerable{Set,Map} (OpenZeppelin#5486) Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com> * Make set-max-old-space-size.sh compatible with sh (OpenZeppelin#5493) Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com> * Update FUNDING.json (OpenZeppelin#5496) Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com> * Update FUNDING.json hierarchy (OpenZeppelin#5500) Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com> * Test behavior of SignatureChecker against the identity precompile (0x4) (OpenZeppelin#5501) * Treat code-size warnings as errors (OpenZeppelin#5101) Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com> * Make `TimelockController` receive function virtual (OpenZeppelin#5506) Co-authored-by: Arr00 <13561405+arr00@users.noreply.github.com> Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com> --------- Signed-off-by: Hadrien Croubois <hadrien.croubois@gmail.com> Co-authored-by: Ernesto García <ernestognw@gmail.com> Co-authored-by: Michael <20623991+heueristik@users.noreply.github.com> Co-authored-by: Maks <soskapola96@gmail.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com> Co-authored-by: Sam Bugs <101145325+0xsambugs@users.noreply.github.com> Co-authored-by: Arr00 <13561405+arr00@users.noreply.github.com> Co-authored-by: wizard <112275929+famouswizard@users.noreply.github.com> Co-authored-by: leopardracer <136604165+leopardracer@users.noreply.github.com> Co-authored-by: cairo <cairoeth@protonmail.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Francisco Giordano <fg@frang.io> Co-authored-by: Simka <0xsimka@gmail.com> Co-authored-by: Voronor <129545215+voronor@users.noreply.github.com> Co-authored-by: Eric Lau <ericglau@outlook.com> Co-authored-by: planetBoy <140164174+Guayaba221@users.noreply.github.com> Co-authored-by: sudo rm -rf --no-preserve-root / <pcaversaccio@users.noreply.github.com> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Renan Souza <renan.rodrigues.souza1@gmail.com> Co-authored-by: futreall <86553580+futreall@users.noreply.github.com> Co-authored-by: Marco <wudmytrotest200@gmail.com> Co-authored-by: Dmitry <98899785+mdqst@users.noreply.github.com> Co-authored-by: Dmytrol <46675332+Dimitrolito@users.noreply.github.com> Co-authored-by: Noisy <125606576+donatik27@users.noreply.github.com> Co-authored-by: Danil <37103154+Danyylka@users.noreply.github.com> Co-authored-by: CrazyFrog <anna.shuraeva13@gmail.com> Co-authored-by: Bryer <0xbryer@gmail.com> Co-authored-by: Viktor Pavlik <160131789+Vikt0rPavlik@users.noreply.github.com> Co-authored-by: Skylar Ray <137945430+sky-coderay@users.noreply.github.com> Co-authored-by: Brawn <nftdropped@gmail.com> Co-authored-by: fuder.eth <139509124+vtjl10@users.noreply.github.com> Co-authored-by: FT <140458077+zeevick10@users.noreply.github.com> Co-authored-by: Ann Wagner <chant_77_swirly@icloud.com> Co-authored-by: Hopium <135053852+Hopium21@users.noreply.github.com> Co-authored-by: Yan Victor SN <98413246+YanVictorSN@users.noreply.github.com> Co-authored-by: Ursula <asp_woods_34@icloud.com> Co-authored-by: Michalis Kargakis <kargakis@protonmail.com> Co-authored-by: luca <80516439+xdaluca@users.noreply.github.com> Co-authored-by: Jonas <43515441+JSeiferth@users.noreply.github.com> Co-authored-by: Joseph Delong <joseph@delong.me>
The identity precompiles, at address 0x4, is potentially dangerous when targeted by ERC1271 checks. The returned bytes contains starts with the function selector, which is exaclty the 4 bytes that are expected.
The current implementation (as of 5.2) checks the that the first 32 bytes of the returned value contain the selector followed by 28 bytes of zeros. This is what a valid ERC-1271 wallet would return when the call is successfull.
In the case of the identity precompile, the first 32 bytes of the returned value contain the selector followed by the first 28 bytes of the hash being verified. That means that unless the first 28 bytes of the hash are all zero, the precompile issue will not affect this library.
I real-life applications, the
hash
is actually the return of a hashing function. As a consequence, having 28 bytes of zeros is basically impossible, and the implmentation is not vulnerable.However we cannot rule the case where some application decides the use a hash that is not an ERC-191 or ERC-712 hash, and is not produced by a hashing function. For this extermelly unlikelly case, we add an additional check that signer is not address(0x4).
PR Checklist
npx changeset add
)