HighGHSA-f3cx-396f-7jqpCVE-2024-47823

Livewire Remote Code Execution on File Uploads

Published 8 Oct 2024 · Updated 10 Oct 2024

Affected packages

Affected
>=3.0.0-beta.1 <3.5.2
Fixed in
3.5.2
Update to the fixed version for your release line, for example:composer require livewire/livewire:^3.5.2
Affected
<2.12.7
Fixed in
2.12.7
Update to the fixed version for your release line, for example:composer require livewire/livewire:^2.12.7

Details

In livewire/livewire prior to v2.12.7 and v3.5.2, the file extension of an uploaded file is guessed based on the MIME type. As a result, the actual file extension from the file name is not validated. An attacker can therefore bypass the validation by uploading a file with a valid MIME type (e.g., image/png) and a “.php” file extension. If the following criteria are met, the attacker can carry out an RCE attack:

  • Filename is composed of the original file name using $file->getClientOriginalName()
  • Files stored directly on your server in a public storage disk
  • Webserver is configured to execute “.php” files

PoC

In the following scenario, an attacker could upload a file called shell.php with an image/png MIME type and execute it on the remote server.

class SomeComponent extends Component
{
    use WithFileUploads;

    #[Validate('image|extensions:png')]
    public $file;

    public function save()
    {
        $this->validate();

        $this->file->storeAs(
            path: 'images',
            name: $this->file->getClientOriginalName(),
            options: ['disk' => 'public'],
        );
    }
}

Is GHSA-f3cx-396f-7jqp in any of your client repos?

Checking one package by hand is fine. Checking it across forty client projects is not. NPMscan reads the lockfiles in every GitHub repo you pick, finds each project with an affected livewire/livewire, and gives you the command that fixes it.

References

Advisory data from OSV.dev (opens OSV.dev in a new tab), refreshed daily.