By Dominik Muhs | Tuesday, February 4th, 2020
In the second part of this series on continuous integration, we will build an easy first integration of the MythX API into the Travis continuous integration platform.
Other posts in this series:
- Part 1: CircleCI
- Part 2: Travis
- Part 3: (Coming soon)
This three-part series is about integrating MythX into Continuous Integration systems. In the first part of this series I have shown how to automatically check for smart contract vulnerabilities in CircleCI. In this part we will take a look at another popular open-source CI system: Travis.
Similar to CircleCI, Travis is configured using a YAML file. This time it is located in the project’s root directory as
.travis.yml. The basic concepts of Travis are slightly different from other solutions, however. This greatly simplifies build definitions and job descriptions. This will work in our advantage here.
The tl;dr is that Travis has stages. Each stage consists of multiple jobs that are executed in parallel. These jobs can be grouped into builds. One of these builds will be a collection of jobs that do the MythX security analysis steps.
Sounds complicated? Once we dive into the actual configuration it will turn out to be really easy. But do not trust me, read on!
The basic setup
We will again use Python to run the MythX CLI for all our analysis needs. In the previous post we had to use a virtual environment to isolate our dependencies. In Travis we will rely on a dedicated stage that runs in parallel to all the other things we want to do. So we don’t have to isolate our dependencies. Absolute freedom!
Let’s start writing our configuration file and specify the Python version to use:
language: python python: - 3.7
Before the magic starts we need to install the MythX CLI. We do this in the install phase – before any further steps are executed:
install: - pip3 install mythx-cli
Spoiler: This line is also how you would install the MythX CLI on your machine as well (with an optional
--user added into the mix.)
Submitting to MythX
Now for the analysis magic of submitting our smart contracts to MythX and making the build fail in case anything bad is found:
script: - mythx --ci --yes analyze --solc-version 0.5.0 contracts/
And that’s it. To dissect the
mythx command a bit further:
--citells the MythX CLI to return
1if a medium or high severity issue has been found.
--yesdisables the confirmation prompt asking the user whether they really want to submit the Solidity files.
analyzeis the subcommand that tells the CLI we want to send an analysis job to the MythX API.
--solc-versiondefines (you guessed it) the Solidity compiler version to compile the given files with.
contracts/is the directory the smart contracts live in. The MythX CLI will walk through this directory recursively and prepare analysis requests for each
.solfile that has been found.
By default the CLI submits scans in
quick mode. These return after roughly 120 seconds. So our complete Travis CI configuration file is short and sweet:
language: python python: - 3.7 install: - pip3 install mythx-cli script: - mythx --ci --yes analyze --solc-version 0.5.0 contracts/
I have prepared a test repository with a vulnerable smart contract and connected it to Travis with the above configuration. As soon as the CI job is finished, the following output appears:
The CI check has failed and notified me of a vulnerability. Now I want to know exactly how to trigger it so I can write a test case and validate my fix.
The benefit of signing up for an account on the MythX website (adding my API token to the CI’s environment as
MYTHX_ACCESS_TOKEN) is that all my CI analyses are directly attached to my account and I can retrieve them later.
In the MythX dashboard I find my submission:
Diving into it, I see the vulnerability overview that was displayed in my CI output again:
Scrolling down, I see that my code has been highlighted with the vulnerability locations:
For each vulnerability I also have the test case data at my fingertips. Nice!
With the click of a button I can copy the raw transaction data and easily bootstrap my Truffle test cases. This helps me to validate the fix in my code and avoid the issue from occurring in the future.
The MythX CLI is continuously improving (CI jokes, hah!). I have written exhaustive documentation and a usage guide, which allows for more advanced patterns such as blacklisting vulnerabilities, opening custom analysis groups, delivering results in various output formats, and much more.
Do you want to store your reports as artifact files attached to the CI job? Just add the
-o parameter and configure the path in Travis.
As always, feedback is a gift, and a comment here or directly in the GitHub repository would be greatly appreciated.
Next up, we will generalize our CI approach in part three. Stay tuned!