yamory Blog

PHPにおける脆弱性との向き合い方とその対策方法

PHPはWebサイト、Webアプリケーション、CMS(コンテンツ管理システム)等で、広く使われている言語です。
習得コストが比較的低く始めやすいために、実際に業務でもPHPを用いて開発・運用しているプロジェクトも多いのではないでしょうか。
またWebアプリケーションのみならず、WordPressやJoomla!といったPHPによるCMSで構築されたブログ・Webメディアサイトも多く見かけるようになりました。
お問い合わせフォームを、フレームワーク/ライブラリを用いずに実装するケースもあるでしょう。

PHPは、その人気の高さゆえに利用者も多く、様々なプロジェクトで稼働しているため、不正アクセスのターゲットになっています。
今回は、PHPとその環境下で動作するWebアプリケーションに焦点を当て、新しく出てくる脆弱性との向き合い方をお伝えします。

PHPで構築されたWebアプリにおける脆弱性が潜む場所

まずはじめに、PHP Webアプリケーションにおいて、脆弱性が潜む場所として、大きく以下の3つに分類されます。

  1. PHP本体
  2. 利用しているフレームワーク/ライブラリ/CMS(コンテンツ管理システム)
  3. 独自に実装したコード

それぞれに注意を払う必要がありますので、ひとつずつ見ていきましょう。

1. PHP本体

PHP本体は、コアと呼ばれる本体部に加え、150を超える拡張モジュールで構成されています。
本体はもちろん、各々の拡張モジュールに脆弱性が発見されると、その都度修正対応がなされるため、頻繁にアップデートされています。

最近でも2019年12月18日に、本記事執筆時点でサポートしているすべてのPHPバージョン(7.4、7.3、7.2)において脆弱性が発見されており、脆弱性対応が行われたアップデートが提供されています(詳細は PHP: Hypertext Preprocessor をご参照ください)。

上記のみならず、PHP 7.x系(7.0〜7.4)の変更履歴(PHP 7 ChangeLog)を見ても、CVEという脆弱性管理番号が発番されているものだけでも150件を超える脆弱性に対応したことが記されています。

すべての脆弱性に高いリスクがあるとは言えませんが、PHP development team自身もリリースノートで最新版へアップグレードすることを推奨していることから、定期的にPHP本体のアップデートを行っていく必要があることが見てとれます。

2. 利用しているフレームワーク/ライブラリ/CMS(コンテンツ管理システム)に潜む脆弱性

Webアプリケーション上で利用しているフレームワークやライブラリについても脆弱性が出ていないかどうかも、チェックしなければなりません。
PHPで著名なフレームワークといえば、Laravel, Symfony, CakePHP, CodeIgniter, Zend Framework等がありますが、いずれも過去のバージョンに脆弱性があることが公表されています。
Webアプリケーションのセキュリティとは」でもご紹介したように、脆弱性が含まれたバージョンを利用し続けると、脆弱性を突かれて管理画面やデータベースに不正アクセスされる可能性が高まります。
特にエクスプロイトコードと呼ばれる(セキュリティ上問題があることを)概念実証コードが流通しているとと、格段にリスクが高まると言えます。

CMS(コンテンツ管理システム)についても同様です。WordPressやJoomla!等のCMSは世界中で利用者も多く、脆弱性とエクスプロイトコードが公表されると、不正アクセスを受け情報流出が起きえるリスクが急速に高まります。

このように、OSSのフレームワーク/ライブラリ/CMSを使うということは、そのOSS自身の脆弱性リスクも知り把握する必要があるという認識が必要です。

3. Webアプリケーション上で独自に実装したコードが引き起こす脆弱性

PHPでは設定の自由度が高く、関数の使い方ひとつで XSS(クロスサイトスクリプティング)や SQL Injectionといった脆弱性に繋がります。
PHPのマニュアルでも「セキュリティ」の項目があり、開発者自身がよりセキュアなコーディングができるように、セキュリティリスクの理解を深める意識が大切です。
また、実装したコードについても、定期的にセキュリティ診断(脆弱性診断・検査)を実施することをお勧めします。

脆弱性を知る・見つけるには

PHPに関わる多くの脆弱性については、脆弱性が公表される際にCVEと呼ばれる個々の脆弱性管理するために、固有の識別番号が採番されます。
CVEを元に脆弱性情報を閲覧できるサイト、例えば CVE Details や日本語ですと JVN (Japan Vulnerability Notes) で情報を得ることができます。
また、FriendsOfPHPによるsecurity-advisoriesリポジトリでは、様々なPHPプロジェクトおよびライブラリに潜む脆弱性の詳細を体系的にまとめられています。

