Livewire Remote Code Execution on File Uploads
The advisory, in context
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'],
);
}
}
Affected packages
Start with the recorded fix for your release branch. Check your installed version and test compatibility before upgrading. Fixing this advisory does not rule out other vulnerabilities in the release.
From 3.0.0-beta.1 before 3.5.2
Fixed in 3.5.2
51 explicitly affected versions
v3.0.0, v3.0.0-beta.1, v3.0.0-beta.10, v3.0.0-beta.11, v3.0.0-beta.2, v3.0.0-beta.3, v3.0.0-beta.4, v3.0.0-beta.5, v3.0.0-beta.6, v3.0.0-beta.7, v3.0.0-beta.8, v3.0.0-beta.9, v3.0.1, v3.0.10, v3.0.2, v3.0.3, v3.0.4, v3.0.5, v3.0.6, v3.0.7, v3.0.8, v3.0.9, v3.1.0, v3.2.0, v3.2.1, v3.2.2, v3.2.3, v3.2.4, v3.2.5, v3.2.6, v3.3.0, v3.3.1, v3.3.2, v3.3.3, v3.3.4, v3.3.5, v3.4.0, v3.4.1, v3.4.10, v3.4.11, v3.4.12, v3.4.2, v3.4.3, v3.4.4, v3.4.5, v3.4.6, v3.4.7, v3.4.8, v3.4.9, v3.5.0, v3.5.1
View affected-version evidence
{
"ranges": [
{
"events": [
{
"introduced": "3.0.0-beta.1"
},
{
"fixed": "3.5.2"
}
],
"type": "ECOSYSTEM"
}
],
"versions": [
"v3.0.0",
"v3.0.0-beta.1",
"v3.0.0-beta.10",
"v3.0.0-beta.11",
"v3.0.0-beta.2",
"v3.0.0-beta.3",
"v3.0.0-beta.4",
"v3.0.0-beta.5",
"v3.0.0-beta.6",
"v3.0.0-beta.7",
"v3.0.0-beta.8",
"v3.0.0-beta.9",
"v3.0.1",
"v3.0.10",
"v3.0.2",
"v3.0.3",
"v3.0.4",
"v3.0.5",
"v3.0.6",
"v3.0.7",
"v3.0.8",
"v3.0.9",
"v3.1.0",
"v3.2.0",
"v3.2.1",
"v3.2.2",
"v3.2.3",
"v3.2.4",
"v3.2.5",
"v3.2.6",
"v3.3.0",
"v3.3.1",
"v3.3.2",
"v3.3.3",
"v3.3.4",
"v3.3.5",
"v3.4.0",
"v3.4.1",
"v3.4.10",
"v3.4.11",
"v3.4.12",
"v3.4.2",
"v3.4.3",
"v3.4.4",
"v3.4.5",
"v3.4.6",
"v3.4.7",
"v3.4.8",
"v3.4.9",
"v3.5.0",
"v3.5.1"
]
}Earlier releases before 2.12.7
Fixed in 2.12.7
178 explicitly affected versions
v0.0.1, v0.0.10, v0.0.11, v0.0.12, v0.0.13, v0.0.14, v0.0.15, v0.0.2, v0.0.3, v0.0.4, v0.0.5, v0.0.6, v0.0.7, v0.0.8, v0.0.9, v0.1, v0.1.1, v0.1.2, v0.1.3, v0.1.4, v0.1.5, v0.1.6, v0.2.0, v0.2.1, v0.2.10, v0.2.2, v0.2.3, v0.2.4, v0.2.5, v0.2.6, v0.2.7, v0.2.8, v0.2.9, v0.3.0, v0.3.1, v0.3.10, v0.3.11, v0.3.12, v0.3.13, v0.3.14, v0.3.15, v0.3.16, v0.3.17, v0.3.18, v0.3.19, v0.3.2, v0.3.20, v0.3.21, v0.3.3, v0.3.4, v0.3.5, v0.3.6, v0.3.7, v0.3.8, v0.3.9, v0.4.0, v0.5.0, v0.5.1, v0.5.2, v0.5.3, v0.6.0, v0.7.0, v0.7.1, v0.7.2, v0.7.3, v0.7.4, v1.0.0, v1.0.1, v1.0.10, v1.0.11, v1.0.12, v1.0.13, v1.0.14, v1.0.2, v1.0.3, v1.0.4, v1.0.5, v1.0.6, v1.0.7, v1.0.8, v1.0.9, v1.1.0, v1.2.0, v1.3.0, v1.3.1, v1.3.2, v1.3.3, v1.3.4, v1.3.5, v1.3.6, v1.3.7, v1.3.8, v1.3.9, v2.0.0, v2.0.1, v2.0.2, v2.0.3, v2.0.4, v2.1.0, v2.1.1, v2.1.2, v2.1.3, v2.1.4, v2.10.0, v2.10.1, v2.10.2, v2.10.3, v2.10.4, v2.10.5, v2.10.6, v2.10.7, v2.10.8, v2.11.0, v2.11.1, v2.11.2, v2.11.3, v2.12.0, v2.12.1, v2.12.2, v2.12.3, v2.12.4, v2.12.5, v2.12.6, v2.2.0, v2.2.1, v2.2.2, v2.2.3, v2.2.4, v2.2.5, v2.2.6, v2.2.7, v2.2.8, v2.2.9, v2.3.0, v2.3.1, v2.3.10, v2.3.11, v2.3.12, v2.3.13, v2.3.14, v2.3.15, v2.3.16, v2.3.17, v2.3.18, v2.3.2, v2.3.3, v2.3.4, v2.3.5, v2.3.6, v2.3.7, v2.3.8, v2.3.9, v2.4.0, v2.4.1, v2.4.2, v2.4.3, v2.4.4, v2.5.0, v2.5.1, v2.5.2, v2.5.3, v2.5.4, v2.5.5, v2.6.0, v2.6.1, v2.6.2, v2.6.3, v2.6.4, v2.6.5, v2.6.6, v2.6.7, v2.7.0, v2.7.1, v2.7.2, v2.8.0, v2.8.1, v2.8.2, v2.9.0
View affected-version evidence
{
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"fixed": "2.12.7"
}
],
"type": "ECOSYSTEM"
}
],
"versions": [
"v0.0.1",
"v0.0.10",
"v0.0.11",
"v0.0.12",
"v0.0.13",
"v0.0.14",
"v0.0.15",
"v0.0.2",
"v0.0.3",
"v0.0.4",
"v0.0.5",
"v0.0.6",
"v0.0.7",
"v0.0.8",
"v0.0.9",
"v0.1",
"v0.1.1",
"v0.1.2",
"v0.1.3",
"v0.1.4",
"v0.1.5",
"v0.1.6",
"v0.2.0",
"v0.2.1",
"v0.2.10",
"v0.2.2",
"v0.2.3",
"v0.2.4",
"v0.2.5",
"v0.2.6",
"v0.2.7",
"v0.2.8",
"v0.2.9",
"v0.3.0",
"v0.3.1",
"v0.3.10",
"v0.3.11",
"v0.3.12",
"v0.3.13",
"v0.3.14",
"v0.3.15",
"v0.3.16",
"v0.3.17",
"v0.3.18",
"v0.3.19",
"v0.3.2",
"v0.3.20",
"v0.3.21",
"v0.3.3",
"v0.3.4",
"v0.3.5",
"v0.3.6",
"v0.3.7",
"v0.3.8",
"v0.3.9",
"v0.4.0",
"v0.5.0",
"v0.5.1",
"v0.5.2",
"v0.5.3",
"v0.6.0",
"v0.7.0",
"v0.7.1",
"v0.7.2",
"v0.7.3",
"v0.7.4",
"v1.0.0",
"v1.0.1",
"v1.0.10",
"v1.0.11",
"v1.0.12",
"v1.0.13",
"v1.0.14",
"v1.0.2",
"v1.0.3",
"v1.0.4",
"v1.0.5",
"v1.0.6",
"v1.0.7",
"v1.0.8",
"v1.0.9",
"v1.1.0",
"v1.2.0",
"v1.3.0",
"v1.3.1",
"v1.3.2",
"v1.3.3",
"v1.3.4",
"v1.3.5",
"v1.3.6",
"v1.3.7",
"v1.3.8",
"v1.3.9",
"v2.0.0",
"v2.0.1",
"v2.0.2",
"v2.0.3",
"v2.0.4",
"v2.1.0",
"v2.1.1",
"v2.1.2",
"v2.1.3",
"v2.1.4",
"v2.10.0",
"v2.10.1",
"v2.10.2",
"v2.10.3",
"v2.10.4",
"v2.10.5",
"v2.10.6",
"v2.10.7",
"v2.10.8",
"v2.11.0",
"v2.11.1",
"v2.11.2",
"v2.11.3",
"v2.12.0",
"v2.12.1",
"v2.12.2",
"v2.12.3",
"v2.12.4",
"v2.12.5",
"v2.12.6",
"v2.2.0",
"v2.2.1",
"v2.2.2",
"v2.2.3",
"v2.2.4",
"v2.2.5",
"v2.2.6",
"v2.2.7",
"v2.2.8",
"v2.2.9",
"v2.3.0",
"v2.3.1",
"v2.3.10",
"v2.3.11",
"v2.3.12",
"v2.3.13",
"v2.3.14",
"v2.3.15",
"v2.3.16",
"v2.3.17",
"v2.3.18",
"v2.3.2",
"v2.3.3",
"v2.3.4",
"v2.3.5",
"v2.3.6",
"v2.3.7",
"v2.3.8",
"v2.3.9",
"v2.4.0",
"v2.4.1",
"v2.4.2",
"v2.4.3",
"v2.4.4",
"v2.5.0",
"v2.5.1",
"v2.5.2",
"v2.5.3",
"v2.5.4",
"v2.5.5",
"v2.6.0",
"v2.6.1",
"v2.6.2",
"v2.6.3",
"v2.6.4",
"v2.6.5",
"v2.6.6",
"v2.6.7",
"v2.7.0",
"v2.7.1",
"v2.7.2",
"v2.8.0",
"v2.8.1",
"v2.8.2",
"v2.9.0"
]
}References
- https://github.com/livewire/livewire/security/advisories/GHSA-f3cx-396f-7jqp
- https://nvd.nist.gov/vuln/detail/CVE-2024-47823
- https://github.com/livewire/livewire/pull/8624
- https://github.com/livewire/livewire/commit/70503b79f5db75a1eac9bf55826038a6ee5a16d5
- https://github.com/livewire/livewire/commit/cd168c6212ea13d13b82b3132485741f82d9fad9
- https://github.com/livewire/livewire