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

第32回PHPセキュリティ月間(Month of PHP Sercurity)

3年前にMonth of PHP Buug(MOPB)としてPHP本体のセキュリティ上の問題を公開したStefan Esser氏が、今年の3月にPHPとPHPアプリケーションやセキュリティ上の問題を公募し公開するPHPセキュリティ月間(Month of PHP Security - MOPS)プロジェクトを行われました。

MOPBのレポートもこのサイトで公開されています。PoCは当初は公開されていましたが、ドイツの法改正に伴い攻撃手法の公開が禁止され、削除されていました。詳しい事情は分かりませんが、現在はまた公開されているようです。

Stefan Esser氏に許可を得たので、これから数回に渡ってこのプロジェクトについて紹介します。

Month of PHP Securityとは

MOPBは個人プロジェクトとして行われましたが、Month of PHP Secrityはセキュリティ関連企業のスポンサーもあり、PHPセキュリティ関連論文のコンテストも行われ公開されました。論文コンテスト以外のバグ(脆弱性)レポートにはMOPBでは含まれなかったPHPアプリケーションの脆弱性も公開されました。

公開されたバグ

全部で61のセキュリティ関連のバグが公開され、そのうち11がPHPアプリケーションの問題でした。MOPSは前回のMOPBに比べ、PHP本体のバグで緊急性の高いバグは報告されませんでした。PHPの仕様上修正が難しい問題以外は最新版のPHPリリースでは既に修正されています。

緊急性の低いバグとはいえ、MOPSで公開されたメモリリークバグや任意コード実行のバグは共有サーバでは非常に重大なセキュリティ上の問題です。例えば、MOPBではメモリリーク脆弱性を利用し、Apache Web ServerのSSL秘密鍵を取得する実証コード(PoC)が公開されています。

公開されたバグには攻撃用のPHPスクリプトを利用すれば、任意コード実行が可能なものも含まれています。PHPをセーフモードで動作させ、システムへのアクセスを制限している場合でも、これらの脆弱性を利用すればシステムに自由にアクセスされる可能性もあります。

公開されたバグの一覧

  1. hash_update_file関数の解放済リソースへのアクセス
  2. Campsite(PHPアプリ)のTinyMCEモジュールの添付モジュールSQLインジェクション
  3. PHPのdechunkフィルタの符号付き整数比較
  4. ClanSphere(PHPアプリ)のCaptchaのブラインドSQLインジェクション
  5. ClanSphere(PHPアプリ)のMySQLドライバの一般ブラインドSQLインジェクション
  6. PHPのaddslashes関数への割り込み脆弱性
  7. ClanTiger(PHPアプリ)のshutboxモジュールのs_email SQLインジェクション
  8. PHPのchunk_slipt関数への割り込み脆弱性
  9. PHPのshm_put_var関数の解放済リソースへのアクセス
  10. PHPのhtmlentities関数の割り込みメモリ情報リーク
  11. DeluxBB(PHPアプリ)のSQLインジェクション脆弱性
  12. PHPのsqlite_single_query関数の未初期化メモリへのアクセス
  13. PHPのsqlite_array_query関数の未初期化メモリへのアクセス
  14. ZEND_BW_XORオペコードへの割り込みによるアドレス情報リーク
  15. ZEND_SLオペコードへの割り込みによるアドレス情報リーク
  16. ZEND_SRオペコードへの割り込みによるアドレス情報リーク
  17. PHPのpreg_quote関数への割り込みによるアドレス情報リーク
  18. EFront(PHPアプリ)のask_chat, chatroom_IDへのSQLインジェクション
  19. Serendipity(PHPアプリ)WYSIWYGエディタプラグイン設定インジェクション
  20. Xhina(PHPアプリ)WYSIWYGエディタプラグイン設定インジェクション
  21. PHP fnmatch関数スタック枯渇
  22. リクエスト終了処理後のPHPストリームコンテクストの解放
  23. Cacti(PHPアプリ)のグラフビューアーSQLインジェクション
  24. PHPのphar_stream_flushフォーマット文字列脆弱性
  25. PHPのphar_wrapper_open_dirフォーマット文字列脆弱性
  26. PHPのphar_wrapper_unlinkフォーマット文字列脆弱性
  27. PHPのphar_parse_urlフォーマット文字列脆弱性
  28. PHPのphar_wrapper_openurlフォーマット文字列脆弱性
  29. CMSQlite(PHPアプリ)のcパラメータSQLインジェクション
  30. CMSQlite(PHPアプリ)のmodパラメータローカルファイルインクルード
  31. e107のlongnameユーザ設定のSQLインジェクション
  32. PHPのiconv_mime_decode関数への割り込みによるメモリ情報リーク
  33. PHPのiconv_substr関数への割り込みによるメモリ情報リーク
  34. PHPのiconv_mime_decode関数への割り込みによるメモリ情報リーク(その2)
  35. e107のBBCodeリモートコード実行
  36. PHPのhtmlentities関数とhtmlspecialchars関数への割り込みによるメモリ情報リーク
  37. PHPのstr_getcsv関数への割り込みによるメモリ情報リーク
  38. PHPのhttp_build_query関数への割り込みによるメモリ情報リーク
  39. PHPのstrpbrk関数への割り込みによるメモリ情報リーク
  40. PHPのstrtr関数への割り込みによるメモリ情報リーク
  41. PHPのstrip_tags関数への割り込みによるメモリ情報リーク
  42. PHPのsetcookie関数への割り込みによるメモリ情報リーク
  43. PHPのstrtok関数への割り込みによるメモリ情報リーク
  44. PHPのwordwrap関数への割り込みによるメモリ情報リーク
  45. PHPのstr_word_count関数への割り込みによるメモリ情報リーク
  46. PHPのstr_pad関数への割り込みによるメモリ情報リーク
  47. PHPのtrim/rtrim/ltrim関数への割り込みによるメモリ情報リーク
  48. PHPのsubstr_replace関数への割り込みによるメモリ情報リーク
  49. PHPのparse_str関数への割り込みによるメモリ破壊
  50. PHPのpreg_match関数への割り込みによるメモリ情報リーク
  51. PHPのunpack関数への割り込みによるメモリ情報リーク
  52. PHPのpack関数への割り込みによるメモリ情報リーク
  53. ZEND_FETCH_RWへの割り込みによるメモリ情報リーク
  54. ZEND_CONCAT/ZEND_ASSIGN_CONCATへの割り込みによるメモリ情報リークと破壊
  55. ArrayObject::usortメソッドへの割り込みによるメモリ破壊
  56. php_mysqlnd_ok_read関数への割り込みによるメモリ情報リーク
  57. php_mysqlnd_rset_header_read関数のバッファオーバーフロー
  58. php_mysqlnd_read_error_from_line関数のバッファオーバーフロー
  59. php_mysqlnd_auth_write関数のスタックオーバーフロー
  60. PHPのセッションシリアライザの問題によるセッションデータインジェクション
  61. PHPのSplOjbectStorageデシリアライゼイションのメモリ解放後のメモリアクセス