自身のWebプロジェクトで使用しているPHP本体およびPHPライブラリそのバージョンを把握した上で、定期的にウォッチして対策していくことが大切です。

どうやって脆弱性に向き合い、対策していけばよいか

日々新しい脆弱性情報が公表され、脆弱性の対応を行った新しいバージョンがリリースされていく中で、自身のプロジェクトで使っているPHPライブラリとそのバージョンを把握し、脆弱性が公表されているかをウォッチし続けることは容易ではありません。
ましてや開発・運用に関わるエンジニアが少ないプロジェクトでは、ウォッチし続けるリソース・工数を確保することも困難でしょう。

PHPの公式マニュアルでは、下記のように言及されています。

他のシステムレベルのスクリプト言語やプログラムと同様に、最善の アプローチは、頻繁に更新し、最新のバージョンとその変更を 注視し続けることです。

引用元: 最新版を維持する(PHP マニュアル)

古いバージョンのまま放置すると、付随してライブラリも新しいバージョンにアップデートできず、利用中のバージョンで脆弱性が発見されたとしても、対策をすぐに行うことが難しい状況となってしまいます。
また最新のバージョンを用いることで、脆弱性対策がなされ、よりセキュアに利用できることのほか、パフォーマンスが改善されてたり、開発者向けの新機能(新しい関数や構文など)が使えるようになるなど、実業務で開発するにあたってのメリットも享受できます。

つまり、最新バージョンにアップデートしていける仕組み・体制を整え、アップデートしていく取り組み(いわゆるパッチマネジメント)が非常に重要になるのです。
それでは、PHPで開発を行っているWebアプリケーションにおいて、Web開発者はどのように脆弱性と向き合い、セキュアな環境にしていくとよいのでしょうか。

PHP本体については定期的にアップデートする計画を立てる

PHPのサポートについては、公式サイトにある Supported Versions によると、以下のような方針となっています。

  • PHPの各リリースブランチは、最初の安定リリースから2年間完全にサポート。
    • この期間中に、報告されたバグとセキュリティの問題は修正される
  • 2年間のアクティブサポートの後は、重大なセキュリティ問題についてのみサポートする「セキュリティサポート」期間として1年間設けられている
  • セキュリティサポート期間が終了すると、サポート終了する
PHP Supported Versions (visualised as a calendar)
PHPの各バージョンのサポート期間は公式サイトで公開されています(画像は本記事公開時点のものです)

PHPの各リリースは年1回のペースで実施されています。なるべくリリースに追従できるように計画を立てておきましょう。

使っているライブラリ(パッケージ)を把握し、アップデートを行う

対応方針の基本は「パッチマネジメント(アップデート)」になります。
つまり、脆弱性管理の出発点は、利用しているライブラリを把握することから始まります。

PHPにおいては、2012年頃から Composer というPHPパッケージの依存性管理ツールが登場しました。
依存性管理ツールというと難しく聞こえますが、利用しているPHP ライブラリ(パッケージ)を一元管理できるツールであるとご理解ください。

Composerは、ここ数年でPHP開発者が利用するデファクトスタンダードなツールとなっており、実業務で利用されている方も多くいらっしゃると思います。
まだお使いでない方、もしくは直接ライブラリのソースをダウンロードしてプロジェクトに組み込んでいる方は、
プロジェクトにComposerを導入して「PHPのライブラリとそのバージョン」を一元管理できるようにしましょう。

Composerを導入することで、例えば新たにPHPのあるライブラリに脆弱性が発見された際も、composer update で容易にアップデートが行えるようになるため、未導入時と比較してライブラリの管理コストを大幅に削減できます。

このようにして最新のバージョンにアップデートを迅速に行える仕組みが整えていくことにより、Webアプリケーションをよりセキュアに運用ができ、そのための運用コストも削減していけるのです。

yamory を導入することでPHP Webアプリケーションの脆弱性チェックが行えます

脆弱性自動管理ツール「yamory」は、アプリケーションに含まれるOSSの一覧を自動で作成し、脆弱性の有無、さらには攻撃用コードが流通していないかまで自動で確認し、攻撃リスクの高いOSSの脆弱性とその対応方法を提供するツールです。
Composer が管理しているパッケージ管理データをスキャンすることができ、利用しているPHP本体ならびにフレームワーク/ライブラリに脆弱性情報が出ていないかをチェックすることができます。
これにより、新しく発見される脆弱性に早期に気付くことができます。
また、発見された脆弱性にエクスプロイトコードと呼ばれる攻撃コードが流通している場合は、非常にリスクの高い脆弱性であることが一目で把握できるようになっています。

yamory を使って、よりセキュアなPHP Webアプリケーション運用をぜひお試しください。

「yamory」の詳細はこちら