アプリケーションのセキュリティ調査の自動化

Snyk
スニーク(Snyk)
と呼ぶらしい。
Snyk CLIをnpmでグローバルインストールする。
$ npm install -g snyk

safety
safety
というサービスがあり、そちらが提供している脆弱性診断のツール。
有料版でAPI-KEYが取得できて、API-KEYをオプションとして指定することで、最新の脆弱性データベースを元に脆弱性診断が行える。
無料で使用することもできるが、脆弱性情報が最新版から一ヶ月は遅れている。
ローカルで使用するには、safety-db
が必要です。
--full-report
オプションを付与することで、、脆弱性の詳細情報を出力することができる。
$ pip install safety-db
$ pip install safety
$ safety check
$ safety check --full-report
実行してみると、以下のように表示されるはずです。以下ではfastapiの0.88.0のバージョンに脆弱性があることを検知しています。
表示されているリンク(https://pyup.io/v/53310/f17/)を見てみると、詳細が出てきます。
$ safety check --full-report
+=======================================================================================================================================================================================================+
/$$$$$$ /$$
/$$__ $$ | $$
/$$$$$$$ /$$$$$$ | $$ \__//$$$$$$ /$$$$$$ /$$ /$$
/$$_____/ |____ $$| $$$$ /$$__ $$|_ $$_/ | $$ | $$
| $$$$$$ /$$$$$$$| $$_/ | $$$$$$$$ | $$ | $$ | $$
\____ $$ /$$__ $$| $$ | $$_____/ | $$ /$$| $$ | $$
/$$$$$$$/| $$$$$$$| $$ | $$$$$$$ | $$$$/| $$$$$$$
|_______/ \_______/|__/ \_______/ \___/ \____ $$
/$$ | $$
| $$$$$$/
by pyup.io \______/
+=======================================================================================================================================================================================================+
REPORT
Safety v2.3.5 is scanning for Vulnerabilities...
Scanning dependencies in your files:
-> requirements.txt
Using non-commercial database
Found and scanned 10 packages
Timestamp 2023-03-25 12:40:02
1 vulnerabilities found
0 vulnerabilities ignored
+=======================================================================================================================================================================================================+
VULNERABILITIES FOUND
+=======================================================================================================================================================================================================+
-> Vulnerability found in fastapi version 0.88.0
Vulnerability ID: 53310
Affected spec: <0.92.0
ADVISORY: Fastapi 0.92.0 updates its dependency 'Starlette' to v0.25.0 to include a security fix.
PVE-2023-53332
For more information, please visit https://pyup.io/v/53310/f17
-r
オプションでパッケージファイルを絞って診断を行うことも可能です。
$ safety check -r requirements.txt --full-report

pip-audit
PyPA
が提供しているツール。
https://github.com/pypa/advisory-databaseのデータベースを元に脆弱性診断を行なっている。
$ pip install pip-audit
desc
のオプションを付与することで、descriptionが表示される。
$ pip-audit --desc

Trivyによるコンテナの自動スキャン
Trivyは、コンテナイメージの脆弱性診断ツールです。コンテナイメージとなると主にDockerイメージの中身をみて、脆弱性診断を行なってくれます。他にもRemoteのGit Repository等の脆弱性やシークレット情報をスキャンできるツール。
Trivyの脆弱性スキャンの対象は以下の通りです。
- コンテナイメージ
- ファイルシステム
- GIt Repo
GitHub ActionsなどのCIにも簡単に組み込めるように作られている。
Trivyの脆弱性スキャンは、trivy-db
と呼ばれているツールで作成されている脆弱性DBを参照して行われる。
6時間おきに脆弱性DBが更新されていく。
最新の脆弱性情報
で脆弱性スキャンをかけることができます。
Trivyがどのようなデータソースから情報を収集しているかは、Trivyドキュメントの Data Sources
や trivy-db
のソースコードから読み解ける。
主なデータソースは以下の通りです。
- GitHub Advisory Database
- Open Source Vulnerabilities
- GitLab Advisories Community
- NVD
- 各種OS/言語の脆弱性DB
インストール
Usage
コンテナイメージをスキャンする際は、trivy image [image名]
でスキャンすることができる。
以下の例は Alpine Linux 3.4のPythonイメージ
に対するスキャン。
$ trivy image python:3.4-alpine
参考資料

trivyの出力結果の例
Total: 37 (UNKNOWN: 0, LOW: 4, MEDIUM: 16, HIGH: 13, CRITICAL: 4)
┌──────────────┬────────────────┬──────────┬───────────────────┬───────────────┬──────────────────────────────────────────────────────────────┐
│ Library │ Vulnerability │ Severity │ Installed Version │ Fixed Version │ Title │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼──────────────────────────────────────────────────────────────┤
│ expat │ CVE-2018-20843 │ HIGH │ 2.2.6-r0 │ 2.2.7-r0 │ expat: large number of colons in input makes parser consume │
│ │ │ │ │ │ high amount... │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2018-20843 │
│ ├────────────────┤ │ ├───────────────┼──────────────────────────────────────────────────────────────┤
│ │ CVE-2019-15903 │ │ │ 2.2.7-r1 │ expat: heap-based buffer over-read via crafted XML input │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2019-15903 │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼──────────────────────────────────────────────────────────────┤
│ libbz2 │ CVE-2019-12900 │ CRITICAL │ 1.0.6-r6 │ 1.0.6-r7 │ bzip2: out-of-bounds write in function BZ2_decompress │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2019-12900 │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼──────────────────────────────────────────────────────────────┤
上記の例では出力結果が37件であることが表示されています。
Severity
という項目が脆弱性の内訳です。
- CRITICAL : 9.0~10.0
- HIGH : 7.0~8.9
- MEDIUM : 4.0 ~ 6.9
- LOW : 0.1 ~ 3.9
- UNKNOWN : 未確認
共通脆弱性評価システムCVSS(Common Vulnerability Scoring System)
というものによって評価された脆弱性のスコアをもとに設定されているとのこと。
--severity
オプションを使用することで、上記の出力結果から脆弱性のレベルで絞ることもできる。
$ trivy image --severity CRITICAL,HIGH python:3.4-alpine
python:3.4-alpine (alpine 3.9.2)
Total: 17 (HIGH: 13, CRITICAL: 4)
┌──────────────┬────────────────┬──────────┬───────────────────┬───────────────┬──────────────────────────────────────────────────────────────┐
│ Library │ Vulnerability │ Severity │ Installed Version │ Fixed Version │ Title │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼──────────────────────────────────────────────────────────────┤
│ expat │ CVE-2018-20843 │ HIGH │ 2.2.6-r0 │ 2.2.7-r0 │ expat: large number of colons in input makes parser consume │
│ │ │ │ │ │ high amount... │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2018-20843 │
│ ├────────────────┤ │ ├───────────────┼──────────────────────────────────────────────────────────────┤
│ │ CVE-2019-15903 │ │ │ 2.2.7-r1 │ expat: heap-based buffer over-read via crafted XML input │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2019-15903 │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼──────────────────────────────────────────────────────────────┤
│ libbz2 │ CVE-2019-12900 │ CRITICAL │ 1.0.6-r6 │ 1.0.6-r7 │ bzip2: out-of-bounds write in function BZ2_decompress │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2019-12900 │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼──────────────────────────────────────────────────────────────┤

tfsec
Terraform
の静的なセキュリティスキャナーです。
ローカル、CIパイプライン環境で実行できるように設計されている。
$ brew install tfsec
.tf
ファイルを保管している、ディレクトリ内に移動して、以下のコマンドを実行する。
$ tfsec .
....
────────────────────────────────────────────────
timings
──────────────────────────────────────────
disk i/o 676.749µs
parsing 69.330377ms
adaptation 3.278459ms
checks 11.331875ms
total 84.61746ms
counts
──────────────────────────────────────────
modules downloaded 0
modules processed 8
blocks processed 248
files read 27
results
──────────────────────────────────────────
passed 46
ignored 0
critical 14
high 16
medium 2
low 11
46 passed, 43 potential problem(s) detected.
重要度について
tfsec
では、検知結果を4つの重要度でカテゴライズしている。
- CRITICAL
- HIGH
- MEDIUM
- LOW
-m
のオプションで重要度を絞ることができる。
$ tfsec -m CRITICAL
GitHub Actions
github-actionsにも組み込むことも可能。
name: tfsec
on:
pull_request:
jobs:
tfsec:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v3
- name: Run tfsec with reviewdog
uses: reviewdog/action-tfsec@master
with:
github_token: ${{ secrets.github_token }}
level: info
working_directory: my_directory
reporter: github-pr-review
fail_on_error: true
filter_mode: nofilter

checkov
tfsecと似たようなツールにcheckov
というものがある。
$ pip install checkov
下記の記事によれば、checkovの方が検出してくれる項目自体は多いらしい。

OWASP-ZAPをGitHub Actionsで動かす

Vuls
サーバの脆弱性をスキャンしてくれます。
docker containerに対してもやってくるので、ローカルに対して使用することも可能。

Falco
コンテナの侵入・改ざん検知ツール

packj
サードパーティモジュールなどのパッケージに脆弱性が含まれていないかを検出してくれる。
以下の幅広い環境に対応している。
- pypi
- npm
- rubygems
$ pip install packj

CodeQL
コード分析エンジン CodeQL を使用してコードをスキャンし、検出したコードの脆弱性をアラートとして表示する。
対応している言語は以下になる。
- C/C++
- C#
- Go
- Java
- JavaScript/TypeScript
- Python

Grype
Trivyより後発のセキュリティスキャンツール。
SBOMツールであるSyft
と連携して動作し、スキャン結果のSBOMファイルへの出力や、SBOMファイルを利用した脆弱性スキャンが可能。
基本的にはTrivyと類似したデータソースになっている。
- GitHub Advisory Database
- Open Source Vulnerabilities
- GitLab Advisories Community
- NVD
- 各種OSの脆弱性データベース
Gypeは以下のスキャンに対応している。
- コンテナイメージ
- OSパッケージ
- 言語のパッケージ
- SBOMファイルのスキャン
- CycloneDX, SBOM, syft形式のスキャンが可能

OPA/Rego入門

SQLインジェクション
SQLインジェクションの調査としては、sqlmapというツールがある。実際の攻撃にも使えてしまうため、使い方に注意が必要になる。
以下で記事も書いた。
burp suiteを用いての調査もできる