VulnCheck の CI 統合は、どれも同じ 5 ステップです。バージョンを固定した CLI をインストールし、VC_TOKEN を渡し、スキャンし、ゲートし、公開します。したがって、コンテナ内でシェルスクリプトを実行できるプラットフォームであれば、どこでも実行できます。各ステップの説明は CI/CD での VulnCheck にあります。本ページでは、専用ガイドのないプラットフォームにそれを適用します。
# 1. Install a pinned CLI
VC_CLI_VERSION=1.1.0
ARCH="$(uname -m)"
case "$ARCH" in x86_64) ARCH=amd64 ;; aarch64) ARCH=arm64 ;; esac
curl -sSL "https://github.com/vulncheck-oss/cli/releases/download/v${VC_CLI_VERSION}/vulncheck_${VC_CLI_VERSION}_linux_${ARCH}.tar.gz" | tar -xz -C /tmp
install -m 0755 "/tmp/vulncheck_${VC_CLI_VERSION}_linux_${ARCH}/bin/vulncheck" /usr/local/bin/vulncheck
# 2. VC_TOKEN comes from the platform's secret store — never from the repository
# 3. Scan
vulncheck scan . --json > scan.json
jq -r '"\((.vulnerabilities // []) | length) vulnerabilities found"' scan.json
# 4. Gate
jq -e --argjson max 7.0 '
[ (.vulnerabilities // [])[]
| select((.cvss_base_score // 0 | tonumber? // 0) >= $max or .in_kev) ] | length == 0
' scan.json > /dev/null || {
echo "VulnCheck policy breach:"
jq -r --argjson max 7.0 '
(.vulnerabilities // [])[]
| select((.cvss_base_score // 0 | tonumber? // 0) >= $max or .in_kev)
| " \(.cve) \(.name)@\(.version) CVSS \(.cvss_base_score) KEV \(.in_kev) fixed in \(.fixed_versions // "n/a")"
' scan.json
exit 1
}
# 5. Publish scan.json as a build artifact
どのプラットフォームでも、つまずきやすい点が 3 つあります。
vulncheck scan は重大な脆弱性を検出した場合でも終了コード 0 を返します。したがって、ビルドを失敗させるのはステップ 4 です。これがなければ、ログに検出結果が残ったままジョブは成功します。vulnerabilities キー自体が含まれないため、(.vulnerabilities // [])[] が必要です。ガードなしで反復処理すると、何も問題のないリポジトリで jq が終了コード 5 を返します。もう一方を守るのが .cvss_base_score // 0 | tonumber? // 0 です。CVSS スコアのない検出結果があると、.in_kev が評価される前に tonumber が同じ終了コード 5 でプログラム全体を中断させてしまいます。install.sh は glibc 専用で、root のコンテナ内でも sudo が使えるものとして扱うため、何もインストールしないまま終了します。上記の tarball であれば、Alpine を含めどこでも動作します。Repository settings > Repository variables で VC_TOKEN を追加し、Secured をオンにします。
image: debian:bookworm-slim
definitions:
steps:
- step: &vulncheck-scan
name: Scan with VulnCheck
script:
- apt-get update -qq && apt-get install -y -qq --no-install-recommends ca-certificates curl jq
- export VC_CLI_VERSION=1.1.0
- curl -sSL "https://github.com/vulncheck-oss/cli/releases/download/v${VC_CLI_VERSION}/vulncheck_${VC_CLI_VERSION}_linux_amd64.tar.gz" | tar -xz -C /tmp
- install -m 0755 "/tmp/vulncheck_${VC_CLI_VERSION}_linux_amd64/bin/vulncheck" /usr/local/bin/vulncheck
- vulncheck scan . --json > scan.json
- jq -r '"\((.vulnerabilities // []) | length) vulnerabilities found"' scan.json
- |
jq -e --argjson max 7.0 '
[ (.vulnerabilities // [])[]
| select((.cvss_base_score // 0 | tonumber? // 0) >= $max or .in_kev) ] | length == 0
' scan.json > /dev/null || { echo "VulnCheck policy breach"; exit 1; }
artifacts:
- scan.json
pipelines:
pull-requests:
'**':
- step: *vulncheck-scan
branches:
main:
- step: *vulncheck-scan
VC_TOKEN をプロジェクトの環境変数として追加するか、複数プロジェクトで共有するコンテキストに追加します。
version: 2.1
jobs:
vulncheck-scan:
docker:
- image: cimg/base:current
environment:
VC_CLI_VERSION: 1.1.0
VC_CVSS_THRESHOLD: '7.0'
steps:
- checkout
- run:
name: Install the VulnCheck CLI
command: |
curl -sSL "https://github.com/vulncheck-oss/cli/releases/download/v${VC_CLI_VERSION}/vulncheck_${VC_CLI_VERSION}_linux_amd64.tar.gz" | tar -xz -C /tmp
sudo install -m 0755 "/tmp/vulncheck_${VC_CLI_VERSION}_linux_amd64/bin/vulncheck" /usr/local/bin/vulncheck
vulncheck version
- run:
name: Scan
command: |
vulncheck scan . --json > scan.json
jq -r '"\((.vulnerabilities // []) | length) vulnerabilities found"' scan.json
- run:
name: Gate on findings
command: |
jq -e --argjson max "$VC_CVSS_THRESHOLD" '
[ (.vulnerabilities // [])[]
| select((.cvss_base_score // 0 | tonumber? // 0) >= $max or .in_kev) ] | length == 0
' scan.json > /dev/null || { echo "VulnCheck policy breach"; exit 1; }
- store_artifacts:
path: scan.json
workflows:
security:
jobs:
- vulncheck-scan
vc_token をリポジトリのシークレットとして追加します。以下の例は Drone です。Woodpecker では、トップレベルの kind、type、name を削除すれば同じステップが使えます。
kind: pipeline
type: docker
name: security
steps:
- name: vulncheck-scan
image: debian:bookworm-slim
environment:
VC_TOKEN:
from_secret: vc_token
VC_CLI_VERSION: 1.1.0
commands:
- apt-get update -qq && apt-get install -y -qq --no-install-recommends ca-certificates curl jq
- curl -sSL "https://github.com/vulncheck-oss/cli/releases/download/v${VC_CLI_VERSION}/vulncheck_${VC_CLI_VERSION}_linux_amd64.tar.gz" | tar -xz -C /tmp
- install -m 0755 "/tmp/vulncheck_${VC_CLI_VERSION}_linux_amd64/bin/vulncheck" /usr/local/bin/vulncheck
- vulncheck scan . --json > scan.json
- jq -r '"\((.vulnerabilities // []) | length) vulnerabilities found"' scan.json
- |
jq -e --argjson max 7.0 '
[ (.vulnerabilities // [])[]
| select((.cvss_base_score // 0 | tonumber? // 0) >= $max or .in_kev) ] | length == 0
' scan.json > /dev/null || { echo "VulnCheck policy breach"; exit 1; }
エージェントの environment フックまたはシークレットヘルパー経由で VC_TOKEN を渡し、コンテナ内でスキャンを実行します。
steps:
- label: 'Scan with VulnCheck'
plugins:
- docker#v5.11.0:
image: debian:bookworm-slim
propagate-environment: true
environment:
- VC_TOKEN
commands:
- apt-get update -qq && apt-get install -y -qq --no-install-recommends ca-certificates curl jq
- export VC_CLI_VERSION=1.1.0
- curl -sSL "https://github.com/vulncheck-oss/cli/releases/download/v${VC_CLI_VERSION}/vulncheck_${VC_CLI_VERSION}_linux_amd64.tar.gz" | tar -xz -C /tmp
- install -m 0755 "/tmp/vulncheck_${VC_CLI_VERSION}_linux_amd64/bin/vulncheck" /usr/local/bin/vulncheck
- vulncheck scan . --json > scan.json
- |
jq -e --argjson max 7.0 '
[ (.vulnerabilities // [])[]
| select((.cvss_base_score // 0 | tonumber? // 0) >= $max or .in_kev) ] | length == 0
' scan.json > /dev/null || { echo "VulnCheck policy breach"; exit 1; }
artifact_paths:
- scan.json
Tekton、Argo Workflows、GitLab の Kubernetes Executor といった Kubernetes ネイティブのランナーでも、特別な対応は不要です。ステップのコンテナ内で汎用レシピを実行し、VC_TOKEN を Secret からマウントし、scan.json を共有ワークスペースに書き出して後続のステップで公開してください。