到達可能性解析(ベータ版)#
到達可能性解析は、Go アプリケーションで検知した脆弱性について、アプリケーションのコードから脆弱な関数を呼び出す経路があるかを解析し、その結果をタスクに表示する機能です。
CSIRT プランのベータ版機能です
本機能は、CSIRT プランを契約しているオーガニゼーションでご利用いただけます。 ベータ版として提供しているため、今後のリリースで仕様や表示が変わる場合があります。
到達可能性解析でわかること#
FutureVuls の脆弱性の検知は、「脆弱性の影響を受けるバージョンのソフトウェアがインストールされている」ことを示します。 検知では、脆弱な関数がアプリケーションのコードから実際に呼び出されるかまでは確認していません。
到達可能性解析は、アプリケーションのソースコードを静的解析し、アプリケーションのコードから脆弱な関数への呼び出し経路があるかを判定します。 解析結果は、タスクごとに Reachable、Partial、Not reachable などの状態で表示されます。

各状態の意味は「結果の見方」を参照してください。
到達可能性解析の結果の扱い#
- 解析結果は参考情報として表示するだけです。タスクのステータス、タスク優先度、SSVC の Priority は、解析結果によって変更されません
- Reachable は、脆弱な関数への呼び出し経路があることを示します。脆弱性を悪用できることを示すものではありません
- Not reachable は、解析した範囲で脆弱な関数に到達する経路が見つからなかったことを示します。脆弱性の影響がないことを保証するものではありません
- 「未解析」「未導入」「判定なし」は、解析結果がないことを示します。到達しないことや、安全であることを意味しません
仕組み#
flowchart LR
A["お客様の CI<br>(ソースコードを checkout)"] --> B["vuls-reach<br>(静的解析)"]
B --> C["FutureVuls に<br>レポートをアップロード"]
C --> D["既存の検知と照合し<br>タスクごとに表示"]
- お客様の CI で、アプリケーションのソースコードを checkout した環境でスクリプトを実行します
- スクリプトが到達可能性解析プログラム
vuls-reachをダウンロードし、ソースコードを静的解析します。Go の解析には govulncheck を利用しています - スクリプトが解析結果のレポートを FutureVuls にアップロードします
- FutureVuls は、レポートの各行を既存の検知(アプリケーション、パッケージ、バージョン、脆弱性)と照合し、タスク(サーバ × 脆弱性)ごとに 1つの状態を表示します
到達可能性解析は、FutureVuls に登録済みのアプリケーションの検知に結果を追加する機能です。 アプリケーションの登録や脆弱性の検知は、これまでどおりスキャンなどで行います。
対象範囲#
| 項目 | 内容 |
|---|---|
| 対象言語 | Go のみ |
| 対象の検知 | ライブラリの検知のみ。OS パッケージやプライベートソフトウェアなどの検知は対象外です |
| 対象の脆弱性 | Go モジュールの脆弱性。Go 標準ライブラリの脆弱性は対象外です |
| 実行環境 | Linux(x86_64 または aarch64)の CI ランナー |
| ネットワーク | インターネットに接続できない環境(オフライン環境や閉域網)には対応していません |
FutureVuls に送信されるデータ#
アプリケーションのソースコードは、FutureVuls にアップロードされません。 アップロードするレポートには、次の情報が含まれます。
- 脆弱性の ID
- 脆弱性の影響を受けるパッケージの名前とバージョン
- 呼び出し経路が見つかった脆弱な関数の名前
- 呼び出し経路。経路には、お客様のアプリケーションの関数名とパッケージ名が含まれます
- 到達可能性の判定と、評価した時刻
あわせて、解析対象を特定するために、サーバ UUID、アプリケーションの ID(applicationId)、LockFile のパス、解析の開始時刻、vuls-reach のバージョンを送信します。
解析の実行中に vuls-reach と Go コマンドが接続する先は、「CI の実行環境」を参照してください。