Skip to main content

snyk testとJSONを最大限に活用する

著者
Headshot of Tim Kadlec

Tim Kadlec

2017年6月29日

0 分で読めます

snyk testを実行すると、アプリケーションの依存関係をスキャンし、既知の脆弱性が含まれていないかをテストします。脆弱性が見つかった場合、コマンドはエラーを返し、脆弱性の情報と対処方法をコンソールに出力します。

CI環境で非常に便利で、実用的な情報を豊富に得られます。ただし、テスト結果を加工したり、簡単に共有できるローカルレポートを作成したりするなど、さらに活用したい場合もあるでしょう。そこで役立つのが、--jsonオプションです(snyk testの結果をJSONで出力します)。

ここでは、snyk test --jsonと無料で利用できるツールを使って実現できることをいくつかご紹介します。

JSONオプション

snyk test --jsonを実行すると、プロジェクトに関する基本的で有用な情報を含むJSONオブジェクトが出力されます。現在の基本的なオブジェクト形式は次のとおりです。

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

さらに、vulnerabilitiesには、検出された各脆弱性の詳細情報が含まれています。

{
    "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
 }

これらの情報を活用すれば、Snykのテスト結果をさまざまな方法でカスタマイズできます。

脆弱性を任意の順序で並べ替える

デフォルトでは、snyk testは、生成された依存関係ツリーをたどって検出した順に脆弱性を報告します。

結果を加工して並べ替えるためのツールはいくつかありますが、ここではjqを使います。jqはコマンドラインのJSONプロセッサです。JSONデータをパイプで渡してフィルタリングし、処理後のデータを再びパイプで出力できます。

jqを使えば、好きな方法で結果を並べ替えられます。たとえば、脆弱性を公開日で並べ替えて、新しいものから表示できます。

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

さらに数行追加すれば、脆弱性を深刻度で並べ替えて、最も重大なものから表示することもできます。

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)'

脆弱性の深刻度をカスタマイズする

jqを使って、何らかの理由でSnykが設定した深刻度と異なる深刻度にしたい脆弱性の評価を変更することもできます。

たとえば、サイトが依存しているNokogiriのバージョンに、深刻度の高い任意コード実行の脆弱性が含まれているとします。しかし、チームで検討した結果、Nokogiriの使い方を踏まえると問題の深刻度はそれほど高くないと判断するかもしれません。その場合、jqを使ってレポート内の脆弱性の深刻度を変更できます。

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

ローカルHTMLレポートを生成する

プロジェクトのオンラインダッシュボードには、各脆弱性の深刻度、説明、脆弱なパスなど、詳細情報が表示されます。snyk testの結果をもとにローカルコピーを作成するには、オープンソースのSnyk JSON to HTML Mapperを利用できます。

このMapperはsnyk test --jsonを受け取り、外部リソースを使わずにローカルHTMLレポートを生成します。利用するには、npm install -g snyk-to-htmlを実行してグローバルにインストールします。その後、testコマンドの実行時に、次のように結果を直接モジュールにパイプで渡します。

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

上記のコマンドを実行すると、外部依存関係のない、見やすくスタイル設定されたローカルレポートが作成されます。

Nokogiri依存関係に重大度の高いXML外部エンティティ脆弱性があることを示すSnyk testレポート。パス、詳細、修正方法、参考情報が記載されています。

jqを使ってJSON出力をカスタマイズしている場合は、加工後のJSON結果をパイプで渡すこともできます。たとえば、次のコマンドを実行すると、脆弱性を公開日順に並べ替えたローカルHTMLレポートが生成されます。

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

JSONを使った独自レポートの作成

snyk testを実行するだけでも、多くの有用な情報が得られます。さらに柔軟な使い方が必要なら、snyk test --jsonが役立ちます。無料のツールと少しの工夫で、ニーズに合わせてSnykの結果をカスタマイズできます。

JSON出力を使って独自のレポートや機能を実装している方は、ぜひお知らせください。どんなものを作られたのか、ぜひ聞かせてください。

キャプチャー・ザ・フラッグを始めよう

オンデマンドのバーチャル入門ワークショップを視聴して、キャプチャー・ザ・フラッグの課題の解き方を学びましょう。

続きを読む

blog feature ai lilac
Blog

エージェント型修正で脆弱性バックログをプルリクエストに変える

Evo Remediation Agentがオープンプレビューで利用可能になり、Evo Agentic AppSecに依存関係の自動解決機能が加わりました。AppSecチームは継続的な修正キャンペーンを実施できるようになりました

AI Background min crop
Blog

AIが、あなたが受け入れてきたあらゆるリスクを一気に顕在化させる:AI Security Panel: Unfilteredから得た7つの洞察

AIによって攻撃はより安価かつ高速になり、組織がすでに抱えているリスクが露呈しています。4人のセキュリティリーダーが、機械の速度に対応する防御と迅速な修復が今不可欠である理由を語ります。

blog feature snyk container custom base recommendations
Blog

Evo Agentic AppSecのご紹介:AI開発のスピードに追随するセキュリティ

AIを活用した開発は、従来のセキュリティワークフローを上回るスピードで進んでいます。SnykのAgentic AppSecは、セキュリティエージェントが脆弱性を継続的に検出、修正、検証し、人が基準を定められるようにします。