なぜPHPアプリにセキュリティホールが多いのか?

第3回Webアプリは気楽なアプリ?!

利用者と開発者の認識

内閣府の調査http://www8.cao.go.jp/survey/h18/h18-chian/index.html )によると、⁠不安になる場所」として「インターネット空間」と答えた人が40.1%いたそうです。前回の調査が19.1%だったので倍増しています。しかし、一般のインターネットユーザで不安に感じられる方の多くは具体的な脅威を感じているのではなく、自分の個人情報が漏れたり悪用されるかもしれない、ウィルスなどに感染するかもしれないなど、漠然とした不安を感じているのだと思います。有名サイトを参照するだけ、“普通”にインターネットを利用しているだけでも、PCの使い方を間違えるといつ被害にあってもおかしくないと感じているユーザは多くないと思います。しかし、現実には普通の使い方であっても被害に会いかねない状態になっています。

一方開発者はというと、プログラムに脆弱性があるとセキュリティ上の問題が発生する危険性があると認識はしています。にもかかわらず正しいセキュリティ対策を行っていない場合が非常に多くあります。⁠ほかのサイトでも多少脆弱性があるサイトを運用していても問題になっていない」といった意識も少なくないようです。結果として非常に危うい状態で運用されているサイトが非常に多くなってきています。

Webアプリは気楽なアプリ?!

最近でこそ少なくなりましたが、Webアプリに対して「手軽につくれる気楽なアプリ」といった認識の仕方をしている方も少なくありません。セキュリティの専門家に「一般ユーザが利用するアプリケーションで最も危険性が高いアプリケーションはなに?」と聞くと、多く専門家は「Webアプリケーション」と答えるはずです。Webアプリケーションは作る側にとっても利用する側にとっても非常に大きな危険を伴うアプリケーションです。

ブラウザの脆弱性やブラウザのプラグインの脆弱性は次々に見つかっています。ブラウザやシステムの脆弱性を攻撃してスパイウェアやルートキットをインストールさせるサイトも後を絶ちません。プラグインにも危険な脆弱性が多く見つかっています。Acrobat Readerの脆弱性で任意JavaScriptが実行できたり、FlashPlayerの脆弱性でREFERERヘッダを改ざんできる問題は記憶に新しいと思います。どの脆弱性を致命的な脆弱性と考えるかは基準によって変わりますが、筆者の基準では、2006年はインターネットエクスプローラが致命的な脆弱性なしに利用できた日は一日もありませんでした。Firefoxも安全かというと度々脆弱性が見つかっており、この原稿を書いている現在でも致命的といえるセキュリティホール(悪意をもったサイトが任意サイトのクッキーを設定できる脆弱性。JavaScriptを無効にすれば回避可能)を修正したバージョンはリリースされていません。

ブラウザのみでなくOSやアプリケーションにセキュリティ上の問題がある場合も多くあります。Windowsを利用しているホームユーザは、管理者権限を持つユーザを通常ログインするユーザとして利用していることが非常に多いです。OSやその設定、インストールされたプログラムに脆弱性があるため攻撃に対して脆弱なPCが大量に放置されている現状があります。例えば、Office 2000はMicrosoft Updateに対応していません。手動でアップデートプログラムを実行しなければセキュリティパッチが適用できません。MS WordやMS PowerPointのファイルを開くことにより、システムにマルウェアがインストールされてしまう状態のPCが大量に稼働しています。インターネット上には危険な状態で利用されているPCが大量に稼働しています。その結果犯罪者が自由に操作可能な大量のボットPCやスパイウェア付きPCがインターネットに接続された状態になっています。

Webアプリケーションは、脆弱性があるブラウザでアクセスしアカウントを不正利用されたり、スパイウェアがインストールされたPCでアクセスしたためユーザ名とパスワードを盗まれたりする可能性があることを前提に構築しなければなりません。しかし、多くのWebアプリケーション・Webサイトは、お世辞にも緻密なセキュリティ対策を行っているとは到底言えない状態にあります。たとえば、前回ログインした時間、IPアドレス位はログイン後に確認できるように設計されるべきですが全く表示できないサイトがほとんどです。ログイン時間やIPが表示されなければ、ユーザは不正にデータが改ざんされるまでアカウントの不正利用に気付くことが不可能です。

Webアプリケーションの構築には落とし穴が幾つもあります。しかも、1行でも間違えるだけで致命的なセキュリティ上の問題となる可能性があるものが多くあります。XSS(JavaScript・HTMLインジェクション⁠⁠、SQLインジェクション、CR/LFインジェクション、CSRF(クロスサイトリクエストフォージェリ)など、多くの脆弱性は1行間違えるだけでも発生する可能性があります。

セキュリティは専門知識?!

多くのWebアプリケーションは不特定多数のユーザに公開することを前提としています。不特定多数のユーザにWebサイトを公開するのであれば、サイトの大小に関係なくサイトの安全性を維持する責任があります。すべてのWeb運営者と開発者はセキュリティに対する基礎知識を有していなければなりません。

例えば自動ログイン機能(ログイン状態を維持する機能)の実装は「セッションIDと同じく十分に長いランダムな文字列を鍵として使用すべきです」と解説されます。この解説に対するFAQとして「それでは複数のブラウザからのログイン状態が維持できませんよね?」と聞かれる場合があります。単一のブラウザからのみログイン状態を維持するか、複数のブラウザのログイン状態を維持するかは実装次第です。この質問をされた場合、ほぼ100%の確率で自動ログインの実装にセキュリティ上の問題があります。認証システムのようにセキュリティ上重要な機能でさえ正しい設計と実装が行われてない場合があります。

PHPに限らずプログラミング言語を習得する場合、必ずif文や関数、演算などの構文を覚えます。多くの言語や開発フレームワークの入門書は「構文」「決まり事」は解説していても、セキュリティ対策の解説が不十分な場合がほとんどです。構文や決まり事を覚えるのと同じように、セキュリティの基礎知識を習得した後にアプリケーションを構築しなければなりません。セキュリティの基礎知識は専門知識ではなく、運営者・開発者全員の「常識」にならなければなりません。

真面目に取り組まなければWebアプリは「気楽につくれるアプリ」です。アプリケーション開発者の間に「PHPは気楽に簡単にWebアプリケーションが作れる言語」といった認識があるのは事実です。実際、ポイントを押さえていれば安全なWebアプリケーションを簡単に構築可能です。

しかし、本格的なWebアプリの構築は気楽なものではありません。真面目に取り組めば取り組むほど厄介です。XSSはあらゆる場所で発生する可能性があります。Webアプリケーションはシステムの性質上DoSに脆弱になりやすいです。真面目に取り組めば取り組むほど、セキュリティチェック用のコードやログコードが増えます。

PHPは「気楽にWebアプリを作れる言語」として人気が出たため、セキュリティに配慮していないコードが大量に出回っています。セキュリティ上問題があるコードを参考にさらに別のコードが書かれる、といった例も少なくありません。このような状態を解消するためにも「セキュリティ知識の常識化」が必要になります。

おすすめ記事

記事・ニュース一覧