PatchClock

PHP security digest · 23 Oct 2026

Livewire: Authorization bypass in #[Authorize] via reordered parameter keys and #[Json] execution order

Medium GHSA-mhf7-xp6r-6qrc

Package
livewire/livewire
Fixed in
4.4.8
Published
Fri 23 Oct 2026, 21:51 Lisbon
Installs on Packagist
117M

In plain words

An attacker could bypass authorisation on Livewire methods protected by #[Authorize] that take model parameters, including event listeners, and act on records they are not authorised to access. Methods using both #[Json] and #[Authorize] could also run before authorisation, allowing side effects such as database writes even though the response was 403. Only applications using #[Authorize] in these ways are affected.

Affected versions

PackageAffectedFixed in
livewire/livewire>= 4.3.0, < 4.4.84.4.8

Am I affected?

Look in composer.lock for livewire/livewire at version >= 4.3.0, < 4.4.8. If present, check for #[Authorize] on methods that take model parameters, including listeners also marked #[On], or on methods also marked #[Json]. Authorisation performed inside the method with $this->authorize(...) is not affected. Livewire 3.x is not affected; the fix is in 4.4.8.

What to do

Check which version you have, then update to a fixed release for your branch (4.4.8):

composer show livewire/livewire | grep versions
composer update livewire/livewire

If your version constraint in composer.json keeps you below a fixed release, raise it first. Whether your configuration is affected, and the exact version ranges, are in the advisory itself.

If you cannot update yet

Upgrade to 4.4.8. If you cannot upgrade straight away, call $this->authorize(...) inside affected methods instead of relying on #[Authorize].

The advisory's description

Impact

Three issues allowed actions protected by the #[Authorize] attribute to run against records the current user is not authorized for:

  1. 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.
  2. 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.
  3. #[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.

Only 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->authorize(...)) is not affected. Livewire 3.x is not affected.

Patches

Fixed 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.

Workarounds

Upgrade to v4.4.8. If you can't upgrade right away, call $this->authorize(...) inside affected methods instead of relying on the #[Authorize] attribute.

Credits

Reported by Yousef Aman (@yousef-aman).

Weakness: CWE-863 Incorrect Authorization. Reported by yousef-aman.

The advisory

From OSV.dev, which gathers the GitHub Advisory Database, FriendsOfPHP and Drupal security advisories; the summary is theirs. The description, affected versions, weakness and credits are from the GitHub Advisory Database (CC BY 4.0). "In plain words", "Am I affected?" and "If you cannot update yet" are based on that advisory, and checked to name no version it does not.