この記事は速報性は全く無いです。脆弱性自体は2024年の11月に発表されたものです。すでにまとめ記事を書いてくれている人もいるので、自分の管理しているアプリケーションが脆弱性に対して対応が済んでいるかどうかは、まとめ記事を参考にして確認してください。
Laravelの脆弱性CVE-2024-52301が個人開発しているプロダクトに影響するかを調べてみた #PHP - Qiita
脆弱だったコードを確認
Laravelの修正コミットを見れば分かりますが、単純に不具合と呼ぶべきものです。
1 | $args = $_SERVER['argv'] ?? null; |
register_argc_argv
がONの場合、Webアプリケーションにおいても $_SERVER['argv']
が設定されます。そして、Laravelはその中身を使って環境判定を行います。これを悪用することで、クエリパラメーター経由で環境判定を操作できます。
この攻撃が成立して被害を受ける条件
条件は全部で3つです。一個ずつ見ていきましょう。
条件1 register_argc_argv がONに設定
PHPをどのようにインストールしたかによって、この条件の成立難易度が変わります。OSにパッケージマネージャー経由、またはソースコードからコンパイルを行った場合はデフォルトの php.ini
が設定されます。デフォルトの php.ini
において register_argc_argv
はOFFに設定されているので、攻撃が成立しません。
しかし、DockerHubのPHPの公式イメージを使った場合、php.ini
がありません。そのため、意図して設定しないかぎり register_argc_argv
はデフォルト値になります。そして、そのデフォルト値はONです。
これについては、internalsでも議論されておりデフォルトをOFFにしないか?という話がありましたが有耶無耶に立ち消えております。
DockerHubのPHP公式イメージを使っている方は、php.ini
が設定されていることを確認しましょう。
条件2 未対策の古いLaravelバージョンを使っている
今回の脆弱性は、非常に危険なので、セキュリティフィックス対象外のバージョン6から8にも修正コミットが追加されています。しかし、6未満については未対応なので、この脆弱性に対して脆弱な状態になっています。修正内容自体は大したことないので、6未満のバージョンを使っている人でも、速やかに修正をいれることをおすすめします。
条件3 APP_ENVがlocalの場合に攻撃者に情報がみえる
例えば、開発環境の場合は画面上にデバッグログを表示するなどしている場合、攻撃者は通常は見れない様々な情報を見ることが可能です。そして、その情報の中にさらなる攻撃に使えそうな情報が含まれていたり、本番サーバーに余分な負荷がかかったりすることで、攻撃が成立します。
整理してみると、攻撃が成立するまでには様々な条件が必要になるため、実際にこの脆弱性で被害を受けるアプリケーションはそんなに多くないかもしれません。しかし、攻撃者の観点から見れば、一つのアプリケーションだけでも攻撃が成立すれば成功です。Laravelを使っている開発者に置かれましては、これらの攻撃条件が揃ってしまわないように確認を行いましょう。
まとめ
本当に危ない脆弱性です。攻撃方法も容易です。そして、Laravelはめちゃくちゃ流行っているフレームワークです。そう考えると、今もどこかに攻撃を受けているアプリケーションがあるはずです。このブログを読んで、そういえば確認してないな?っという方がおられましたら、確認はすぐできますので、必ずチェックしてください。