ビズリーチのOSS 脆弱性管理サービス yamory がついに無料トライアルできるようになったので使ってみました。
以前「ビズリーチのOSS 脆弱性管理サービス yamoryについて調査 どんなことができて、どう実現されているのか」という記事を書きました。
実際に使ってみると、NVD (National Vulnerability Database)のデータをただ集めて、cpeと照らし合わせて使っているだけというものではなく、色々と工夫されており、UIも綺麗でいい感じなツールでした。
yamoryとは?
yamoryはGithubのレポジトリやコマンドラインからpackage.jsonファイルなどのパッケージ管理情報をスキャンし、使われているOSSの脆弱性を特定し、優先順位づけして表示してくれるサービスとなっています。
公式のサイトの主な機能、使い方、のページに詳しく書かれています。
また、以前私が書きました「ビズリーチのOSS 脆弱性管理サービス yamoryについて調査 どんなことができて、どう実現されているのか」にも機能とどうやって実現しているのかの考察を書いていますので参考にしていただければ思います。
トライアル
npmでpackage.jsonの作成
Gradle(Java)のbuild.gradl、npm(Node.js)のpackage.json、pip(python)のrequirements.txtなどに対応していますが、今回は私が使いやすいnpmで利用してみました。
yamoryではpackage.jsonさえあれば動作確認ができると思われますので、サンプルソースコードとしてpackage.jsonのみのものを作成して利用しました。
package.jsonには以下の2つのみを含めています。
・"jquery": "^3.0.0",
・"lodash": "^4.17.11"
今回はあえてバージョンの古いものを設定し、どのような結果が出るのか検討しています。
同じpackage.jsonは以下のようなコマンドで作成できます。
npm init
npm install jquery@3.0.0
npm install lodash@4.17.11
yamoryでスキャンする
yamoryでスキャンするためには、まずGithubと連携する必要があります。
詳しくは公式のこのページに記載されていますが、以下のようにOAuth認証で簡単にできます。
OAuth認証後、スキャンしたいrepositoryを選択することでスキャンを行うことができます。
ダッシュボードに以下のようなスキャン結果が表示されます。
今回の場合は、Immediateが2件、灰色のリスク低に2件の脆弱性が表示されています。
他のサービスとの比較
CVE Detailsの場合
NVDの情報などを使って脆弱性情報を検索できる CVE Details を使ってlodash@4.17.11の脆弱性を調査してみます。
lodash@4.17.11の脆弱性一覧を見てみると以下のように1件表示されます。
また、CVE-2019-10744をクリックすることで詳細を見ることができます。
そこにはMetasploitに登録されているかどうかの確認ができます。
上記のようにMetasploitにない場合も多いです。
ない場合には、世の中には攻撃コードがまだ出回っていないと考えられるかもしれません。
yamoryの場合
yamoryの場合も同様にCVE-2019-10744の1つのみが脆弱性として検出されます。
しかし、内容を見てますと
上記のように日本語での説明で、DoSやRCEのリスクやPoCがある、という情報が表示されます。
CVE DetailsではNVDに書かれている情報の「vulnerable to Prototype Pollution」やCWE ID 20 (Improper Input Validation)という情報のみでここまで詳しい情報はありません。
また、PoCに関してもMetasploitにはなく、exploit-dbで検索しても出てきません。
このように、前回の記事で書いたようにNVDやexploit dbのデータを使った単純な脆弱性スキャナとは違ったもののように思われます。
yamoryではPoCのタブから具体的なPoCの確認を行うことができます。
今回のケースのPoCに関して、このブログで載せるのはあまり良くないと思うので載せませんが、具体的なPoCを確認することができます。
(本来有償のツールですので、yamoryのスキャン結果のデータ部分はあまり扱わないように気をつけています)
npm auditの場合
npm v6.0.0よりnpm auditという脆弱性の監査機能があります。
内容としては、package.jsonを見て脆弱性がないか確認するというもので、yamoryと同じようなことをしています。
今回のケースでnpm auditをした結果、以下のようになりました。
jquery、lodashそれぞれ1件ずつ、合計2件検出されました。
lodashの方のMore infoのページを見てみると
ここにもCVEの情報が乗っていませんが、ResourcesのSnyk AdvisoryをみるとCVEやより詳細なPoCの情報などが掲載されています。
npm auditと比較しても、脆弱性情報の豊富さ、対応するかどうかの判断のしやすさなど、yamoryを使うメリットはありそうです。
Github Security Alertsの場合
Githubにもrepository内の依存関係から脆弱性を発見しアラートを出す機能 Security Alerts があります。
他と同様にpackage.jsonなどを見て判断しています。
現在、公式ページによるとJava, Scala, Javascript, .Net, Python, Ruby, PHPがサポートされているようです。
脆弱性情報の元となる情報源は以下の情報が使われています。
GitHubは、サポートされている言語でのパッケージ中で脆弱性を追跡するのに、以下のソースを使います。
・MITREのCommon Vulnerabilities and Exposures (CVE) リスト
・GitHub上のパブリックなコミット内の脆弱性の検出に、機械学習と人間によるレビューの組み合わせ
・GitHub上のメンテナセキュリティアドバイザリ
・WhiteSource
実際に私の環境で表示されたSecurity Alertsは以下のようになっています。
こちらもnpm auditと同じ結果、CVEも同じ2件になりました。
ただし、細かい点ですが、severityが少し異なり、npmはHigh、Githubはcriticalとなっています。
lodashの詳細のページはこのようになっています。
Remediationが大きく書かれている点が特徴と言えると思います。
npm auditでは、npm audit fixコマンドを使うことで自動で機能もあります。
今回の結果だけの場合、npm auditとGithub Security Alertsはかなり近い結果となりました。
まとめ
CVE Details、npm audit、Github Security Alertsとyamoryを比較しました。
検知される脆弱性の数、優先順位づけ、日本語に対応している点など多くの部分でメリットがあるように感じました。
また、jqueryコミュニティでの議論結果、脆弱性ではないと判断されているものに関してはその結果を反映され、利用者にその事がわかるようになっているなど独自の脆弱性のDBが構築されている事がわかるものになっています。
ただ、この後に気になる点や大きな脅威になりそうなツールなどについても触れたいと思います。
気になる点
検出ミス
yamoryでは脆弱性が合計4件(Immediate2件、リスク低2件)検出されていました。
しかし、Immediateに割り当てられている jqueryの脆弱性 (CVE-2016-10707) は本来脆弱ではないものが検出されていました。
脆弱なjqueryのバージョンは 3.0.0-rc.1 のみなのですが、私が設定した3.0.0のjqueryの場合でも検出されていました。
CVE-2016-10707のcpeは以下のような記述となっています。
バージョンは3.0.0のものを示していますが、そのあとのアップデートがrc1となっており、ここまで一致したものが脆弱と判断されます。
(NVDのcpeは必ずしも正確な情報が書かれている訳ではないですが)
yamoryではアップデートの情報まで検証せずに脆弱性の判断をしていると思われるのでこのような誤検知が発生していると考えられます。
すぐに修正できる小さなものですが、スキャンツールでは同様の問題は常に発生してしまうものだと思います。
このような問題を極力減らし、他のツールにない付加価値を加えるためにもDBの強化が重要になってくると思います。
cpeの詳しい説明はこちらのIPAの情報を参照してください。
競合となるツール
yamoryでも参照しているサイトだったため知ったのですが、snykという脆弱性スキャンツールを提供しているところがあります。
こちらも機能としてはかなり近いもののように思われます。
違いは、
・Goなどの言語にも既に対応している
・修正のためのコマンドなどの生成、プルリク生成
・AWS LambdaなどPaaSに対応
・コンテナ対応
・ライセンスの確認にも対応
などがあります。
現状だと、こちらの方が高機能だと言えます。
ただ、このツールが近いうちに日本語対応するとは考えにくいので、日本語に対応している、日本人によるサポートが受けられるなどyamoryにはメリットがあるとは思います。
追加機能の提案
前回の記事でも書きましたが、今回も内容が近くなりますが書いてみます。
ticket管理機能
前回の記事のマシンリーダブルな出力と近い話ですが、現状はslackとメールの連携が公式でサポートされていると思います。
また、CIに組み込むこともできると書かれているので上手く使えば現状のままでもその他のticket管理システムの連携が可能なのかもしれません。
しかし、上記のsynkのように公式でticket管理システムとの連携をサポートできていることを発表できる事が利用者にとってどの脆弱性スキャナを採用するかどうかの判断になるように思われます。
yamoryではyamory上での脆弱性ハンドリング機能を充実させていますが、大きな組織では既に何かしらのticket管理によるバグや脆弱性のハンドリングの流れが構築されているケースが多いと考えられます。
新たに、脆弱性の対応だけyamoryを使うというのは開発者にとっては負担が増えるように私は感じるので、今既に使っているツールに組み込む事ができるようにしてあげる、というのが開発者にとって優しいツールになるように思います。
セキュリティニュース配信機能
前回の記事の毎日使われる機能でも触れましたが、毎日セキュリティ担当者に使ってもらえるような機能があるとyamoryのツールの価値が高まると私は思っています。
(CIに組み込み、yamoryのWeb画面にはほとんど触れない、というツールであればまた話が変わるとは思います)
セキュリティの担当者の多くが世の中のセキュリティの流れをチェックするために色々なニュースサイトやTwitterを見て回っていると思います。
ただ、ノイズが多かったり、欲しい情報が集まりにくかったりと苦労されていると思います。
こちらのQiitaの記事のようにVulsの開発者の方が上記の課題へのアプローチとしてslackを使っていますが、参加者の人たちが良いと思うものを次々載せていくために本当に欲しい情報が見つけにくくなるという状態になっているように感じられます。
究極のIT系最新技術情報収集用Slackチーム公開 - モヒカンSlack - - Qiita
yamoryでは利用者が使っているソフトウェアがわかっているので、そのソフトウェアに関係する情報だけを表示したり、目立つようにする事が可能だと思います。
NVDのデータが揃う前にニュースサイトで公開されてしまっている脆弱性などもニュースの記事から利用者の通知ができるとより良いと思います。
まとめ
感想
今回は比較しやすいようにするためにjquery、lodashの二つだけで脆弱性スキャンをし、他のツールとの比較を行いました。
実環境では、もっと多くのOSSを利用し、脆弱性の数も多く指摘され、どの脆弱性から対応すべきかといったトリアージがより重要になるなど、多くの部分で今回のレビュー環境とは異なってきます。
その場合の使用感として、どのツールがより使いやすいか検討する必要があると思います。
脆弱性スキャナの分野はなかなか面白そうです。
その他
脆弱性スキャナ Vuls/Trivy/Dockleについて書かれています。
あまり脆弱性スキャナについて詳しくない人にとってはわかりやすくておすすめです。
既によく知っている人には少し物足りないかもしれません。
以前に以下の記事を書きましたのでよかったらどうぞ。
ソフトウェアデザイン 2019年11月号 脆弱性スキャナ特集 まとめと感想 - Security Index
Twitter アカウント