Securify is a security scanner for Ethereum smart contracts supported by the Ethereum Foundation and ChainSecurity. The core research behind Securify was conducted at the ICE Center at ETH Zurich.
It features an extensive list of security patterns commonly found in smart contracts:
- some forms of the DAO bug (also known as reentrancy)
- locked ether
- missing input validation
- transaction ordering-dependent amount, receiver and transfer
- unhandled exceptions
- unrestricted ether flow
The project is meant to be an open platform welcoming contributions from all of the Ethereum Security Community. To suggest new patterns, to volunteer for testing or to contribute developing new patterns please get in touch through our Discord group.
- Soufflé: https://github.com/souffle-lang/souffle/releases (Securify should work with
the latest package, please raise an issue if it does not). If you cannot
install Soufflé, look at the Docker container for an alternative. Securify
will crash without the
soufflebinary. - Java 8
- A
solcbinary is required to be able to use Solidity file as input. Securify assumes that the right version is installed for the given file.solcis available here.
To build:
./gradlew jarTo run Securify on a Solidity file:
java -jar build/libs/securify-0.1.jar -fs src/test/resources/solidity/transaction-reordering.solTo run Securify on some EVM binary (produced e.g. by solc):
java -jar build/libs/securify-0.1.jar -fh src/test/resources/solidity/transaction-reordering.bin.hexTo run the tests (which use JUnit4):
./gradlew testThe installation should be simple enough on Debian derivatives, or any other platform supported by Soufflé.
For a quick demonstration which does not require Soufflé, you can use Docker.
Build the Docker image:
docker build . -t securifyRun Securify on a small example:
docker run securifyYou can change the files analyzed by specifying a volume to mount, and every
*.sol file contained will then be processed by Securify:
docker run -v $(pwd)/folder_with_solidity_files:/contracts securifyThe output is a in JSON and gives the vulnerabilities found over the files analyzed and the corresponding line numbers.
See CONTRIBUTING.md.
Join our Discord to discuss with other users.
Although Securify is regularly used to help audits at ChainSecurity, there are still bugs, including:
- the code in the fallback function is currently not analyzed. A workaround is to name this function instead.
- in some cases, a StackOverflowError exception is thrown, due to
computeBranchesbeing non tail-recursive (but recursive). In most cases, it is enough to increase the stack size using the-Xssoption ofjava, e.g.java -Xss1G -jar .... - libraries are not properly supported
- Securify research paper to be presented at ACM CCS'18 in Toronto, Canada
- TechCrunch: This smart contract scanner will ensure your token is tip-top
- Talk at EPFL in Lausanne
- Talk at Devcon3 in Cancún
- Talk at d10e in Davos
- Researchers from ETH Zürich release a free state-of-the-art security scanner for Ethereum smart contracts
- Automated security analysis of Ethereum smart contracts
- Automatically detecting the bug that froze Parity's wallets
Securify statically analyzes the EVM code of the smart contract to infer important semantic information (including control-flow and data-flow facts) about the contract. This step is fully automated using Soufflé, a scalable Datalog solver. Then, Securify checks the inferred facts to discover security violations or prove the compliance of security-relevant instructions.
The full technical details behind the Securify scanner are available in the research paper.

