PHPでexec
やshell_exec
が動かず、原因究明から解決までを共有します。
問題の発生
PHPのexec
やshell_exec
を使用して、コマンドを実行させたいが、コードを実行させると以下のエラーが発生。
echo exec('echo 2', $out);
→ mod_fcgid: stderr: PHP Warning: exec(): Unable to fork [echo 2] in
shell_execでも同様の現象。
結論
WAFがONの状態でした。コマンド対策・PHP対策をOFFにすると動きます。
デフォルトはOFFなのですが、数年前にONにしたことを忘れていました。。
原因解決まで行ったこと
Laravelのtinkerで確認
tinkerを使うと動作することを確認。
php artisan tinker
exec('echo Hello', $output);
= "Hello"
Laravel でなく素PHPで検証
素のPHPに移して実行しても動作せず。
PHPの設定の確認
PHPのdisable_functions
設定を確認。exec
やshell_exec
が無効化されている可能性があったため、以下のコードで確認。
var_dump(ini_get('disable_functions'));
結果を見ると、exec
もshell_exec
も無効化されていない。
サーバーのリソース制限を確認
レンタルサーバーなので、リソース制限を設定していると考え、ulimitを使って確認。
ulimit -a
open files ・ max user processes の制限もなし。
ドメインを変えて確認
別ドメインで検証したところ、動作を確認。
ああ、忘れていた。WAFの存在を。
WAFの設定変更
設定変更後、問題なく動作。
たまにアクセスログを見ると攻撃がしっかりブロックされているので、結構便利なWAF。
エックスサーバーのWAFはシンプルな設定しかできませんが、個人利用なら十分攻撃を弾いてくれています。