Skip to main content

SnykでPHP Composerのセキュリティ脆弱性をテストする

著者
Headshot of DeveloperSteve Coochin

DeveloperSteve Coochin

blog social php composer

2021年5月20日

0 分で読めます

PHPはウェブサイトの構築に広く使われています。ブログからeコマースまで、私たちの日常に深く浸透し、今日利用しているインターネットの大部分を支えています。2020年の主要プログラミング言語に関するWappalyzerのレポートによると、現在インターネットで使われているバックエンド言語のうち、PHPは79%のシェアを占めています。

長年、PHPライブラリを扱ううえで大きな課題のひとつとなってきたのが、パッケージ管理です。ライブラリを簡単にインストールして管理する方法はいくつかあり、PECLやCPANなどが使われてきました。特筆すべきは、2009年に登場したPEARです。ライブラリを読み込み、配布する最初期の方法のひとつとなり、その後PEAR2へと発展。やがてPHP Composerの一部となりました(PHP Composerは今年で9年目)。今回はこれを見ていきます。

PHP Composerとは何ですか?

PHP Composerは、PHPのライブラリや依存関係のインストールと更新に使用されるパッケージ管理ツールです。フレームワークやプロジェクト内でライブラリや依存関係を管理・維持する方法が評価され、急速に普及しました。コマンドラインから操作でき、オートロード機能を備えたPHPアプリケーション、ライブラリ、依存関係をプロジェクト内にインストールできます。PHP Composerは、グローバルには何もインストールしない点に注意してください。

PHP Composerのセキュリティを見てみましょう

PHP Composerを使うとアプリ開発は速くなりますが、その分、制御や可視性が一部失われます。コーディングが簡単になる一方で、安全に使えているのかという疑問も生まれます。Snykなら、数回クリックするだけでその疑問に答えられます。

実際に使われているPHP Composerのプラットフォーム実装をいくつか確認する前に、いくつかお伝えしておきたいことがあります。

  • これらのプラットフォームのユーザー/開発者として調査した結果は、さまざまな点で意外なものでした。安全な開発のためには、継続的な啓発と教育が欠かせないということを改めて実感しました。

  • 以下のすべてのケースで、各コミュニティに連絡を取り、脆弱性について話し合うとともに、まだ認識されていない場合は注意喚起を行いました(すでに修正が提供されていたものも多くありました)。

Kirby

KirbyとComposerを使い始めるには、Kirby meets Composerのドキュメントにある簡単なセットアップ手順に従ってください。

composer create-project getkirby/starterkit hello-world

ComposerはKirbyの最新バージョン(3.3.5)をインストールします。Snyk Vulnerability DBによると、このバージョンには中程度の深刻度の脆弱性が1件、低い深刻度の脆弱性が1件あります。しかし、Snyk CLIでスキャンすると、依存関係のひとつであるPHPMailerに問題が見つかります。使用されているバージョンは6.2.0で、クロスサイトスクリプティングの高深刻度の脆弱性が確認されています。

執筆時点では、PHPMailer 6.4.1でこの問題が修正されています。composer upgradeを実行して最新バージョンに更新すれば解決できます。このモジュールの履歴を確認すると、長年にわたり脆弱性が発見されていることがわかります。そのため、新たな脆弱性が見つかった際にすぐ通知を受けられるよう、Snyk Codeによる定期的なスキャンを強くおすすめします。

Joomla

Joomlaのリポジトリには、実行に必要なすべての依存関係をインストールするComposerファイルが含まれています。Snyk CLIでスキャンしたところ、2件の問題と4つの脆弱なパスが見つかりました。

✗ Medium severity vulnerability found in phpmailer/phpmailer
  Description: Improper Input Validation
  Info: https://snyk.io/vuln/SNYK-PHP-PHPMAILERPHPMAILER-570519
  Introduced through: phpmailer/phpmailer@5.2.28
  From: phpmailer/phpmailer@5.2.28
  Fixed in: 6.1.6

✗ Medium severity vulnerability found in paragonie/random_compat
  Description: Man-in-the-Middle (MitM)
  Info: https://snyk.io/vuln/SNYK-PHP-PARAGONIERANDOMCOMPAT-72081
  Introduced through: paragonie/random_compat@1.4.3, joomla/session@1.6.0, paragonie/sodium_compat@1.9.1
  From: paragonie/random_compat@1.4.3
  From: joomla/session@1.6.0 > paragonie/random_compat@1.4.3
  From: paragonie/sodium_compat@1.9.1 > paragonie/random_compat@1.4.3
  Fixed in: 2.0

