Solidity Storage Array Bug Announcement
This weblog submit is about two bugs linked to storage arrays that are in any other case unrelated. Each have been current within the compiler for a very long time and have solely been found now though a contract containing them ought to very doubtless present malfunctions in exams.
Daenam Kim with assist from Nguyen Pham, each from Curvegrid found a problem the place invalid information is saved in reference to arrays of signed integers.
This bug has been current since Solidity 0.4.7 and we contemplate it the extra severe of the 2. If these arrays use destructive integers in a sure scenario, it’s going to trigger information corruption and thus the bug ought to be simple to detect.
By the Ethereum bug bounty program, we acquired a report a couple of flaw inside the new experimental ABI encoder (known as ABIEncoderV2). The brand new ABI encoder remains to be marked as experimental, however we nonetheless assume that this deserves a outstanding announcement since it’s already used on mainnet.
Credit to Ming Chuan Lin (of https://www.secondstate.io) for each discovering and fixing the bug!
The 0.5.10 release comprises the fixes to the bugs.
In the mean time, we don’t plan to publish a repair to the legacy 0.4.x sequence of Solidity, however we’d if there’s in style demand.
Each bugs ought to be simply seen in exams that contact the related code paths.
Particulars in regards to the two bugs may be discovered beneath.
Signed Integer Array Bug
Who ought to be involved
When you’ve got deployed contracts which use signed integer arrays in storage and both instantly assign
- a literal array with a minimum of one destructive worth in it (x = [-1, -2, -3];) or
- an present array of a totally different signed integer sort
to it, this can result in information corruption within the storage array.
Contracts that solely assign particular person array components (i.e. with x[2] = -1;) usually are not affected.
test if contract is susceptible
If you happen to use signed integer arrays in storage, attempt to run exams the place you employ destructive values. The impact ought to be that the precise worth saved is optimistic as an alternative of destructive.
When you’ve got a contract that meets these situations, and need to confirm whether or not the contract is certainly susceptible, you may attain out to us through security@ethereum.org.
Technical particulars
Storage arrays may be assigned from arrays of various sort. Throughout this copy and task operation, a kind conversion is carried out on every of the weather. Along with the conversion, particularly if the signed integer sort is shorter than 256 bits, sure bits of the worth need to be zeroed out in preparation for storing a number of values in the identical storage slot.
Which bits to zero out was incorrectly decided from the supply and never the goal sort. This results in too many bits being zeroed out. Particularly, the signal bit can be zero which makes the worth optimistic.
ABIEncoderV2 Array Bug
Who ought to be involved
When you’ve got deployed contracts which use the experimental ABI encoder V2, then these could be affected. Because of this solely contracts which use the next directive inside the supply code may be affected:
pragma experimental ABIEncoderV2;
Moreover, there are a selection of necessities for the bug to set off. See technical particulars additional beneath for extra info.
test if contract is susceptible
The bug solely manifests itself when all the following situations are met:
- Storage information involving arrays or structs is distributed on to an exterior perform name, to abi.encode or to occasion information with out prior task to a neighborhood (reminiscence) variable AND
- this information both comprises an array of structs or an array of statically-sized arrays (i.e. a minimum of two-dimensional).
Along with that, within the following scenario, your code is NOT affected:
- when you solely return such information and don’t use it in abi.encode, exterior calls or occasion information.
Attainable penalties
Naturally, any bug can have wildly various penalties relying on this system management circulate, however we count on that that is extra more likely to result in malfunction than exploitability.
The bug, when triggered, will beneath sure circumstances ship corrupt parameters on technique invocations to different contracts.
Technical particulars
Throughout the encoding course of, the experimental ABI encoder doesn’t correctly advance to the subsequent aspect in an array in case the weather occupy greater than a single slot in storage.
That is solely the case for components which are structs or statically-sized arrays. Arrays of dynamically-sized arrays or of elementary datatypes usually are not affected.
The particular impact you will note is that information is “shifted” within the encoded array: When you’ve got an array of sort uint[2][] and it comprises the info
[[1, 2], [3, 4], [5, 6]], then it will likely be encoded as [[1, 2], [2, 3], [3, 4]] as a result of the encoder solely advances by a single slot between components as an alternative of two.
This submit was collectively composed by @axic, @chriseth, @holiman