GitHub Advisory Databaseに、Livewireの認可を回避する3つの問題が掲載されています。操作を許可するか確かめる「認可」に関する問題で、モデル引数を取るメソッドや#[Json]メソッドに#[Authorize]属性を使うアプリが確認対象です。勧告は修正版v4.4.8への更新を案内しており、公開日は提供資料では確認できません。
権限を確かめた対象と、処理する対象がずれる
勧告の識別子は「GHSA-mhf7-xp6r-6qrc」です。問題の一つは、メソッドに渡す引数の整数キーの順序を変えると、認可で確認した対象と、実際に処理する対象が食い違うことです。勧告では、この不一致を悪用すると、他の利用者のコメントを削除できるとしています。
モデル引数を取るメソッドで、#[On]と#[Authorize]を併用した場合にも、同じ問題があります。単に#[Authorize]が付いていることを確認するだけでなく、対象メソッドがどのような引数を受け取るかまで調べる必要があります。
もう一つの問題は、#[Json]と#[Authorize]の併用です。認可を確認する前にメソッドの処理が実行され、403応答が返っても、データベースへの書き込みなどが済んでいる場合があります。拒否の応答が返ったことだけでは、処理を防げたと判断できません。
v4.4.8で引数と実行順序を修正
修正版のv4.4.8では、引数がリスト形式でも文字列キー付きでもないリクエストを拒否します。また、#[Json]メソッドについては、実行前に認可を確認するよう修正しています。
更新できない場合の対応として、勧告は対象メソッド内で$this->authorize(...)を呼び出す方法を案内しています。属性による確認とは別に、処理を行うメソッドの中で認可を確認する方法です。
日本での提供は発表には書かれていません。今回の勧告で示されている影響条件は、地域ではなく、利用する版や認可処理の実装です。
影響する会社・しない会社
- 影響する: 未修正のLivewireで、モデル引数を取るメソッド(
#[On]を使うイベントリスナーを含む)、または#[Json]メソッドに#[Authorize]を使うアプリがある会社です。Livewire 3.xは対象外で、v4.4.8では修正済みです。
- 影響しない: Livewire 3.xを使っている会社は、今回の問題の影響を受けません。
- 影響しない:
#[Authorize]属性を使わないアプリは、勧告の影響対象外です。メソッド内で$this->authorize(...)を呼ぶ認可処理も影響を受けません。
同じ会社のアプリでも、版や実装が違えば確認結果は分かれます。会社全体を一括で「対象外」とせず、アプリごとに確認結果を残す進め方が適切です。