Skip to main content

CIパイプラインにSnyk Open SourceのC/C++セキュリティスキャンを統合する

著者
Headshot of Michal Brutvan

Michal Brutvan

blog feature oss cpp

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プラグインの設定例です。

プロジェクト名「cpp-goof」、Snykインストール「snyk@latest」、追加引数「--unmanaged」が表示されたJenkinsの設定フォーム。

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

14個のC/C++依存関係に58件の既知の脆弱性(重大な範囲外読み取りを含む)があることを示すJenkinsのSnykテストレポート

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

dnsmasqパッケージの重大度の高いヒープベースのバッファオーバーフローに関するセキュリティアドバイザリ。バージョン2.83以降へのアップグレードを推奨しています。

オプション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 test --unmanaged --json | snyk-to-html -o snyk_results.html

すべてを組み合わせる

セキュリティ態勢を維持するには、定期的な監視が重要です。コードを保護する最善の方法は、特定した依存関係のスナップショットをSnykダッシュボードにインポートし、夜間の監視プロセスで新たな脆弱性を検知することです。snyk monitor --unmanagedを定期的に実行することで、依存関係のスナップショットを最新の脆弱性データに保ち、脆弱性データベースに新たな脆弱性が追加されるとすぐにアラートを受け取れます。

個々のコミットやブランチをテストし、脆弱性があればパイプラインを失敗させたい場合は、snyk test --unmanagedコマンドのみを実行してください。testコマンドにsnyk monitor --unmanagedを続けて実行すると、結果もすぐにダッシュボードにインポートされます。依存関係のスナップショットが更新されるのは、テストに合格した場合のみです。

$ snyk test --unmanaged && snyk monitor --unmanaged

severity-threshold=highなど、ほかのオプションと組み合わせることもできます。この場合、深刻度がhigh以上の脆弱性を新たに持ち込んだときにのみ、Snykはビルドを失敗させます。サポートされているコマンドラインオプションの全一覧については、Snyk for C/C++のドキュメントをご覧ください。

GitLab CI/CDパイプライン定義の例

dependency_scanning:
  image: node:latest  # we need npm to install Snyk CLI and we don't need any C++ tooling to run the scan
  stage: test
  script:
    # Install npm, snyk, and snyk-to-html
    - npm install -g npm@latest
    - npm install -g snyk
    - npm install snyk-to-html -g
    # Run snyk help, snyk auth, snyk monitor, snyk test to break build and out report
    - snyk --help
    - snyk auth $SNYK_TOKEN
    - snyk monitor --unmanaged --project-name=cpp-goof-gitlab
    - snyk test --unmanaged --json | snyk-to-html -o snyk_results.html

  # Save report to artifacts
  artifacts:
    when: always
    paths: 
      - snyk_results.html

問題の修正

問題を修正するには、脆弱性が検出されたオープンソースパッケージのソースコードを、推奨される新しいバージョンに置き換える必要があります。問題のURLに記載されたアドバイスを確認し、依存関係のどのバージョンでセキュリティ上の問題が修正されているかを確認してください。

$ snyk test --unmanaged
Testing c-example...

Issues:

 ✗ [Low] Race Condition
    Introduced through: https://curl.se|curl@7.58.0
    URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-CURL-2317489
curlのバージョン7.10.4および7.77.0に影響する競合状態を示し、アップグレード方法を案内するSnyk Vulnerability Databaseのページ。

ソースコードを更新した後、次のいずれかが起こります。

  1. 問題が検出されなくなり、修正完了です。

  2. オープンソース依存関係が正しく特定されていないため、問題が引き続き検出されます。

#2の場合、その理由として、オープンソースデータベースは新しいリリースを毎月更新しているため、コードに追加したばかりのパッケージの最新バージョンが、まだ登録されていない可能性があります。依存関係とそのバージョンがSnykによって正しく特定されているか確認するには、testコマンドに--print-depsオプションを指定して実行してください。

$ snyk test --unmanaged --print-deps
Testing c-example...

Dependencies:

  https://curl.se|curl@7.58.0
  confidence: 0.800

Issues:

 ✗ [Low] Race Condition
    Introduced through: https://curl.se|curl@7.58.0
    URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-CURL-2317489

confidence指標は、Snykによる一致判定の確信度を表します。

適切な確信度とは?

答えは、場合によります。確信度は、ローカルファイルのうち、オープンソースプロジェクトの実際のリリースと一致するファイルの割合です。たとえば、オープンソースプロジェクトの特定のリリース版(ソースコードを含むパッケージ)にファイルが1,000個あり、ローカルプロジェクトにそのうち900個が含まれていて、残りは変更されているため一致しない場合、確信度は900/1,000 = 0.9です。一方、ファイルが10個のオープンソースプロジェクトで、ローカルファイル9個が一致する場合も確信度は同じですが、先ほどの例とは状況が大きく異なります。どの程度の確信度を十分とするか、またどの依存関係の特定結果を無視するかは、ご自身で判断してください。

特定結果が正しくない場合は、snyk ignoreコマンドを使って依存関係を一時的に無視できます。

$ snyk ignore --file-path='./deps/curl-7.60.0/*' --expiry='2022-05-20' --reason='patched the release and waiting for Snyk OS database to update'

C/C++セキュリティスキャンの今後

オープンソースプロジェクトのキュレーションにさらに注力し、コードにわずかな変更が加えられたプロジェクト(テストやドキュメントが削除されたものを含む)にも対応できるようマッチングアルゴリズムを改善することで、スキャン精度の向上に取り組んでいます。また、ソースコードデータベースの更新頻度を高めたり、リリースのないプロジェクトを追加したりすることも進めています。

C++コンポーネントを署名ベースで検出するunmanaged方式に代わる方法として、脆弱性データベースに直接クエリを送信できるAPIを開発しています。ご意見をお寄せいただける方や、新しいAPIについて詳しく知りたい方は、ccpp@snyk.ioまでご連絡ください。

CTFを始めよう

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

続きを読む

illustration hero ai
Blog

PHPが重大な未認証RCEの脆弱性2件を修正(CVE-2026-109618、CVE-2026-109619):今すぐアップデート

PHPのリクエスト処理に重大な脆弱性が2件あり、未認証のリモートコード実行につながるおそれがあります。修正版にアップグレードするか、旧バージョンにはベンダー提供のバックポートを適用してください。

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人のセキュリティリーダーが、機械の速度に対応する防御と迅速な修復が今不可欠である理由を語ります。