19

Is there a tool, checklist of methodology to help reviewing smart contract security?

E.g. for each of function you review

  • Is there re-entry possibility and how it behaves on re-entry

  • How it behaves if loops run out of gas

  • How it behaves if stack limit is reaches

... and so on.

If no such tool is available is there a good source or list for all known failure modes of Ethereum smart contract security?

17

This is the community wiki (no reputation) answer for possible attacks and how to protect against them. Feel free to update the list. If your contract functions have characteristics matching prerequisites carefully evaluate your function against given advice.

This is the list of potential attacks or mispractices enabling those attacks only. For additional resources for smart contract programming best practices see Resources link at the end of the answer.

Correct use of function visibility modifiers

Internal functions are marked as such and only the proper author can call the function.

Please see The Parity Wallet Hack Explained.

Call stack attack

Synonyms: Shallow stack attack, stack attack

Prerequisites: Functions uses send() or call()

Invoking: The attacker manipulates cross-contract call stack to call() to fail by calling contract with stack of 1023.

Protection: Always check return value of a send() and call(). Prefer someAddress.send() over someAddress.call.value()

More info

Re-entrancy attack

Synonyms: Race condition

Prerequisites: Functions uses send() or call()

Invoking: The untrusted called contract calls the same function back, having it in unexpected state. This is how TheDAO was hacked.The attack can be chained over several of functions (cross function race condition).

Protection: Make sure internal state and balance updates in the function are done before call() or send()

More info

DoS with unexpectd throw

Prerequisites: Functions uses send() or call() with throw following on fail

Invoking: The attacker manipulates the contract state so that send() always fails (e.g. refund)

Protection: Prefer pull payment system over send()

More info

Malicious libraries

Prerequisites: Using an external contract as a library and obtaining it through the registry.

Invoking: Call another contract function through a contract registry (see library keyword in Solidity).

Protection: Ensure no dynamic parts which can be swapped out in future versions.

Integer overflow

Prerequisites: Function accepts an uint argument with is used in math

Invoking: Sending very big or very negative integer causing the sum calculation to overflow

Protection: Always check the order of values when doing math operations. E.g. https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol

More info

Integer division round down

Prerequisites: Payment logic requires division operator /

Invoking: Programmer's error

Protection: Be aware that divisions are always rounded down

Loop length and gas manipulation

Others: Allocating too small int for arrays

Prerequisites: Any loop, copy arrays or strings inside the storage. A for loop where contract users can increase the length of the loop. Consider voting scenario loops.

Invoking: The attacker increases the array length or manipulates block gas limit

Protection: Use pull style payment systems. Spread send() over multiple transactions and check msg.gas limit.

Fallback function consuming more than the limit of 2300 gas

Prerequisites: A Solidity contract with catch all function() { } to receive generic sends

Invoking: Programmer's error

Protection: 100% test coverage. Make sure your fallback function stays below 2300 gas. Check for all branches of the function using test suite. Don't store anything in fallback function. Don't call contracts or send ethers in fallback function.

More info:

Forced balance update

Prerequisites: Function reads contract total balance and has some logic depending on it

Invoking: selfdestruct(contractaddress) can forcible upgrade its balance

Protection: Don't trust this.balance to stay within given limits

More

Transaction-Ordering Dependence

Synonym: TOD

Prerequisites: A bid style market

Invoking: The attacker sees transactions in mempool before they are finalized in blockchain

Protection: Pre-commit schemes

More

Resources

1

Devcon2: Smart Contract Security Speakers: Christoph Jentzsch

After a quick overview of smart contract failures in the past, a list of important takeaways will be covered. Some coding techniques to prevent unexpected behaviour in smart contracts will be covered as well as some remarks about governance in decentralized systems.

Youtube Link

Another one;

Researchers from National University of Singapore will soon release a tool that will help ethereum users determine whether the smart contracts they've coded are valid or not.

This is the whitepaper link

Source Coindesk.

  • Devcon 2 came and go. Did anything good come out of this? – Mikko Ohtamaa Sep 26 '16 at 13:23

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.