
開発中にコードの脆弱性スキャンをしてくれるSnykをちょっとだけ試しました
最近Snyk(スニーク)というサービスの情報がよく目に入ってくるようになったので、私も試してみることにしました。
Snykはソフトウェアの脆弱性診断を行うクラウドサービスです。脆弱性診断にもいろいろありますが、Snykは静的コード解析に分類されます。ソフトウェアを開発し始めた時からスキャンを随時行うことで、ソースコードの危険性をアラートで教えてくれる、というものです。
この記事ではSnykにどんな機能があるのか、解析にかけてみるとどうなるのか実際に見てみた結果をお伝えしたいと思います。
Snyk の機能
Snykのドキュメントを参照すると以下の4つのプロダクトがあることが分かります。
Snyk Open Source/アプリケーションが使用しているオープンソースの依存関係(パッケージ)の脆弱性や、ライセンス違反を検査します
Snyk Code/アプリケーションのソースコードにどのような脆弱性があるのか検査します
Snyk Container/Dockerを始めとする基盤で動作する「コンテナ」の脆弱性を検査します
Snyk Infrastructure as Code/Terraform や Kubernetes のようなインフラストラクチャコードにどのような脆弱性があるか検査します
昨今求められている検査機能は軒並みそろっています。これらの機能を統合的に使えるクラウドサービスということであれば、UX、精度、速度、安定性次第では投資する価値は十分あると思います。
ただしこれらの機能はSnykだけが実現しているものではなく、例えば無償で使えるオープンソースプロダクト(SonarQube や Trivy)を組み合わせることでも同様のことを行うことができます。ですので、導入の際は他のツールとの比較検討が必要です。
Snykの価格体系

Snykの価格は『Plans & Pricing』を参照してください。Business プランであれば1開発者あたり毎月 $139 となっています。この手のツールはチームの全員が使うものでもないと思いますので、価格が高いという印象はありませんでした。
また無料プランが標準で用意されており、クレジットカード登録無しで、プライベートも含めた様々なリポジトリかつ全ての機能を試すことができます。ですので、導入検討は非常にやりやすいと思います。
Snykの画面
Snyk にアカウントを登録し、ダッシュボード画面を表示すると以下のスクリーンショットのようになっています。

すでに脆弱性のスキャンを1回終わらせた状態です。パッと見た印象は、モダンな UI で使いやすそうではないでしょうか?
他の画面もお見せします。



Snykのスキャン方法・結果
では肝心のスキャンについて説明します。
まずスキャン対象についてです。スキャン対象は何らかのソースコードリポジトリとなりますが、Web画面上から簡単に構成が可能なのはクラウドサービスとして提供されているリポジトリです。つまり GitHub や GitLab.com 等は簡単に構成することができます。
対してオンプレミスのリポジトリについては Snyk Broker というオープンソースのソフトウェアを構成する必要があります。Snyk Broker は、オンプレミス上のリポジトリと Snyk の中間に立ち、ソースコードをやり取りするためのソフトウェアです。これを構成することでプライベートなソースコードもスキャンすることができます。

今回は手軽に試すために GitHub の公開リポジトリのソースコードをスキャンしました。GitHub の構成は初回に表示されるウィザードに従えば簡単にセットアップできます。また特定のリポジトリだけをスキャンするということもできます。
GitHub との連携は OAuth により認可制御が行われています。なにか変なことを Snykにされるんじゃないか?と不安な方は、連携中に表示される OAuth の認可画面をよくお読みください。
今回は脆弱性盛りだくさんのソースコード『Vulnerable Node』を Fork したものに対してスキャンを行いました。このソースコードは、こういった脆弱性診断ツールの性能をチェックするために作られた Node.js のアプリケーションです。
スキャンが完了するとプロジェクト毎に脆弱性の件数が表示され、さらに深堀りをすることができます。

では Code analysis の中から気になるものを見てみたいと思います。
次の画像はリソースアクセスのレート制限が無く DoS に脆弱だという脆弱性のアラートです。脆弱性の種類を示すCWEのリンクも貼られているところを見ると、多くのCWEについてきちんとカバーしているように思います。

次はオープンリダイレクトの脆弱性の詳細画面です。データフローが分かりやすく示されており、脆弱性の分析をする人にとってはありがたいです。また修正例についても掲載されています。
こういったデータフロー解析をしてくれる時点で、それなりに高級な分析だと伺えるのですが、コードの分岐や抽象化が複雑になるほどデータフロー解析は厳しくなるので、どの程度まで解析できるのかは気になります。


続いてコンテナのスキャン結果も見てみます。
次の画像はコンテナのスキャン結果の冒頭に「Dockerfile のベースイメージをアップグレードしてください」という内容のアラートがでていたものです。
この中に Pull Request を送るボタンが表示されているので、これを押してみます。

すると以下の画像のようなプルリクエストが作成されます。なお、作成の前にはどのリポジトリに対してプルリクエストを送るか確認画面が表示されるのでご安心ください。

このプルリクエストには、ベースイメージをアップグレードするための1行の修正がすでに含まれています。
ここまで見てきて、スキャン自体の性能はまだ未知数ですが、少なくとも検査対象の範囲や、UXについては満足のいくサービスだと感じました。
その他いろいろ
Snyk Codeで検査できる言語
この記事を執筆している時点では以下の言語に対応しています。詳しくは『Code language and framework support』を参照してください。
Java
JavaScript
TypeScript
Python
PHP
C#
Go
Rust(ベータ版)
Kotlin(ベータ版)
AIエンジン
Snykは『AIエンジン』を搭載しており、シンプルなパターンマッチングでは検出ができないものも検出できるようです。例として紹介されているは、ハードコーディングされたシークレット文字列、型推論、データフロー分析が挙げられています。
データ処理方法(セキュリティ)
Snykがデータをどのようにするか、その方法を開示しています。特にオンプレミスのリポジトリをスキャンする場合は、ソースコードの管理方法が特に気になると思いますので、よく見ていただいたほうが良いかと思います。
また『プライバシーポリシー』『DPA』『第三者提供』についても、本格的に利用する前には一読したほうが良いと思います。
このあたりのポリシーは利用する組織によって変わると思いますので、これ以上の説明は控えたいと思います。
まとめ
私自身も脆弱性が無いかチェックするために、人力でコード分析をすることがたまにあるのですが、人力とはいっても観点はちゃんとあって、こういうところを自動化したいという想いはかなうような世の中になってきたのかな、と思いました。
特にデータフロー解析については、完全な人力ではもはや困難で、少なくとも可視化するツールはとてもありがたいです。
実際にSnykを使ってみて、自分が思っていた以上に高機能だったので、もっとちゃんと使い込んでみようかな、と思った次第です。