Solidity storage array bug announcement
This weblog publish is about two bugs associated to storage arrays which might be in any other case unrelated. Each have been in compilers for a very long time, they usually’ve solely now been found, despite the fact that a contract containing them would very seemingly present misbehavior in testing.
Kim Den Nam with the assistance of Nguyen Phamfrom each curve grid I discovered a problem associated to arrays of signed integers the place invalid knowledge is saved.
This bug has been round since Solidity 0.4.7 and I think about it the extra critical of the 2. The bug is straightforward to detect as a result of these arrays corrupt knowledge after they use unfavorable integers in sure conditions.
Via the Ethereum bug bounty program, we acquired a report a couple of flaw in a brand new experimental ABI encoder (referred to as ABIEncoderV2). The brand new ABI encoder continues to be marked as experimental, however since it’s already in use on mainnet, we consider it deserves a distinguished announcement. Ming Chuan Lin (credit score to) https://www.secondstate.io) for each discovering and fixing bugs!
of 0.5.10 launch Accommodates bug fixes. Right now, we have now no plans to publish a repair for the legacy 0.4.x collection of Solidity, however we could accomplish that if there may be basic demand.
Each bugs ought to be simply seen with exams that contact the related code paths.
See under for particulars on the 2 bugs.
Signed integer array bug
who ought to care
If you happen to increase a contract that makes use of a signed integer array in storage and assign it instantly
- A literal array containing no less than one unfavorable worth (×= [-1, -2, -3];) Additionally
- an present array of totally different signed integer kind
This can result in knowledge corruption within the storage array.
A contract to allocate solely particular person array components (i.e. X[2] = -1;) is unaffected.
The right way to verify if a contract is weak
If you happen to use signed integer arrays for storage, attempt working exams utilizing unfavorable values. Because of this, the precise worth saved is constructive as a substitute of unfavorable.
In case you have a contract that meets these situations and wish to verify whether it is truly weak, safety@ethereum.org.
technical particulars
Storage arrays could be allotted from several types of arrays. Sort conversions are carried out on every factor throughout this copy and task operation. Along with the conversion, sure bits of the worth should be zeroed out in preparation for storing a number of values in the identical storage slot, particularly if the signed integer kind is shorter than 256 bits.
Which bits to zero was incorrectly decided from the supply as a substitute of the goal kind. This causes too many bits to be zeroed. Specifically, the signal bit turns into zero, making the worth constructive.
ABIEncoderV2 array bug
who ought to care
In case you have deployed contracts that use the experimental ABI encoder V2, they could be affected. Because of this solely contracts that use the next directives of their supply code could also be affected.
pragma experimental ABIEncoderV2;
Moreover, there are some necessities for bugs to be triggered. For extra info, see the technical particulars under.
The right way to verify if a contract is weak
This bug solely seems when all the following situations are met:
- Storage knowledge, together with arrays or buildings, is distributed on to exterior operate calls. abi.encode or AND to occasion knowledge with out pre-allocation to native (reminiscence) variables
- This knowledge could be an array of buildings or an array of static measurement (that’s, no less than two dimensions).
Along with that, your code is unaffected within the following conditions:
- If you happen to solely return such knowledge and do not use it abi.encodeexterior name or occasion knowledge.
Attainable end result
Naturally, bugs can have totally different penalties relying on this system’s management move, however we might anticipate this to be extra more likely to result in malfunction than exploitability.
When the bug is triggered, beneath sure circumstances, methodology calls ship corrupted parameters to different contracts.
technical particulars
In the course of the encoding course of, if a component occupies a number of slots in storage, the experimental ABI encoder doesn’t correctly advance to the subsequent factor within the array.
That is just for components which might be buildings or static-sized arrays. Dynamically sized arrays or arrays of primary knowledge varieties aren’t affected.
The actual impact you see is that the information is “shifted” within the encoded array.In case you have an array of kind unit[2][] accommodates knowledge
[[1, 2], [3, 4], [5, 6]]is encoded as [[1, 2], [2, 3], [3, 4]] It is because the encoder solely advances one slot between components as a substitute of two.
This publish was co-authored by @axic, @chriseth and @holiman.