依存ライブラリスキャン

FutureVulsでは、OSのパッケージだけではなくアプリケーションの依存ライブラリの脆弱性を検知、管理する機能があります。

検知方法はいくつかあり、それぞれスキャン可能な種類、検知性能の違いがありますので実際に試した上で選択、あるいは組み合わせて検知されることをおすすめします。

それぞれの検知方法の特徴はスキャン方法の選択肢と特徴に記載しています。


Lockfileのペーストスキャン

ブラウザにLockFileの内容をペーストしてスキャンする方法です。

登録されたLockFileに影響する脆弱性が公開されたタイミングでFutureVulsにて検知され、自動でタスク登録されユーザに通知されます。 依存ライブラリをバージョンアップしてLockFileの内容が更新された場合は、FutureVulsの画面上からLockFileの内容を更新してください。FutureVulsで検知済みタスクのステータスが「patch_applied」に自動更新されます。

ペーストスキャンでサポートするLockFileは以下の通りです。

Lang lockfile
Ruby Gemfile.lock
Python Pipfile.lock, poetry.lock, requirements.txt
PHP composer.lock
Node.js package-lock.json, yarn.lock
.NET packages.lock.json
Go go.sum
Rust Cargo.lock

LockFileをFutureVuls画面から登録する方法を説明します。

  • サーバを選択し、LOCKFILEのタブで追加をクリック

image

  • LockFileに名前を付け、種別を選択。LockFileの内容をペーストし、送信。

image

  • 次回スキャン時にソフトウェアの登録と脆弱性を検知します

image


Vuls ScannerでLockfileを指定したスキャン

サーバ上に配置されているLockfileのパスを指定して依存ライブラリの脆弱性をスキャンする方法です。

スキャン可能なLockfileは以下の通りです。

Lang lockfile
Ruby Gemfile.lock
Python Pipfile.lock, poetry.lock, requirements.txt
PHP composer.lock
Node.js package-lock.json, yarn.lock
.NET packages.lock.json
Go go.sum
Rust Cargo.lock

本機能はローカルスキャンモード、リモートスキャンモードの両方に対応しています。

Vuls ローカルスキャンモードの動作

config.tomlに、スキャン対象のLockFileのパスを指定します。scan時に指定されたパスのLockfileを解析し依存ライブラリのリストを取得します。

lockfile-local

Vuls リモートスキャンモードの動作

config.tomlに、スキャン対象サーバ上のLockFileのパスを指定します。scan時にSSHで接続したリモートサーバの指定したパスのLockfileを解析し、依存ライブラリのリストを取得します。

lockfile-remote

設定方法

/opt/vuls-saas/config.tomlにlockfileのパスを指定して下さい。

[servers]

[servers.sample]
user = "vuls-saas"
host = "localhost"
port = "local"
lockfiles = [
  "/home/user/lockfiles/package-lock.json",
  "/home/user/lockfiles/Gemfile.lock",
  "/home/user/lockfiles/yarn.lock"
]

また、config.tomlでfindLock = trueを指定すると、スキャン対象サーバ上のLockFileを自動検索してスキャン可能です。

[servers]

[servers.sample]
user = "vuls-saas"
host = "localhost"
port = "local"
findLock = true
  • スキャン後のパッケージは、OSパッケージ同様、ソフトウェアとタスクに表示される image image

trivyでローカルファイルシステム上のパスを指定したスキャン

trivy fsを実行すると、指定したディレクトリ以下に格納されているアプリケーション依存ライブラリを自動検出して、それらの脆弱性をスキャンできます。

Javaのjarが格納されているディレクトリを指定してスキャンする方法を記載します。

$ ./trivy -q fs --f=json --list-all-pkgs /path/to/jar/dir | ./trivy-to-vuls parse --stdin | ./future-vuls upload --stdin --url ${FVULS_AUTH_URL} --group-id ${FVULS_GROUP_ID}  --token ${FVULS_TOKEN}  --uuid ${FVULS_SERVER_UUID}

Trivy, trivy-to-vuls, futurevulsコマンドのセットアップ方法や、オプションの詳細はDOCKERスキャン(TRIVY) を参照してください。

RubyのGemfile.lock, PythonのRequirements.txt, PHPのcomposer.lockなど他言語のロックファイルも同じようにスキャンできます。 サポート対象の言語やパッケージエコシステムの詳細は、Trivy v0.20.0 Language-specific PackagesのFilesysetm列を参照してください。


GitHub ActionsでPush時にLockfileを自動更新する方法

futurevuls/fvuls-lockfile-uploaderを使い、git push時にLockfileが更新されたかをチェックし、Lockfileが更新された場合のみ、FutureVuls登録済みのLockfileをREST API経由で更新する方法を解説します。

下記のサンプルでは、releaseブランチにプッシュされた場合かつ、./go.sumまたは./web/yarn.lockが変更された場合のみ実行されます。

サンプル内の以下の環境変数は、Encrypted Secretsにてセットして下さい。

環境変数名 確認方法
FVULS_SERVER_UUID サーバ一覧から確認する
FVULS_TOKEN グループ設定 > 開発者APIから確認する
on:
  push:
    ## https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions#onpushpull_requestpaths
    paths:
      - 'go.sum'
      - 'web/yarn.lock'
    branches:
      - release

name: Check lockfiles
jobs:
  build:
    env:
      FVULS_SERVER_UUID: ${{ secrets.FVULS_SERVER_UUID }}
      FVULS_TOKEN: ${{ secrets.FVULS_TOKEN }}
    name: Upload lockfile
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - name: Upload go.sum
        uses: futurevuls/fvuls-lockfile-uploader@v1
        with:
          repoName: ${{ github.repository }}
          path: './go.sum'
      - name: Upload web/yarn.lock
        uses: futurevuls/fvuls-lockfile-uploader@v1
        with:
          repoName: ${{ github.repository }}
          path: './web/yarn.lock'

GitHub Security Alerts連携

GitHubの機能である、GitHub Security Alertsは、リポジトリ内のLockfileに記載された依存ライブラリの脆弱性をスキャンする機能です。FutureVulsではGitHubとAPI連携し、GitHubにて検知された脆弱性をFutureVulsに取り込むことが出来ます。

ソースコードをGitHubで管理してない場合でも、LockfileのみをGitHub上で管理することにより、GitHubにて脆弱性検知が可能となります。

サポート対象の言語と種類はGitHub:Supported package ecosystemsを参照してください。


FutureVulsの画面上でCPEを登録する方法

FutureVuls画面上からCPEを登録してライブラリの脆弱性スキャンをする方法です。CPEを用いたスキャンの情報ソースがNVDとJVNですので、NVD, JVNに登録されていないライブラリ脆弱性は検知出来ません。また、登録対象のライブラリがさらに依存するライブラリも登録する必要がありますので、通常は他の方法を採用するのが良いでしょう。