CIパイプラインにSnyk Open SourceのC/C++セキュリティスキャンを統合する
Michal Brutvan
2022年9月8日
0 分で読めますSnyk Open Sourceは、CLIを使用したベンダー提供のオープンソース依存関係のCおよびC++スキャンをサポートしています。このたび、CIプラグインからも利用できるようになりました。このガイドでは、パイプラインにC/C++セキュリティスキャンを統合し、脆弱性情報と修正方法を開発者に直接届ける方法を説明します。このガイドでは、「C/C++」を単に「C++」と呼ぶことにご注意ください。
オプション1:CIプラグインを使用する
Snykは、Jenkins、Azure DevOps、GitHub Actionsなど、多くのCI/CDプラットフォームと連携します。これらのプラグインには共通点があります。Snyk CLIやその他のツールをラップし、設定と使用を簡単にしていることです。そのため設定方法は共通しており、どのプラグインでもSnyk CLIに渡す追加のコマンドライン引数を指定できます。
C++プロジェクトをスキャンするには、追加の引数として--unmanagedを指定するだけです。以下は、Jenkins用Snyk Securityプラグインの設定例です。

ビルド後、ビルド詳細ページにSnyk Security Reportの項目が表示されます。

セキュリティレポートには、特定されたオープンソース依存関係に基づいて検出された脆弱性が一覧表示されます。各脆弱性について、深刻度、影響を受ける依存関係、脆弱性が修正されたオープンソースプロジェクトのバージョンを確認できます。

オプション2:スクリプトを使用する
C++プロジェクトのスキャンに使用するCLIコマンドは、snyk testとsnyk monitorの2つです。どちらもコマンドラインオプション--unmanagedを指定します。いずれもコード内のオープンソース依存関係とその脆弱性をスキャンしますが、用途はそれぞれ異なります。
snyk test
snyk test --unmanagedは、脆弱性の一覧を生成する基本的なコマンドです。コード内のオープンソース依存関係を特定し、既知の脆弱性がないかSnyk Vulnerability Databaseを照会します。CIパイプラインでの使用を想定しており(JSON出力に対応)、問題が検出されるとゼロ以外の終了コードを返します。オープンソース依存関係をアーカイブとして保存している場合も、Snyk CLIで内容を解析できます。
snyk monitor
前のコマンドとは異なり、snyk monitor --unmanagedは問題の報告をSnyk UIに委ねます。このコマンドは、現在特定されている依存関係とその脆弱性のスナップショットを取得し、Snykダッシュボードにインポートします。その後、特定された依存関係が新たな脆弱性について継続的に監視され、Snyk Vulnerability Databaseに脆弱性が追加されるとアラートが届きます。このコマンドは、問題が検出されても終了コードを返しません。
ここで触れておきたいのは、このコマンドが実際に、現在検出されている依存関係のスナップショットを取得するという点です。Snykは、トラブルシューティングのために署名をサーバーに短期間だけ保存します。オープンソースデータベースは更新されるため、Snykが新しいライブラリとその脆弱性を検出できるようになる場合があります。そのため、snyk monitor --unmanagedコマンドを定期的に実行することをおすすめします。
snyk-to-html
snyk-to-htmlは、snyk test --jsonのJSON出力を、人が読みやすいHTMLドキュメントに変換するスタンドアロンツールです。unmanagedモードのsnyk testコマンドと組み合わせた一般的な使用例は次のとおりです。
すべてを組み合わせる
セキュリティ態勢を維持するには、定期的な監視が重要です。コードを保護する最善の方法は、特定した依存関係のスナップショットをSnykダッシュボードにインポートし、夜間の監視プロセスで新たな脆弱性を検知することです。snyk monitor --unmanagedを定期的に実行することで、依存関係のスナップショットを最新の脆弱性データに保ち、脆弱性データベースに新たな脆弱性が追加されるとすぐにアラートを受け取れます。
個々のコミットやブランチをテストし、脆弱性があればパイプラインを失敗させたい場合は、snyk test --unmanagedコマンドのみを実行してください。testコマンドにsnyk monitor --unmanagedを続けて実行すると、結果もすぐにダッシュボードにインポートされます。依存関係のスナップショットが更新されるのは、テストに合格した場合のみです。
severity-threshold=highなど、ほかのオプションと組み合わせることもできます。この場合、深刻度がhigh以上の脆弱性を新たに持ち込んだときにのみ、Snykはビルドを失敗させます。サポートされているコマンドラインオプションの全一覧については、Snyk for C/C++のドキュメントをご覧ください。
GitLab CI/CDパイプライン定義の例
問題の修正
問題を修正するには、脆弱性が検出されたオープンソースパッケージのソースコードを、推奨される新しいバージョンに置き換える必要があります。問題のURLに記載されたアドバイスを確認し、依存関係のどのバージョンでセキュリティ上の問題が修正されているかを確認してください。

ソースコードを更新した後、次のいずれかが起こります。
問題が検出されなくなり、修正完了です。
オープンソース依存関係が正しく特定されていないため、問題が引き続き検出されます。
#2の場合、その理由として、オープンソースデータベースは新しいリリースを毎月更新しているため、コードに追加したばかりのパッケージの最新バージョンが、まだ登録されていない可能性があります。依存関係とそのバージョンがSnykによって正しく特定されているか確認するには、testコマンドに--print-depsオプションを指定して実行してください。
confidence指標は、Snykによる一致判定の確信度を表します。
適切な確信度とは?
答えは、場合によります。確信度は、ローカルファイルのうち、オープンソースプロジェクトの実際のリリースと一致するファイルの割合です。たとえば、オープンソースプロジェクトの特定のリリース版(ソースコードを含むパッケージ)にファイルが1,000個あり、ローカルプロジェクトにそのうち900個が含まれていて、残りは変更されているため一致しない場合、確信度は900/1,000 = 0.9です。一方、ファイルが10個のオープンソースプロジェクトで、ローカルファイル9個が一致する場合も確信度は同じですが、先ほどの例とは状況が大きく異なります。どの程度の確信度を十分とするか、またどの依存関係の特定結果を無視するかは、ご自身で判断してください。
特定結果が正しくない場合は、snyk ignoreコマンドを使って依存関係を一時的に無視できます。
C/C++セキュリティスキャンの今後
オープンソースプロジェクトのキュレーションにさらに注力し、コードにわずかな変更が加えられたプロジェクト(テストやドキュメントが削除されたものを含む)にも対応できるようマッチングアルゴリズムを改善することで、スキャン精度の向上に取り組んでいます。また、ソースコードデータベースの更新頻度を高めたり、リリースのないプロジェクトを追加したりすることも進めています。
C++コンポーネントを署名ベースで検出するunmanaged方式に代わる方法として、脆弱性データベースに直接クエリを送信できるAPIを開発しています。ご意見をお寄せいただける方や、新しいAPIについて詳しく知りたい方は、ccpp@snyk.ioまでご連絡ください。
CTFを始めよう
オンデマンドのバーチャル入門ワークショップを視聴して、CTFの課題の解き方を学びましょう。



