🎃

Local PHP Security CheckerでPHPプロジェクトで使用している脆弱性をチェックする

2022/07/26に公開

Local PHP Security CheckerとはSCA(Software Composition Analysis)[1]を行うツールの一つで、PHPプロジェクトが依存するライブラリに含まれる脆弱性を検出します。

https://github.com/fabpot/local-php-security-checker

ライブラリに含まれる脆弱性を検出できるか試してみます。

実行環境

  • 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 の影響を受ける以下のプロジェクトに対してスキャンを実施します。

https://github.com/koel/koel

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.

参考記事

https://qiita.com/k-holy/items/1365446217564d2b595a

https://kojirooooocks.hatenablog.com/entry/2021/02/21/022042

脚注
  1. https://owasp.org/www-community/Component_Analysis↩︎

Discussion