PHPアプリケーションの脆弱性は本当に多いのか?
前回のエントリを書いた後にSecurityForcus(http://www.securityfocus.com/)で公開された記事によると、2006年度のCVEレポートのおよそ43%がPHPアプリケーションであったとしています。Webアプリケーションに限らず、OS、サーバ、クライアントアプリケーションなど、コンピュータソフトウェアすべての脆弱性のうちの43%です。
確かに43%という数字はすごい数字です。前回はregister_globals=onの場合にのみ攻撃可能な脆弱性が脆弱性の数をかさ上げしていると書きました。今回も多くのPHPアプリケーションがCVEに登録されている理由を分析してみます。
同じアプリに含まれる複数の脆弱性
PHPアプリケーションに限らず、セキュリティホールがあるアプリケーションの多くは、複数のセキュリティ上の問題を持っていることが多くあります。CVEのエントリは脆弱性1つで1エントリを作成するようになっています。これはCVEが脆弱性を一意に特定できる番号を付けることを目的としているからです。
セキュリティホールがあるアプリケーションの多くには、コーディングミスより設計ミスと考えられるミスが含まれています。代表的な設計ミスは、プログラムの処理を開始した直後にユーザ入力を厳格にチェックせず、ユーザ入力を使う直前になってから不正な文字などを削除するサニタイズ処理を行うというミスです。
PHPに限らず、どのような言語を利用していても、ユーザ入力はプログラムが予定している入力の範囲内かつ正しく意味のある入力になっているか、「厳格」にチェックしなければなりません。入力を厳格にチェックする正しい設計を行っているアプリケーションは、たとえミスがあっても、非常に多くの脆弱姓を同時に指摘されることは少ないです。
セキュリティを確保しづらいアプリケーションが多い
PHPで実装されたCMS、ブログ、BBSアプリケーションは非常に多いです。これらのアプリケーションは、ユーザの入力をデータベースに保存し出力したり、文字の装飾やレイアウトを許可していたり、プラグインによる機能拡張が可能であることが多いです。
CMS、ブログ、BBSアプリケーションは機能も多く、危険性が高いHTML/CSSによる見栄えの変更を許可していることが当たり前になっています。例えば非常に有名なphpBBも2006年9月から12月の間に10件のCVEエントリが作成されています。
これらのアプリケーションには設計の問題もありますが、アーキテクチャ上の問題もあります。プラグインによる機能拡張はセキュリティを維持しづらく、phpBBに限らずほかのアプリケーションでもプラグイン関係の脆弱性も多くCVEに登録されています。
PHPで書かれたOSSのWebアプリが多い
PHPで書かれたOSSのWebアプリは、ほかの言語のアプリケーションに比べて多いです。
SourceForge.netの言語別プロジェクト登録数(2007/1/29)
言語 | 登録数 |
PHP | 15081 |
Perl | 6483 |
Python | 6033 |
Ruby | 749 |
Java | 21982 |
Javaの登録数のほうが多いですが、登録されているプロジェクトの概要をざっとみると、PHPはほとんどWebアプリケーションであり、ほかの言語はWebアプリケーション以外が非常に多いことが分かります。
CVEに登録される脆弱性を持ったソフトウェアは、オープンソースのアプリケーションである場合が多く、ほかの言語に比べて非常に多くのWebアプリケーションが公開されているPHP Webアプリの脆弱性が多くレポートされるのはある程度仕方ないと言えます。
被害を避けるには?
広く利用されているPHPアプリケーションを使うとphpBBにあったワーム事件のような攻撃を受けるリスクが高くなります。一方、あまり広く利用されていないアプリケーション(=攻撃や研究対象になりづらいアプリケーション)は脆弱性があまり報告されませんが、安全とはいえません。最近の攻撃の傾向として、悪戯より金銭目的の攻撃が増えています。目的が変わったため、攻撃された事実が判明しづらくなってきています。脆弱性の報告が少ない、またはないからと言って、安全なアプリケーションと考えることは出来ません。
被害を避けるには、フリーな製品・商用の製品の区別なく、Webアプリケーションは非常にリスクが大きいアプリケーションであることを認識する必要があります。導入前には製品のセキュリティ情報を分析し、必要な機能・利用範囲(※)に絞って利用し、導入後はセキュリティ情報の収集と分析を定期的に行うことが重要です。