FutureVulsでは、OSのパッケージだけではなくアプリケーションの依存ライブラリの脆弱性を検知、管理する機能があります。 依存ライブラリの脆弱性にはCVEが採番されていない脆弱性がたくさんありますが、それらCVEが採番されていない脆弱性も検知されます。
検知方法はいくつかあり、それぞれスキャン可能な種類、検知性能の違いがありますので実際に試した上で選択、あるいは組み合わせて検知されることをおすすめします。 それぞれの検知方法の特徴はスキャン方法の選択肢と特徴に記載しています。
ブラウザにLockFileの内容をペーストしてスキャンする方法です。
登録されたLockFileに影響する脆弱性が公開されたタイミングでFutureVulsにて検知され、自動でタスク登録されユーザに通知されます。 依存ライブラリをバージョンアップしてLockFileの内容が更新された場合は、FutureVulsの画面上からLockFileの内容を更新してください。FutureVulsで検知済みタスクのステータスが「patch_applied」に自動更新されます。
スキャン可能なLockFileやバイナリは対応環境を参照してください。
LockFileをFutureVuls画面から登録する方法を説明します。
ブラウザにSBOMファイルの内容をペーストしてスキャンする方法です。
LockFileのペーストスキャンと同様の方法でSBOMが含む依存ライブラリをFutureVulsに登録できます。 SBOMに含まれたアプリケーションやライブラリはSBOM追加と同時に登録され次回スキャン時に脆弱性を検知します。
アプリケーションのSBOMをFutureVulsコンソール画面から登録する方法を説明します。
サーバを選択し、アプリケーションタブでSBOM追加をクリック
SBOMの内容をペーストして送信
次回スキャン時に追加されたライブラリの脆弱性を検知します
※ SBOMの追加がうまくできない場合は「依存ライブラリスキャンのFAQ」をご参照ください。
aquasecurity/trivyはアプリケーション依存ライブラリの脆弱性検知が可能なOSSツールです。指定したディレクトリ以下に格納されているアプリケーション依存ライブラリを自動検出して、それらの脆弱性をスキャンできます。FutureVulsではTrivyのスキャン結果を取り込み、FutureVuls上でアプリケーションライブラリの脆弱性を管理できます。
Trivyは様々な言語のLockファイルやjarファイルのようなバイナリを基に脆弱性スキャンを行います。 サポート対象の言語やパッケージエコシステムの詳細は、「Trivy Supported languages」のFilesysetm列、Rootfs列を参照してください。
Trivyによるコンテナイメージスキャンでは、以下の2パターンをご利用いただけます。
Trivyをローカル環境にインストールし、アプリケーションライブラリをスキャンした結果をFutureVulsにアップロードします。この方法では、通常版と軽量版の2つのインストールモードが選択できます。それぞれの違いは以下の通りです。
項目 | 説明 | 通常版 | 軽量版 |
---|---|---|---|
root権限 | インストール時にroot権限が必要かどうか | 必要 | 不要 |
対応環境 | セットアップ可能な環境 | 参考 | Linux全般 |
定期スキャン | アプリケーションライブラリを自動で定期的にスキャンするか | 対応 | 未対応 |
軽量版ではroot権限が不要な代わりに、アプリケーションライブラリのスキャンを定期的に手動で行う必要があります。また、指定するディレクトリパス以下のすべてのディレクトリ・ファイルに読み取り権限を持つユーザで実行する必要があります。依存ライブラリの構成変更を常にFutureVulsに同期し脆弱性情報を最新化しておくためにも、どちらのモードも選択可能な場合は、基本的に通常版でのスキャンをご利用ください。
新しくアプリケーションライブラリをスキャンし、FutureVulsに登録する場合は次の手順に従ってください。
サーバ追加
ボタンからダイアログを開き、ファイルシステム上のライブラリをスキャン
を選択する
/opt/vuls-trivy-saas/vuls-trivy-saas.sh &> /opt/vuls-trivy-saas/vuls-trivy.log
以上で登録は完了です。 通常版をご利用の場合は、スキャナが1日1回自動で起動し、対象のディレクトリをスキャンしてFutureVulsに反映します。
通常版では、さらにいくつかのスキャンオプションがご利用いただけます。
また、スキャン結果が反映されない場合はコチラを参照ください。
FutureVulsに既に登録済みのアプリケーションライブラリの構成情報を基に、脆弱性情報の最新化を行いたい場合は、FutureVuls上から手動スキャンを実行してください。
登録している依存ライブラリに変更があった場合は、本手順に従ってFutureVulsに反映してください。
root
ユーザもしくは vuls-trivy-saas
ユーザで次のコマンドを実行してください。
/opt/vuls-trivy-saas/vuls-trivy-saas.sh &> /opt/vuls-trivy-saas/vuls-trivy.log
構成情報を更新
ボタンをクリックしてダイアログを開く
Git push時にアプリケーションライブラリをスキャンした結果をFutureVulsにアップロードします。このドキュメントではGitHub Actionsを例に紹介します。 GitHub ActionsのサンプルYAMLファイルは以下のとおりです。
変数 | 説明 | 必須 |
---|---|---|
VULS_SAAS_GROUPID | スキャン結果をアップロードするグループのID | ✅ |
VULS_SAAS_TOKEN | スキャン権限をもったトークン | ✅ |
TARGET_LIBRARY | スキャン対象ディレクトリのパス | ✅ |
VULS_SAAS_UUID | FutureVulsで管理する用のUUID新規登録の場合は uuidgen コマンド等で生成した値を指定する |
✅ |
VULS_SAAS_UUID
として指定してください。以下の環境変数はencrypted secretsにてセットすることを推奨しています。
この情報を使うとFutureVulsの指定したグループに対して、任意のサーバのスキャン結果のアップロードが可能となってしまいます。
スキャン用のスクリプトファイルを用いてスキャンします。
name: FutureVuls library Scan
on:
push
defaults:
run:
shell: bash
jobs:
docker-test:
name: FutureVuls library Scan
env:
VULS_SAAS_GROUPID: ${{ secrets.VULS_SAAS_GROUPID }}
VULS_SAAS_TOKEN: ${{ secrets.VULS_SAAS_TOKEN }}
TARGET_LIBRARY: "/aaa/bbb"
VULS_SAAS_UUID: "xxxxxxxx"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: cached scan db
uses: actions/cache@v3
with:
path: vulndb/
key: trivy-vulndb
- name: scan and upload
env:
run:
curl -s https://installer.vuls.biz/vuls-trivy-light.sh | \
VULS_SAAS_GROUPID="${env.VULS_SAAS_GROUPID}" \
VULS_SAAS_TOKEN="${env.VULS_SAAS_TOKEN}" \
TARGET_LIBRARY="${env.TARGET_LIBRARY}" \
bash -s inst
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 | グループ設定 > FutureVuls 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@v4
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'
trivyのrepositoryスキャンと連携することで、GitHub/GitLab 上にある言語ライブラリの脆弱性を検知し、FutureVuls上で管理できます。 これにより、trivyをインストールするローカル環境内にスキャン対象のライブラリファイルが存在しない場合でも、ライブラリスキャンをご利用いただけます。
「Trivyによるローカルなファイルシステム上のライブラリスキャン」と比較して、サポート対象言語が少ないため、ご注意ください。
サポート対象の言語やパッケージエコシステムの詳細は、「Trivy Supported languages」のRepository列を参照してください。
tools | releases |
---|---|
trivy | https://github.com/aquasecurity/trivy/releases/ |
trivy-to-vuls | https://github.com/future-architect/vuls/releases |
future-vuls | https://github.com/future-architect/vuls/releases |
curl -s https://api.github.com/repos/aquasecurity/trivy/releases/latest | \
grep "browser_download_url.*_Linux-64bit.tar.gz" | \
cut -d : -f 2-3 | \
xargs wget
tar zxvf trivy_*.tar.gz
curl -s https://api.github.com/repos/future-architect/vuls/releases/latest | \
grep "browser_download_url.*trivy-to-vuls.*_linux_amd64.tar.gz" | \
cut -d : -f 2-3 | \
xargs wget
tar zxvf trivy-to-vuls*.tar.gz
curl -s https://api.github.com/repos/future-architect/vuls/releases/latest | \
grep "browser_download_url.*future-vuls.*_linux_amd64.tar.gz" | \
cut -d : -f 2-3 | \
xargs wget
tar zxvf future-vuls*.tar.gz
curl -s https://api.github.com/repos/aquasecurity/trivy/releases/latest | \
grep "browser_download_url.*_macOS-ARM64.tar.gz" | \
cut -d : -f 2-3 | \
xargs wget
tar zxvf trivy_*.tar.gz
curl -s https://api.github.com/repos/future-architect/vuls/releases/latest | \
grep "browser_download_url.*trivy-to-vuls.*_darwin_arm64.tar.gz" | \
cut -d : -f 2-3 | \
xargs wget
tar zxvf trivy-to-vuls*.tar.gz
curl -s https://api.github.com/repos/future-architect/vuls/releases/latest | \
grep "browser_download_url.*future-vuls.*_darwin_arm64.tar.gz" | \
cut -d : -f 2-3 | \
xargs wget
tar zxvf future-vuls*.tar.gz
export FVULS_GROUP_ID=xxx
export FVULS_TOKEN=xxx
export FVULS_SERVER_UUID=`uuidgen`
export REPOSITORY_URL=https://xxx.xxxxx/xxx
# プロキシ環境下の場合は経由するプロキシサーバをセット
export https_proxy=http://name:pass@proxy:port
# スキャン対象リポジトリによってセットする変数を選択する
export GITHUB_TOKEN=xxxxxxxx
export GITLAB_TOKEN=xxxxxxxx
環境変数 | 説明 | 詳細 |
---|---|---|
FVULS_GROUP_ID | グループID | グループ設定を開き、URLから確認する。https://console.vuls.biz/org/xxx/group/[ココ]/setting/profile |
FVULS_TOKEN | トークン | グループ設定>トークンを開き、スキャン権限を持つトークンを選択する。 |
FVULS_SERVER_UUID | UUID | uuidgen などのコマンドを使って任意に作成する。FutureVuls上でサーバの識別に利用される。 |
REPOSITORY_URL | リポジトリURL | スキャン対象のリポジトリのURL。 |
GITHUB_TOKEN | GitHubトークン | スキャン対象リポジトリに読み取り権限をもつGitHubトークン。 |
GITLAB_TOKEN | GitLabトークン | スキャン対象リポジトリに読み取り権限をもつGitLabトークン。 |
GITHUB_TOKEN
と GITLAB_TOKEN
が両方設定されている場合は、常に GITHUB_TOKEN
を認証トークンとして利用するため、GitLab上のリポジトリをスキャンする場合は GITHUB_TOKEN
を環境変数から削除してください。
./trivy repo -q -f json --list-all-pkgs ${REPOSITORY_URL} | \
./trivy-to-vuls parse --stdin | \
./future-vuls upload --stdin --group-id ${FVULS_GROUP_ID} --token ${FVULS_TOKEN} --uuid ${FVULS_SERVER_UUID}
FutureVulsを開いて確認すると、新しくサーバが登録され、言語ライブラリの脆弱性が検知されているのが確認できます。
既に一度登録したライブラリを更新する場合は、環境変数 FVULS_SERVER_UUID
に、対象サーバのUUIDをセットしてからスキャン・アップロードしてください。
# trivy, trivy-to-vuls, future-vulsのインストールは省略
export FVULS_GROUP_ID=xxx
export FVULS_TOKEN=xxx
export FVULS_SERVER_UUID=xxx
export REPOSITORY_URL=https://xxx.xxxxx/xxx
# スキャン対象リポジトリによってセットする変数を選択する
export GITHUB_TOKEN=xxxxxxxx
export GITLAB_TOKEN=xxxxxxxx
./trivy repo -q -f json -o ./results.json --list-all-pkgs ${REPOSITORY_URL}
./trivy-to-vuls parse ./ -f result.json | \
./future-vuls upload --stdin --group-id ${FVULS_GROUP_ID} --token ${FVULS_TOKEN} --uuid ${FVULS_SERVER_UUID}
サーバ上に配置されているLockFileやバイナリのパスを指定して依存ライブラリの脆弱性をスキャンする方法です。
スキャン可能なLockfileやバイナリは対応環境を参照してください。
本機能はローカルスキャンモード、リモートスキャンモードの両方に対応しています。
config.tomlに、スキャン対象のLockFileのパスを指定します。scan時に指定されたパスのLockfileを解析し依存ライブラリのリストを取得します。
config.tomlに、スキャン対象サーバ上のLockFileのパスを指定します。scan時にSSHで接続したリモートサーバの指定したパスのLockFileを解析し、依存ライブラリのリストを取得します。
/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
と findLockDirs
を指定すると、スキャン対象サーバ上のfindLockDir以下のLockFileやJarなどを自動検索できます。
「findLock = true
かつ findLockDirs
を指定しない場合」はルート以下の全ディレクトリのLockFileを find
コマンドで検索します。
この場合、findコマンド実行中に、1つのCPUコアを専有する可能性があります。
もし許容できない場合は findLockDirs
を指定して自動検索の対象ディレクトリの指定をおすすめします。
[servers]
[servers.sample]
user = "vuls-saas"
host = "localhost"
port = "local"
findLock = true
findLockDirs = [
"/path/to/project1/lib",
"/path/to/project2/lib",
]
GitHubの機能である、GitHub Security Alertsは、リポジトリ内のLockFileに記載された依存ライブラリの脆弱性をスキャンする機能です。FutureVulsではGitHubとAPI連携し、GitHubにて検知された脆弱性をFutureVulsに取り込むことが出来ます。
ソースコードをGitHubで管理してない場合でも、LockFileのみをGitHub上で管理することにより、GitHubにて脆弱性検知が可能となります。
サポート対象の言語と種類はGitHub:Supported package ecosystemsを参照してください。
Amazon InspectorによるAWS Lambda関数スキャン機能を利用し、AWS Lambdaの依存ライブラリの脆弱性をFutureVulsに取り込み管理することが出来ます。
Amazon InspectorをFutureVulsに連携するメリットについては下記のブログ記事をご参考ください。
FutureVulsとAmazon Inspectorの連携:脆弱性の一元管理とリスク判断と運用者への対応指示まで自動化
連携方法の詳細はこちらを参照してください。
FutureVuls画面上からCPEを登録してライブラリの脆弱性スキャンをする方法です。CPEを用いたスキャンの情報ソースがNVDとJVNですので、NVD, JVNに登録されていないライブラリ脆弱性は検知出来ません。また、登録対象のライブラリがさらに依存するライブラリも登録する必要がありますので、通常は他の方法を採用するのが良いでしょう。