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

第19回文字エンコーディングとセキュリティ(1)

文字エンコーディングを正しく、厳格に取り扱わないと、システムのセキュリティに大きく影響します。しかし、広く利用されているアプリケーションでも、大手サイトでも文字エンコーディングを不適切に取り扱っているケースは少なくありません。

今回から4回に分けて、セキュリティと文字エンコーディングをテーマに、Webアプリケーションがどのようなセキュリティ対策を取るべきか解説します。攻撃方法の解説ではないので具体的な攻撃方法は解説しませんが、どのように攻撃されるのかは簡単に解説します。

文字エンコーディングは厳格に扱わなければならない

問題の解説を始める前ですが、いきなり結論から入ります。それは、非常に簡単な原則であるにも関わらず、あまり多くのサイトやアプリケーションで守られていないからです。

文字エンコーディング取り扱いの原則

文字エンコーディングは厳格に取り扱い、不正な文字エンコーディングを検出した場合、致命的なエラーとして処理しなければならない

これから解説する文字エンコーディング関連の脆弱性は、この原則を守っているだけで多くの問題が防げます。では、早速ですが文字エンコーディングを利用したセキュリティ上の問題を解説します。

文字エンコーディングを利用した攻撃の認知

筆者の知る限り、文字エンコーディングを利用した攻撃を紹介したのは2000年2月にUS-CERTとMicrosoft社が共同で警告した、クロスサイトスクリプティング脆弱性のアドバイザリが初めてです。このアドバイザリ(CA-2000-02)の中で、動的にコンテンツを生成するページではHTTPヘッダで文字エンコーディングを指定しなければならない、としています。

CA-2000-02の

  • Solutions for Web Page Developers and Web Site Administrators ⁠Webページ開発者とWebサイト管理者の対策)

の中で

In addition, web pages should explicitly set a character set to an appropriate value in all dynamically generated pages.

(それに加えて、全ての動的に生成されたWebページは明示的に適切な文字コードセットを設定しなければならない)

としています。

文字エンコーディングを利用した攻撃にはさまざまな種類がありますが、文字エンコーディングを利用した攻撃の危険性を具体的に解説したのは、クロスサイトスクリプティング(JavaScriptインジェクション)の危険性を指摘したこのアドバイザリが初めてだと思います。最初に書いた結論と同じく、文字コード(文字エンコーディング)を適切(明示的)に取り扱うことがクロスサイトスクリプティング攻撃を防ぐための対策として必要である、としています。

文字エンコーディングを利用した攻撃の種類

US-CERTのCA-2000-02を見ると、Webアプリケーションでは文字エンコーディングは厳格に取り扱うべき情報である、と分かると思います。しかし、攻撃対象となるアプリケーションはWebアプリケーションとは限りません。

文字エンコーディングを利用した攻撃対象にはさまざまなバリエーションがあります。

  • SQLインジェクション
  • XPathインジェクション
  • JavaScriptインジェクション
  • HTMLインジェクション
  • XMLインジェクション

JavaScript、HTMLインジェクションはWebアプリケーションが攻撃対象といえますが、マルチバイト文字を取り扱うシステムであれば、文字エンコーディング攻撃に脆弱になる可能性があります。攻撃対象は多いですが、基本的な攻撃の原理は同じです。原理が同じなので対策もほぼ同じなります。この事実は開発者にとって非常に重要ですが、広く知られている、とは言えないのが現状です。

原理は同じで対策もほぼ同じと書きましたが、

  • パス遷移攻撃 (ディレクトリトラバーサル)

文字エンコーディングを利用したこの脆弱性の攻撃は、ほかの脆弱性と種類が異なるので対策が異なります。詳しくは解説しませんが、文字エンコーディング以外のエンコーディングも攻撃に利用可能である例も紹介します。

まとめ

どのように攻撃されるのかは紹介しませんでしたが、文字エンコーディングを利用した攻撃が幾つも存在することを理解していただけたと思います。次回は文字エンコーディングを利用した攻撃の原理を解説します。

おすすめ記事

記事・ニュース一覧