Skip to main content

Snyk fix: Automatic vulnerability remediation from the Snyk CLI

Written by:
Daniel Berman
Daniel Berman

October 7, 2021

0 mins read

We’re happy to announce the open beta of a brand new command in the Snyk CLI that makes finding and fixing vulnerabilities even easier than before — the snyk fix command!

The Snyk CLI is already an extremely versatile and powerful tool that is being leveraged by developers to find and fix vulnerabilities in their projects, either manually in their local development environment, or automatically, as part of a CI/CD pipeline.

Using snyk test, Snyk users can execute a scan of their project, resulting in a list of all the vulnerabilities identified. If there is an upgrade path for a dependency that fixes the vulnerability, the Snyk CLI will present these recommendations, together with all the information needed about the upgrade path and the vulnerability remediation.

The new snyk fix command, takes this up a notch by automatically applying these recommendations. This can be particularly useful for a developer looking to apply fixes quickly, as part of his local development workflow, or for those looking to automate fixing as part of their CI/CD.

Before we take a closer look, a few notes on availability and supported ecosystems:

  • The snyk fix command is in open beta and so it is possible you might encounter issues during usage.

  • Currently, only Python projects using Pip, Pipenv and Poetry are supported. More details are available in snyk fix documentation.

Let’s get started!

Set up the Snyk CLI

First thing first, make sure you’ve got the Snyk CLI installed. If you’re already familiar with the Snyk CLI and have it installed, make sure you are using version v1.715.0 or later.

Setting up the Snyk CLI is simple. You can use npm or Homebrew to quickly install it and then all that’s required is to authenticate with your Snyk account (if you haven’t already, sign up for free here):

1npm install -g snyk
2snyk auth

Your browser will open up with a request to authenticate the CLI. Go ahead and authenticate! You’re now ready to start working with the Snyk CLI to scan your projects for vulnerabilities.

Let’s give the Snyk CLI a first run and run a test. For the sake of demonstration, I’ll be using this fork of the PyGoat project:

1pip install -r requirements.txt
2snyk test
wordpress-sync/blog-snyk-fix-pygoat

As seen in the test results above, the Snyk CLI has identified 8 vulnerabilities and provides upgrade recommendations for fixing them.

So what’s next? At the bottom of the test results, the Snyk CLI is recommending we enable the brand-new snyk fix command, which leads us to our next step!

Enabling snyk fix

As mentioned at the start, the new snyk fix command is currently in open beta. To use it, you need to first enable the feature. This is done via Snyk Preview — a dedicated area within the Snyk UI that gives users access to new features that are currently in development.

Within Snyk, go to Settings then Snyk Preview. Under “Automatically apply recommended remediation in CLI”, enable snyk fix (1) and then click the Save changes button (2) to apply the change.

wordpress-sync/blog-snyk-fix-preview

Fixing vulnerabilities in your local environment

Now that we’ve enabled the new command, time to give it a try. In the CLI, enter:

1snyk fix 

The Snyk CLI automatically applies the recommended version upgrades required to fix the vulnerabilities identified, where possible, and outputs a summary of the results:

wordpress-sync/blog-snyk-fix-pygoat-fixed

In the case of our PyGoat application, 6 out of 8 vulnerabilities were fixed. Executing another scan reveals that we’re left with two issues — a Medium severity vulnerability in the Jinja2 package and an LGPLv3.0 license found in the psycopg2 package.

As a next step, you can ask the Snyk CLI to continuously monitor the project and get notified when a fix becomes available for this remaining vulnerability, or when new vulnerabilities are discovered for these dependencies. To do this, use:

1snyk monitor

Fixing vulnerabilities as part of your CI/CD

The new snyk fix command can also be used to automate fixing as part of your CI/CD pipelines. Let’s take a look at an example using GitHub Actions.

GitHub Actions was introduced by GitHub to help developers automate their workflows around continuous integration. Snyk’s set of GitHub actions provide you with an easy way to integrate Snyk into these workflows and test your projects for vulnerabilities — all as part of your automated CI/CD workflow and natively from within GitHub. Now, you can also fix vulnerabilities as part of this workflow.

Specifically, we’re going to use this action that executes the following workflow:

  • Init - to avoid incremental version upgrades, the workflow starts by checking the last commit message to avoid re-running snyk fix if the last commit was already an automated fix.

  • Security - the workflow executes snyk fix to scan for vulnerabilities and open a PR in case an upgrade path is identified.

Using the action is simple.

Snyk’s GitHub action’s use an environment variable called SNYK_TOKEN. This is your Snyk API token which you will need to retrieve before you configure the GitHub action and that can be found within the Snyk UI, on the Settings page.

wordpress-sync/blog-snyk-fix-api-token

Once you have the token simply define it as a secret in your repository’s settings under Settings | Secrets:

wordpress-sync/blog-snyk-fix-secret

You’re now ready to configure the Snyk action. In your GitHub repository, open the Actions tab and in the top-left corner click the New workflow button.

GitHub will provide you with a few templated actions based on the repository’s programming language. To configure the Snyk GitHub action, click set up a workflow yourself at the top of the page:

wordpress-sync/blog-snyk-fix-workflow

Replace the sample code with this example code (be sure to enter the name of your branches in the relevant namespaces in the configuration):

1name: Example workflow using Snyk fix
2on: pull_request
3jobs:
4    init:
5      runs-on: ubuntu-latest
6      outputs:
7        skip: ${{ steps.ci-skip-step.outputs.ci-skip }}
8        skip-not: ${{ steps.ci-skip-step.outputs.ci-skip-not }}
9      steps:
10        - uses: actions/checkout@v2
11          with:
12            fetch-depth: 0
13        - id: ci-skip-step
14          uses: mstachniuk/ci-skip@master
15          with:
16            commit-filter: 'Merge pull request'
17    security:
18      runs-on: ubuntu-latest
19      needs: init
20      if: ${{ needs.init.outputs.skip == 'false' }}
21      steps:
22        - uses: actions/checkout@master
23        - name: Run Snyk to check for vulnerabilities
24          uses: snyk/actions/python-3.8@master
25          env:
26            SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
27          with: 
28            command: fix # adding this option to run snyk fix
29            base: master    
30        - name: create a PR
31          uses: peter-evans/create-pull-request@v3
32          with:
33            base: main
34        - name: get PR info
35          run: |
36            echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
37            echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"      
38        - name: Run a multi-line script
39          run: |
40            echo Add other actions to build,
41            echo test, and deploy your project.

That’s it. Committing the new file opens a new PR that triggers the workflow and simulates automating fixing with the snyk fix command. Take a look at this workflow that illustrates all the steps:

wordpress-sync/blog-snyk-fix-steps

As defined in the workflow, a new PR is opened with the recommended fixes:

wordpress-sync/blog-snyk-fix-pr

Give snyk fix a try!

One of the reasons we introduced Snyk Preview was to give users early access to features currently in development and in beta mode. snyk fix is a great example of a new feature we’d really like to get the user community’s feedback on before officially releasing it into the wild. So give it a try and let us know what you think at: snyk-fix-feedback@snyk.io

More details on how to use the new command, what is supported and what is not supported, can be found in our snyk fix documentation.

Happy fixing!