Skip to main content

Aproveite ao máximo o snyk test com JSON

Escrito por
Headshot of Tim Kadlec

Tim Kadlec

29 de junho de 2017

0 minutos de leitura

A execução de snyk test verifica as dependências do seu aplicativo e testa se alguma delas contém vulnerabilidades conhecidas. Se forem encontradas vulnerabilidades, o comando retornará um erro e exibirá no console informações sobre elas e como corrigi-las.

Ele funciona muito bem em um ambiente de CI e fornece muitas informações úteis para você tomar medidas. Mas, às vezes, você pode querer ir além: manipular os resultados dos testes de alguma forma ou criar um relatório local fácil de compartilhar. É aí que entra a opção --json, que gera em JSON os resultados de snyk test.

Vamos mostrar algumas coisas que você pode fazer usando snyk test --json e ferramentas gratuitas.

A opção JSON

A execução de snyk test --json gera um objeto JSON com informações úteis e básicas sobre o seu projeto. Este é o formato básico desse objeto atualmente:

{
  "ok": false,
  "vulnerabilities": [...],
  "dependencyCount": 72,
  "org": "myOrg",
  "licensesPolicy": null,
  "isPrivate": true,
  "packageManager": "rubygems",
  "summary": "2 vulnerable dependency paths",
  "filtered": {
    "ignore": [],
    "patch": []
  },
  "uniqueCount": 1
}

Além disso, vulnerabilities contém informações detalhadas sobre cada vulnerabilidade encontrada:

{
    "title": "",
    "credit": [],
    "description": "",
    "moduleName": "",
    "language": "",
    "packageManager": "",
    "semver": {
      "unaffected": [],
      "vulnerable": []
    },
    "identifiers": {
      "CWE": [],
      "CVE": []
    },
    "CVSSv3": "",
    "severity": "",
    "creationTime": "",
    "modificationTime": "",
    "publicationTime": "",
    "disclosureTime": "",
    "id": "",
    "packageName": "",
    "from": [],
    "upgradePath": [],
    "version": "",
    "name": "",
    "isUpgradable": false,
    "isPatchable": false
 }

Com todas essas informações, você pode personalizar os resultados do Snyk test de várias maneiras.

Ordenação personalizada de vulnerabilidades

Por padrão, snyk test informa as vulnerabilidades na ordem em que são encontradas na árvore de dependências gerada.

Você pode usar várias ferramentas para ajustar e reordenar os resultados, mas vamos usar o jq. O jq é um processador de JSON de linha de comando. Com ele, você pode direcionar dados JSON, filtrá-los e, em seguida, direcionar os dados resultantes para a saída.

Com o jq, você pode ordenar os resultados como quiser. Por exemplo, é possível ordenar as vulnerabilidades pela data de publicação, para que as mais recentes apareçam primeiro.

snyk test --json | jq '.vulnerabilities |= sort_by(.publicationTime) | .vulnerabilities |= reverse'

Com mais algumas linhas, você também pode ordenar as vulnerabilidades por gravidade, para que as mais críticas apareçam primeiro.

snyk test --json | jq '.vulnerabilities|= map(. + {severity_numeric: (if(.severity) == "high" then 1 else (if(.severity) == "medium" then 2 else (if(.severity) == "low" then 3 else 4 end) end) end)}) |.vulnerabilities |= sort_by(.severity_numeric) | del(.vulnerabilities[].severity_numeric)'

Gravidade personalizada para vulnerabilidades

Você também pode usar o jq para alterar a gravidade de uma vulnerabilidade que, por algum motivo, deveria ter uma classificação diferente daquela definida pelo Snyk.

Por exemplo, talvez seu site dependa de uma versão do Nokogiri que contém uma vulnerabilidade de execução arbitrária de código de alta gravidade, mas sua equipe concluiu que a forma como o Nokogiri é usado torna o problema menos grave. Você pode usar o jq para alterar a gravidade da vulnerabilidade nos relatórios.

snyk test --json | jq '. | (.vulnerabilities[] | select(.id == "SNYK-RUBY-NOKOGIRI-20367").severity |= "low")

Gere um relatório HTML local

O painel online do seu projeto detalha cada vulnerabilidade: gravidade, descrição, caminhos vulneráveis e muito mais. Se quiser uma cópia local baseada nos resultados de snyk test, use o Snyk JSON to HTML Mapper, nossa ferramenta de código aberto.

O mapper recebe snyk test --json e gera um relatório HTML local sem recursos externos. Para usá-lo, instale-o globalmente com npm install -g snyk-to-html. Depois, ao executar o comando test, você pode direcionar os resultados diretamente para o módulo, assim:

snyk test --json | snyk-to-html -o results.html

O comando acima cria um relatório local com um belo estilo, sem dependências externas.

Relatório do Snyk test mostrando uma vulnerabilidade de alta gravidade de entidade externa XML na dependência Nokogiri, com caminhos, detalhes, correção e referências.

Se você estiver personalizando a saída JSON com jq, também poderá direcionar os resultados alterados. Por exemplo, o comando a seguir gera um relatório HTML local com as vulnerabilidades ordenadas pela data de publicação.

snyk test --json | jq '.vulnerabilities |= sort_by(.publicationTime) | .vulnerabilities |= reverse' | snyk-to-html -o results.html

Relatórios personalizados com JSON

A execução de snyk test por si só já fornece muitas informações úteis. Se você precisar de um pouco mais de flexibilidade, snyk test --json resolve. Com algumas ferramentas gratuitas e um pouco de criatividade, você pode personalizar os resultados do Snyk para atender às suas necessidades.

Se você usa a saída JSON para criar relatórios ou funcionalidades personalizadas, conte para a gente. Adoraríamos saber o que você criou!

Comece a jogar Capture the Flag

Aprenda a resolver desafios de Capture the Flag assistindo sob demanda ao nosso workshop virtual introdutório.