Smart contract security checklist
7. september 2020
3 minute read
Smart contract development checklist
Here's a high-level process we recommend following while you write your smart contracts.
Check for known security issues:
- Review your contracts with Slither(opens in a new tab). It has more than 40 built-in detectors for common vulnerabilities. Run it on every check-in with new code and ensure it gets a clean report (or use triage mode to silence certain issues).
- Review your contracts with Crytic(opens in a new tab). It checks for 50 issues that Slither does not. Crytic can help your team stay on top of each other too, by easily surfacing security issues in Pull Requests on GitHub.
Consider special features of your contract:
- Are your contracts upgradeable? Review your upgradeability code for flaws with
slither-check-upgradeability(opens in a new tab) or Crytic(opens in a new tab). We've documented 17 ways upgrades can go sideways.
- Do your contracts purport to conform to ERCs? Check them with
slither-check-erc(opens in a new tab). This tool instantly identifies deviations from six common specs.
- Do you have unit tests in Truffle? Enrich them with
slither-prop(opens in a new tab). It automatically generates a robust suite of security properties for features of ERC20 based on your specific code.
- Do you integrate with 3rd party tokens? Review our token integration checklist before relying on external contracts.
Visually inspect critical security features of your code:
- Review Slither's inheritance-graph(opens in a new tab) printer. Avoid inadvertent shadowing and C3 linearization issues.
- Review Slither's function-summary(opens in a new tab) printer. It reports function visibility and access controls.
- Review Slither's vars-and-auth(opens in a new tab) printer. It reports access controls on state variables.
Document critical security properties and use automated test generators to evaluate them:
- Learn to document security properties for your code. It's tough as first, but it's the single most important activity for achieving a good outcome. It's also a prerequisite for using any of the advanced techniques in this tutorial.
- Define security properties in Solidity, for use with Echidna(opens in a new tab) and Manticore(opens in a new tab). Focus on your state machine, access controls, arithmetic operations, external interactions, and standards conformance.
- Define security properties with Slither's Python API. Focus on inheritance, variable dependencies, access controls, and other structural issues.
- Run your property tests on every commit with Crytic(opens in a new tab). Crytic can consume and evaluate security property tests so everyone on your team can easily see that they pass on GitHub. Failing tests can block commits.
Finally, be mindful of issues that automated tools cannot easily find:
- Lack of privacy: everyone else can see your transactions while they're queued in the pool
- Front running transactions
- Cryptographic operations
- Risky interactions with external DeFi components