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
composer require livewire/livewire:^3.5.2- Affected
- <2.12.7
- Fixed in
- 2.12.7
composer require livewire/livewire:^2.12.7Details
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
- Linkgithub.com/livewire/livewire/security/advisories/GHSA-f3cx-396f-7jqp
- Advisorynvd.nist.gov/vuln/detail/CVE-2024-47823
- Linkgithub.com/livewire/livewire/pull/8624
- Linkgithub.com/livewire/livewire/commit/70503b79f5db75a1eac9bf55826038a6ee5a16d5
- Linkgithub.com/livewire/livewire/commit/cd168c6212ea13d13b82b3132485741f82d9fad9
- Packagegithub.com/livewire/livewire
Advisory data from OSV.dev (opens OSV.dev in a new tab), refreshed daily.