Organization:      developersteve-285
Package manager:   composer
Target file:       composer.lock
Project name:      joomla/joomla-cms
Open source:       no
Project path:     /php/joomla-cms
Licenses:          enabled

Tested 39 dependencies for known issues, found 2 issues, 4 vulnerable paths.

Tip: Detected multiple supported manifests (2), use --all-projects to scan all of them at once.

ここでもPHPMailerが見つかりました。インストールされるバージョンは5.2.28です。このバージョンには不適切な入力検証の問題があり、Snykによるとバージョン6.1.6で修正されています。

また、Snykは中間者(MITM)攻撃の脆弱性も検出しました。これは`paragoine/random_compat`のバージョン1.4.3を介して読み込まれ、`joomla/session`に関連しています。中間者攻撃は電子的な盗聴を可能にするため、非常に深刻です。この種の脆弱性について詳しくは、中間者攻撃に関するブログをご覧ください。

Drupal

Drupalリポジトリの便利なガイドを使えば、最新の9.x開発ブランチですぐに環境を立ち上げられます。

composer create-project drupal-composer/drupal-project:9.x-dev some-dir --no-interaction

インストール中に、Snyk Vulnerability Databaseで既知の問題を確認できます。ここでは、注意が必要なDrupalのバージョン履歴にある脆弱性も確認できます。次にSnyk CLIでスキャンすると、9.xは問題なしという結果でした。念のため同じスキャンをDrupal 8.xでも実行したところ、こちらも問題なしでした。よかったです!

この2つのバージョンに問題がないことを確認したところで、今もかなり使われているDrupal 7もチェックしてみましょう。そのために、Drupal 7.xのリポジトリをクローンします。

7.xをスキャンすると、Snyk CLIの結果は少し異なり、9件の脆弱性と18の脆弱なパスが見つかりました。ファイルアップロードの悪用から、DoS、リモートコード実行(RCE)、任意コード実行(ACE)まで、さまざまな問題があります。

✗ Medium severity vulnerability found in drupal/drupal
  Description: Cross-site Scripting (XSS)
  Info: https://snyk.io/vuln/SNYK-PHP-DRUPALDRUPAL-174348
  Introduced through: drupal/drupal@7.80.0, drupal/composer_autoloader@1.3.0
  From: drupal/drupal@7.80.0
  From: drupal/composer_autoloader@1.3.0 > drupal/drupal@7.80.0
  Fixed in: 8.5.15, 8.6.15

✗ Medium severity vulnerability found in drupal/drupal
  Description: Arbitrary Code Execution
  Info: https://snyk.io/vuln/SNYK-PHP-DRUPALDRUPAL-174350
  Introduced through: drupal/drupal@7.80.0, drupal/composer_autoloader@1.3.0
  From: drupal/drupal@7.80.0
  From: drupal/composer_autoloader@1.3.0 > drupal/drupal@7.80.0
  Fixed in: 8.5.15, 8.6.15

✗ Medium severity vulnerability found in drupal/drupal
  Description: Access Control Bypass
  Info: https://snyk.io/vuln/SNYK-PHP-DRUPALDRUPAL-174352
  Introduced through: drupal/drupal@7.80.0, drupal/composer_autoloader@1.3.0
  From: drupal/drupal@7.80.0
  From: drupal/composer_autoloader@1.3.0 > drupal/drupal@7.80.0
  Fixed in: 8.5.15, 8.6.16

✗ Medium severity vulnerability found in drupal/drupal
  Description: Access Restriction Bypass
  Info: https://snyk.io/vuln/SNYK-PHP-DRUPALDRUPAL-538566
  Introduced through: drupal/drupal@7.80.0, drupal/composer_autoloader@1.3.0
  From: drupal/drupal@7.80.0
  From: drupal/composer_autoloader@1.3.0 > drupal/drupal@7.80.0
  Fixed in: 8.7.11, 8.8.1

✗ Medium severity vulnerability found in drupal/drupal
  Description: Arbitrary File Upload
  Info: https://snyk.io/vuln/SNYK-PHP-DRUPALDRUPAL-538568
  Introduced through: drupal/drupal@7.80.0, drupal/composer_autoloader@1.3.0
  From: drupal/drupal@7.80.0
  From: drupal/composer_autoloader@1.3.0 > drupal/drupal@7.80.0
  Fixed in: 8.7.11, 8.8.1

