個人で開発をしているプロダクトで、脆弱性CVE-2024-52301を踏んでしまっているかを調べてみた際の備忘録です。
脆弱性CVE-2024-52301について解説
2024年11月13日ごろに発表されました。
CVSSのスコアは8.7で深刻度は高。
内容としては、php.iniの項目の一つであるregister_argc_argvをonに設定していた場合に、クエリストリングから環境変数を変更できてしまうという内容です。
すでに本脆弱性に対応したバージョンは公開されているので、バージョンを上げることで対処することができる脆弱性です。
なぜかEOLを迎えているバージョン6から9も対応されています、助かりますね!
EOLになってもいろいろな理由でバージョンを上げることができないプロダクト、あると思います。
深刻な脆弱性だった場合はEOL関係なしに修正されるものなんだろうか
register_argc_argvについて解説
php.iniの一項目で、コマンドラインからphpファイルを実行した際に、引数を取得するかしないかを設定する項目です。
詳しくは以下の公式サイトをご覧ください。
つまり脆弱性CVE-2024-52301ってなんなのさ?
register-argc-argvの設定値をonに設定していた場合、クエリストリングで環境変数を変更されてしまう脆弱性。
register_argc_argvの設定値を確認していく
今回の脆弱性を踏んでしまっているかを確認するために、register_argc_argvの設定値を確認します。
(さっさと脆弱性対応済みのバージョンに上げてしまってもいいのですが、気になったので調べてみます)
以下のコマンドでSAPI(Server Application Programming Interface)がFPMを使用している場合。
つまりWebAPI等でphpファイルが実行された際の設定値を確認することができます。
php-fpm -i | grep register_argc_argv
帰ってきた値が以下であれば、今回の脆弱性が発生する要因であるregister_argc_argvの設定値はoffに設定されているので今回の脆弱性は踏んでいないといった具合です。
register_argc_argv => Off => Off
ちなみに自分はハマったのですが、以下のコマンドだと今回の脆弱性とは関係しない、コマンドラインから実行した際のregister_argc_argvの設定値が取得されます。
php -i | grep register_argc_argv
こちらのコマンドラインから実行した際のregister_argc_argvの設定値は、確認をしても意味がないです。
この値は必ずonに上書きされているので、今回の脆弱性が発生する要因になる、SAPIがFPMを使用している場合のregister_argc_argvの設定値とは違う値になるので。
言われてみるとそのとおりなのですが、コマンドラインからphpファイルが実行された場合は必ずphp.iniの設定でregister_argc_argvの設定値はonに上書きされるようになっています。
だからコマンドラインから実行した場合と、SAPIがFPMを使用している場合でregister_argc_argvの設定値が違うわけなんですね。
register_argc_argv
コマンドラインから実行した際のデフォルト値: true
この設定が true なので、CLI SAPI では常に argc (アプリケーションに渡した引数の数) および argv (実際の引数の配列) を使うことができます。
CLI SAPI を使用するときに PHP の \$argc 変数と \$argv 変数が登録され、適切な値がセットされます。 あるいは \$_SERVER や \$_SERVER['argv'] を使うこともできます。
Laravelの機能の一つであるタスクスケジューラーやartisanコマンドといった、性質上コマンドラインから実行する必要がある機能を使用するためには、register_argc_argvの設定値をonにする必要がある。
だからLaravelを使用しているプロダクトではregister_argc_argvの設定値をonにしておかないとLaravelの機能の大半が使用できなくなるのかなと思っていたのですが、コマンドラインから実行する際は自動的にonに書き換えられるんですね...知らなかった...
タスクスケジューラーを実行した際や、artisanコマンドからファイルを実行した際にphp_sapi_nameメソッドを使い、現在使用されているSAPIを確認すると、CLI SAPIが使用されていることが確認できます。
だからregister_argc_argvの設定値をoffに設定していても、タスクスケジューラー等が使えるんですね。
最後に
コマンドラインからphpファイルを実行する際には必ずregister_argc_argvの設定値はonに上書きされる。
なのでコマンドラインで実行した際に引数を取得するかしないかを決めるというregister_argc_argvの性質上、SAPIでFPMが使用されているときには意味のない設定値であるregister_argc_argvをonに設定する必要はない。
なのでほとんどのプロダクトではregister_argc_argvの設定値はoffに設定されているのではないかなと感じました。