ここで報告された脆弱性の多くは最新版のPHP 5.3.3/PHP 5.2.14では修正済みです。

この一覧を見ると割り込みによるメモリ情報リークのバグが多くレポートされていることが分かります。次回にこの脆弱性がどのような脆弱性か解説します。3年前のMOPBで指摘された脆弱性で現在でも修正されていない「解放済のリソースへのアクセス」とはどのような問題で何故修正されていないのかを次に解説します。

このほかにも新しく追加されたmysqlndドライバにスタックオーバーフローやヒープオーバーフローなど、基本的な脆弱性が複数含まれていたことが分かります。オープンソースのプロジェクトであってもソースコード検査が重要であることのよい例です。これはPHPに限ったことではありません。PHPでは何年も前に修正されているような脆弱性でも、ほかの言語処理系で見つかったりすることは珍しくありません。

公開された論文

10のPHPセキュリティ関連の論文が公開され、それらの論文の著者には賞金と商品が渡されました。一位の「PHPアプリケーションにおけるユーザのパスワードと管理手法」には賞金1000ユーロ、SyScanの招待券、CodeScan PHPが著者のSolar Designer氏に送られました。その他の著者にも賞金や商品が送られました。

論文の一覧

  1. 新しいオープンソースのツール:OWASP ESAPI for PHP
  2. コンテクストを検知するHTMLエスケープ
  3. sqlite_single_query(), sqlite_array_query()の未初期化メモリの利用
  4. 予測不可能なセッションIDとハッシュの生成
  5. Minerva PHP Fuzzer
  6. PHPにおける変数の初期化
  7. 我々の動的PHP - 明白および明白でないPHPコードの挿入の実行
  8. shuhosinモジュール用の設定暗号化パッチ
  9. PHPソースコードの脆弱性を分析する静的ソースコードアナライザ
  10. PHPアプリケーションにおけるユーザのパスワードと管理手法

これらの論文のうち2、7、9、10については次回以降に紹介したいと思います。

まとめ

MOPBはPHP本体のセキュリティを向上させるために非常に役立ったプロジェクトでした。しかしならが、3年前に指摘された問題で現在になっても修正される見通しがない脆弱性もあります。MOPSの紹介が完了した後はMOPSでは紹介されていない未修正の脆弱性について解説したいと考えています。

MOPBがPHPのセキュア化に大きく貢献したように、MOPSもPHPとPHPアプリケーションのセキュリティ向上の大きく貢献することと思われます。

おすすめ記事

記事・ニュース一覧