PHP における脆弱性との向き合い方とその対策方法
PHP は Web サイト、Web アプリケーション、CMS(コンテンツ管理システム)等で、広く使われている言語です。
習得コストが比較的低く始めやすいために、実際に業務でもPHPを用いて開発・運用しているプロジェクトも多いのではないでしょうか。
また Web アプリケーションのみならず、WordPress や Joomla! といった PHP による CMS で構築されたブログ・Web メディアサイトも多く見かけるようになりました。
お問い合わせフォームを、フレームワーク/ライブラリを用いずに実装するケースもあるでしょう。
PHP は、その人気の高さゆえに利用者も多く、さまざまなプロジェクトで稼働しているため、不正アクセスのターゲットになっています。
今回は、PHP とその環境下で動作する Web アプリケーションに焦点を当て、新しく出てくる脆弱性との向き合い方をお伝えします。
PHP で構築されたWebアプリにおける脆弱性が潜む場所
まずはじめに、PHP Web アプリケーションにおいて、脆弱性が潜む場所として、大きく以下の3つに分類されます。
- PHP 本体
- 利用しているフレームワーク/ライブラリ / CMS(コンテンツ管理システム)
- 独自に実装したコード
それぞれに注意を払う必要がありますので、ひとつずつ見ていきましょう。
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](https://www.cvedetails.com/) や日本語ですと [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の各バージョンのサポート期間は公式サイトで公開されています(画像は本記事公開時点のものです)
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 アプリケーション運用をぜひお試しください。