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 の挙動に影響する可能性が高いです。