✗ Medium severity vulnerability found in drupal/drupal
  Description: Denial of Service (DoS)
  Info: https://snyk.io/vuln/SNYK-PHP-DRUPALDRUPAL-538570
  Introduced through: drupal/drupal@7.80.0, drupal/composer_autoloader@1.3.0
  From: drupal/drupal@7.80.0
  From: drupal/composer_autoloader@1.3.0 > drupal/drupal@7.80.0
  Fixed in: 8.7.11, 8.8.1

✗ High severity vulnerability found in drupal/drupal
  Description: Arbitrary Code Execution
  Info: https://snyk.io/vuln/SNYK-PHP-DRUPALDRUPAL-1048286
  Introduced through: drupal/drupal@7.80.0, drupal/composer_autoloader@1.3.0
  From: drupal/drupal@7.80.0
  From: drupal/composer_autoloader@1.3.0 > drupal/drupal@7.80.0

✗ High severity vulnerability found in drupal/drupal
  Description: Remote Code Execution (RCE)
  Info: https://snyk.io/vuln/SNYK-PHP-DRUPALDRUPAL-173722
  Introduced through: drupal/drupal@7.80.0, drupal/composer_autoloader@1.3.0
  From: drupal/drupal@7.80.0
  From: drupal/composer_autoloader@1.3.0 > drupal/drupal@7.80.0
  Fixed in: 8.5.11, 8.6.10

✗ High severity vulnerability found in drupal/drupal
  Description: Access Restriction Bypass
  Info: https://snyk.io/vuln/SNYK-PHP-DRUPALDRUPAL-70088
  Introduced through: drupal/drupal@7.80.0, drupal/composer_autoloader@1.3.0
  From: drupal/drupal@7.80.0
  From: drupal/composer_autoloader@1.3.0 > drupal/drupal@7.80.0
  Fixed in: 8.3.1, 8.2.8

Organization:      developersteve-285
Package manager:   composer
Target file:       composer.lock
Project name:      drupal-composer/drupal-project
Open source:       no
Project path:      /Users/developersteve/Desktop/Code/php/drupal/7/my_site_name_dir
Licenses:          enabled

Tested 40 dependencies for known issues, found 9 issues, 18 vulnerable paths.

これらの調査結果を踏まえると、Drupalの実装を安全に保つため、最低でも8.xへのアップグレードをおすすめします。

コミュニティに貢献して支援しよう

こうした広く使われているプラットフォームのテストを始めた当初、何が見つかるのかはわかりませんでした。先ほど述べたように、結果はかなり意外なものでした。本番環境でこれらのプラットフォームを使っている開発者、チーム、企業は、何が取り込まれているのかを把握していないかもしれません。このブログが、より多くのチームの安全につながれば幸いです。

とはいえ、私は一人の開発者にすぎず、これは一つのブログにすぎません。セキュリティに大きな変化をもたらすには、皆さん自身でプロジェクトをテストし、修正に貢献していただきたいと思います。こうしたコミュニティは、世界中の人々の役に立つものを作ろうとする情熱的な開発者によって運営されていることが多く、皆さんの支援を必要としています。

CTFを始めよう

オンデマンドのバーチャル入門ワークショップを視聴して、CTFの課題の解き方を学びましょう。

続きを読む

blog feature snyk container custom base recommendations
Blog

Evo Agentic AppSecのご紹介:AI開発のスピードに対応するセキュリティ

AI駆動型開発のスピードに、従来のセキュリティワークフローは追いついていません。SnykのAgentic AppSecは、セキュリティエージェントが脆弱性を継続的に検出、修正、検証し、人が基準を定められるようにします。

feature insights context
Blog

自律型攻撃はすでに始まっている。防御もそのスピードに追いつかなければならない。

自律型攻撃者によって、防御に使える時間は短くなっています。継続的な検出、修復、検証、予防で、セキュリティチームが攻撃に歩調を合わせる方法をご紹介します。

feature insights context
Blog

予防は、本質的に解決済みの問題なのでしょうか?

エージェントが生成するコードの予防策はアーキテクチャ上解決されていますが、開発を遅らせることなくセキュリティを守る制御を選ぶことが、依然として課題です。