{"id":"GHSA-mhf7-xp6r-6qrc","aliases":[],"status":"published","title":"Livewire: Authorization bypass in #[Authorize] via reordered parameter keys and #[Json] execution order","description":"### Impact\n\nThree issues allowed actions protected by the `#[Authorize]` attribute to run against records the current user is not authorized for:\n\n1. **Out-of-order parameter keys on actions.** `#[Authorize]` resolved a model parameter by its array key, while the action itself received parameters positionally. A request sending params as an object with reordered integer keys (e.g. `{\"1\": 2, \"0\": 1}`) could pass authorization with a record the user owns while the action received a different record. With `#[Authorize('delete', 'comment')]` on `deleteComment(Comment $comment)`, a user could delete another user's comment.\n2. **The same issue on event listeners.** Methods using both `#[On]` and `#[Authorize]` with a model parameter were affected in the same way through the `__dispatch` call.\n3. **`#[Json]` methods ran before authorization.** When a method had both `#[Json]` and `#[Authorize]`, the method body executed before the authorization check. The response was still a 403, but any side effects (such as database writes) had already happened.\n\nOnly applications using the `#[Authorize]` attribute are affected: on methods that take model parameters (issues 1 and 2), or on `#[Json]` methods (issue 3). Authorization performed inside the method (e.g. `$this-\u003eauthorize(...)`) is not affected. Livewire 3.x is not affected.\n\n### Patches\n\nFixed in **v4.4.8**. Call and event parameters must now be a list or use named (string) keys, otherwise the request is rejected, and `#[Json]` methods are authorized before they run.\n\n### Workarounds\n\nUpgrade to v4.4.8. If you can't upgrade right away, call `$this-\u003eauthorize(...)` inside affected methods instead of relying on the `#[Authorize]` attribute.\n\n### Credits\n\nReported by Yousef Aman ([@yousef-aman](https://github.com/yousef-aman)).","severity":{"version":"3.1","score":6.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N","level":"medium","from":"ghsa"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-863"],"published":"2026-10-23T20:51:30Z","modified":"2026-10-23T21:00:04Z","fixes":[{"ecosystem":"Packagist","package":"livewire/livewire","fixed_in":["4.4.8"],"sources":["ghsa","osv"]}],"affected":[{"source":"ghsa","ecosystem":"Packagist","package":"livewire/livewire","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"4.3.0"},{"fixed":"4.4.8"}]}]},{"source":"osv","ecosystem":"Packagist","package":"livewire/livewire","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"4.3.0"},{"fixed":"4.4.8"}]}],"versions":["v4.3.0","v4.3.1","v4.3.2","v4.3.3","v4.3.4","v4.3.5","v4.4.0","v4.4.1","v4.4.2","v4.4.3","v4.4.4","v4.4.5","v4.4.6","v4.4.7"]}],"references":[{"url":"https://github.com/livewire/livewire/security/advisories/GHSA-mhf7-xp6r-6qrc","tags":["web"]},{"url":"https://github.com/livewire/livewire/commit/822a4fa9b1e1123691133a2e2eb379a3dab11191","tags":["web"]},{"url":"https://github.com/livewire/livewire/releases/tag/v4.4.8","tags":["web"]},{"url":"https://github.com/advisories/GHSA-mhf7-xp6r-6qrc"},{"url":"https://github.com/livewire/livewire","tags":["package"]}],"sources":{"ghsa":[{"id":"GHSA-mhf7-xp6r-6qrc","title":"Livewire: Authorization bypass in #[Authorize] via reordered parameter keys and #[Json] execution order","description":"### Impact\n\nThree issues allowed actions protected by the `#[Authorize]` attribute to run against records the current user is not authorized for:\n\n1. **Out-of-order parameter keys on actions.** `#[Authorize]` resolved a model parameter by its array key, while the action itself received parameters positionally. A request sending params as an object with reordered integer keys (e.g. `{\"1\": 2, \"0\": 1}`) could pass authorization with a record the user owns while the action received a different record. With `#[Authorize('delete', 'comment')]` on `deleteComment(Comment $comment)`, a user could delete another user's comment.\n2. **The same issue on event listeners.** Methods using both `#[On]` and `#[Authorize]` with a model parameter were affected in the same way through the `__dispatch` call.\n3. **`#[Json]` methods ran before authorization.** When a method had both `#[Json]` and `#[Authorize]`, the method body executed before the authorization check. The response was still a 403, but any side effects (such as database writes) had already happened.\n\nOnly applications using the `#[Authorize]` attribute are affected: on methods that take model parameters (issues 1 and 2), or on `#[Json]` methods (issue 3). Authorization performed inside the method (e.g. `$this-\u003eauthorize(...)`) is not affected. Livewire 3.x is not affected.\n\n### Patches\n\nFixed in **v4.4.8**. Call and event parameters must now be a list or use named (string) keys, otherwise the request is rejected, and `#[Json]` methods are authorized before they run.\n\n### Workarounds\n\nUpgrade to v4.4.8. If you can't upgrade right away, call `$this-\u003eauthorize(...)` inside affected methods instead of relying on the `#[Authorize]` attribute.\n\n### Credits\n\nReported by Yousef Aman ([@yousef-aman](https://github.com/yousef-aman)).","status":"published","published":"2026-10-23T20:51:30Z","modified":"2026-10-23T20:51:30Z","cvss":[{"version":"3.1","score":6.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N","level":"medium"}],"cwes":["CWE-863"],"updated_at":"2026-11-02T14:41:35.723785Z"}],"osv":[{"id":"GHSA-mhf7-xp6r-6qrc","title":"Livewire: Authorization bypass in #[Authorize] via reordered parameter keys and #[Json] execution order","description":"### Impact\n\nThree issues allowed actions protected by the `#[Authorize]` attribute to run against records the current user is not authorized for:\n\n1. **Out-of-order parameter keys on actions.** `#[Authorize]` resolved a model parameter by its array key, while the action itself received parameters positionally. A request sending params as an object with reordered integer keys (e.g. `{\"1\": 2, \"0\": 1}`) could pass authorization with a record the user owns while the action received a different record. With `#[Authorize('delete', 'comment')]` on `deleteComment(Comment $comment)`, a user could delete another user's comment.\n2. **The same issue on event listeners.** Methods using both `#[On]` and `#[Authorize]` with a model parameter were affected in the same way through the `__dispatch` call.\n3. **`#[Json]` methods ran before authorization.** When a method had both `#[Json]` and `#[Authorize]`, the method body executed before the authorization check. The response was still a 403, but any side effects (such as database writes) had already happened.\n\nOnly applications using the `#[Authorize]` attribute are affected: on methods that take model parameters (issues 1 and 2), or on `#[Json]` methods (issue 3). Authorization performed inside the method (e.g. `$this-\u003eauthorize(...)`) is not affected. Livewire 3.x is not affected.\n\n### Patches\n\nFixed in **v4.4.8**. Call and event parameters must now be a list or use named (string) keys, otherwise the request is rejected, and `#[Json]` methods are authorized before they run.\n\n### Workarounds\n\nUpgrade to v4.4.8. If you can't upgrade right away, call `$this-\u003eauthorize(...)` inside affected methods instead of relying on the `#[Authorize]` attribute.\n\n### Credits\n\nReported by Yousef Aman ([@yousef-aman](https://github.com/yousef-aman)).","status":"published","published":"2026-10-23T20:51:30Z","modified":"2026-10-23T21:00:04.354707498Z","cvss":[{"version":"3.1","score":6.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N","level":"medium"}],"cwes":["CWE-863"],"updated_at":"2026-11-02T15:46:51.811331Z"}]}}
