Standing on the Shoulder of Linus

Home / 2013 / 10月 / 09 / 匿名関数を disable_functions = create_function で無効化する

匿名関数を disable_functions = create_function で無効化する

PHP には、create_function という、匿名関数を生成する関数があります。 WordPress Database Table and wp_head Injections では、create_function を利用して悪意あるコードを実行する攻撃例が紹介されていました。

PHP5.2 以前では、create_function を使うと便利なケースがありました。しかし、PHP5.3 でクロージャ が導入されたため、create_function が重宝するケースはほとんどありません。また上述の PHP マニュアルでも、

この関数は、内部的に eval() を実行しているので、 eval() と同様にセキュリティ上のリスクがあります。

と記載されています。

php.ini で create_function を無効化する

php.ini の設定で、create_function を無効化することができます。

disable_functions = create_function

と記述すれば OK です。手元の環境では、この記述をすると、

PHP Warning: create_function() has been disabled for security reasons in ファイル名

と表示されました。

WordPress コアでは create_function が使用されている

create_function を無効化することで、create_function を使用した攻撃は防げます。しかし、問題があります。なんと、WordPress コアで create_function を使用しています。

たとえば wp-includes/po.php の read_entry 関数では、

$is_final = create_function('$context', 'return $context == "msgstr" || $context == "msgstr_plural";');

という記述があります。

WordPress は、現時点でも PHP5.2 系をサポートしています。このためクロージャでの実装ではなく、匿名関数での実装となっているのでしょう。なので、create_function を無効化すると、WordPress の挙動に影響する可能性が高いです。

関連

Posted in php | Tagged eval, クロージャ, セキュリティ
← FuelPHP 2.0 はこうなる Novius OS で子ページ一覧を表示。Wijmo アコーディオン →

アーカイブ

人気の投稿とページ

  • キンドル本を印刷する(PDFに変換する)方法
  • 名古屋駅から国際センターまでの道のり(徒歩)
  • AGPL ライセンス(GPLとは似ているが違いもある)
  • 6年使ったイーモバイル(Y!mobile)を解約手続。店頭でSIM返却
  • JP-Secure SiteGuard WP Pluginは不正ログイン防止に役立つか

プロフィール

水野史土:月70万PVホームページ制作会社のレスキューワーク株式会社で、PHPソフトウェアのサポートを行っている。concrete5コミュニティリーダー、Novius OSコアコード貢献者でもある。 詳しくは管理者詳細参照。
大好評WordPress書籍「WordPressユーザーのためのPHP入門 はじめから、ていねいに。」サポートページ

Copyright © 2015 Standing on the Shoulder of Linus.