🎃
Local PHP Security CheckerでPHPプロジェクトで使用している脆弱性をチェックする
Local PHP Security CheckerとはSCA(Software Composition Analysis)[1]を行うツールの一つで、PHPプロジェクトが依存するライブラリに含まれる脆弱性を検出します。
ライブラリに含まれる脆弱性を検出できるか試してみます。
実行環境
- Ubuntu 20.04.4 LTS
インストール
Local PHP Security CheckerはGo製のプログラムであり、Releasesページからバイナリをダウンロードすることでインストールができます。
wget https://github.com/fabpot/local-php-security-checker/releases/download/v2.0.4/local-php-security-checker_2.0.4_linux_amd64
sudo mv local-php-security-checker_2.0.4_linux_amd64 /usr/local/bin/local-php-security-checker
sudo chmod 755 /usr/local/bin/local-php-security-checker
以下の通り、インストールに成功しました。
$ local-php-security-checker --help
Local PHP Security Checker 2.0.4, built at 2022-06-28T16:08:59Z
Usage of local-php-security-checker:
-archive string
Advisory archive URL (default "https://codeload.github.com/FriendsOfPHP/security-advisories/zip/master")
-cache-dir string
Cache directory (default "/tmp")
-disable-exit-code
Whether to fail when issues are detected
-format string
Output format (ansi, junit, markdown, json, or yaml) (default "ansi")
-help
Output help and version
-local
Do not make HTTP calls (needs a valid cache file)
-no-dev
Do not check packages listed under require-dev
-path string
composer.lock file or directory
-update-cache
Update the cache (other flags are ignored)
脆弱なPHPプロジェクトのダウンロード
Laravelフレームワークの脆弱性の一つで、広いバージョンに影響を与えた CVE-2021-43808 の影響を受ける以下のプロジェクトに対してスキャンを実施します。
v5.1.10には脆弱性の対象である、v8.61.0が使用されているため、以下の通りプロジェクトをダウンロードします。
git clone https://github.com/koel/koel
cd koel
git switch --detach refs/tags/v5.1.10
脆弱性スキャン
以下の通り脆弱性スキャンを実施したところ、確認対象であるCVE-2021-43808
を検知できることが確認できました。
$ local-php-security-checker -path ./koel
Symfony Security Check Report
=============================
5 packages have known vulnerabilities.
composer/composer (2.1.9)
-------------------------
* [CVE-2022-24828][]: Missing input validation can lead to command execution in composer
guzzlehttp/guzzle (7.3.0)
-------------------------
* [CVE-2022-29248][]: Cross-domain cookie leakage
* [CVE-2022-31042][]: Failure to strip the Cookie header on change in host or HTTP downgrade
* [CVE-2022-31043][]: Fix failure to strip Authorization header on HTTP downgrade
* [CVE-2022-31090][]: CURLOPT_HTTPAUTH option not cleared on change of origin
* [CVE-2022-31091][]: Change in port should be considered a change in origin
guzzlehttp/psr7 (1.8.2)
-----------------------
* [CVE-2022-24775][]: Inproper parsing of HTTP headers
laravel/framework (v8.61.0)
---------------------------
* [CVE-2021-43617][]: Image upload bypass
* [CVE-2021-43808][]: Possible cross-site scripting (XSS) vulnerability in the Blade templating engine
symfony/http-kernel (v5.3.4)
----------------------------
* [CVE-2021-41267][]: Webcache Poisoning via X-Forwarded-Prefix and sub-request
[CVE-2022-24828]: https://github.com/composer/composer/security/advisories/GHSA-x7cr-6qr6-2hh6
[CVE-2022-29248]: https://github.com/guzzle/guzzle/security/advisories/GHSA-cwmx-hcrq-mhc3
[CVE-2022-31042]: https://github.com/guzzle/guzzle/security/advisories/GHSA-f2wf-25xc-69c9
[CVE-2022-31043]: https://github.com/guzzle/guzzle/security/advisories/GHSA-w248-ffj2-4v5q
[CVE-2022-31090]: https://github.com/guzzle/guzzle/security/advisories/GHSA-25mq-v84q-4j7r
[CVE-2022-31091]: https://github.com/guzzle/guzzle/security/advisories/GHSA-q559-8m2m-g699
[CVE-2022-24775]: https://github.com/guzzle/psr7/security/advisories/GHSA-q7rv-6hp3-vh96
[CVE-2021-43617]: https://github.com/laravel/framework/pull/39666
[CVE-2021-43808]: https://github.com/laravel/framework/security/advisories/GHSA-66hf-2p6w-jqfw
[CVE-2021-41267]: https://symfony.com/cve-2021-41267
Note that this checker can only detect vulnerabilities that are referenced in the security advisories database.
Execute this command regularly to check the newly discovered vulnerabilities.
脆弱性の修正確認
v5.1.11では脆弱性の対象バージョンである、v8.77.1がインストールされています。
そこで、バージョンを変更して、脆弱性が検知されないことを確認します。
git switch --detach refs/tags/v5.1.11
バージョンが変更できたので脆弱性スキャンを再度実施したところ、脆弱性が検出できたライブラリが5から3つに減り、CVE-2021-43808
が検出されないことを確認できました。
$ local-php-security-checker -path ./koel
Symfony Security Check Report
=============================
3 packages have known vulnerabilities.
composer/composer (2.2.1)
-------------------------
* [CVE-2022-24828][]: Missing input validation can lead to command execution in composer
guzzlehttp/guzzle (7.4.1)
-------------------------
* [CVE-2022-29248][]: Cross-domain cookie leakage
* [CVE-2022-31042][]: Failure to strip the Cookie header on change in host or HTTP downgrade
* [CVE-2022-31043][]: Fix failure to strip Authorization header on HTTP downgrade
* [CVE-2022-31090][]: CURLOPT_HTTPAUTH option not cleared on change of origin
* [CVE-2022-31091][]: Change in port should be considered a change in origin
guzzlehttp/psr7 (2.1.0)
-----------------------
* [CVE-2022-24775][]: Inproper parsing of HTTP headers
[CVE-2022-24828]: https://github.com/composer/composer/security/advisories/GHSA-x7cr-6qr6-2hh6
[CVE-2022-29248]: https://github.com/guzzle/guzzle/security/advisories/GHSA-cwmx-hcrq-mhc3
[CVE-2022-31042]: https://github.com/guzzle/guzzle/security/advisories/GHSA-f2wf-25xc-69c9
[CVE-2022-31043]: https://github.com/guzzle/guzzle/security/advisories/GHSA-w248-ffj2-4v5q
[CVE-2022-31090]: https://github.com/guzzle/guzzle/security/advisories/GHSA-25mq-v84q-4j7r
[CVE-2022-31091]: https://github.com/guzzle/guzzle/security/advisories/GHSA-q559-8m2m-g699
[CVE-2022-24775]: https://github.com/guzzle/psr7/security/advisories/GHSA-q7rv-6hp3-vh96
Note that this checker can only detect vulnerabilities that are referenced in the security advisories database.
Execute this command regularly to check the newly discovered vulnerabilities.
参考記事
Discussion