Summary
CodeIgniter: Uploaded file extension validation bypass in `is_image` and `mime_in` rules
Advisory details
Impact
This is an unsafe file upload validation vulnerability that can lead to remote code execution in vulnerable application configurations.
Applications are impacted when they:
- validate uploads using
is_imageormime_inwithout an independent safe extension check, such asext_inon patched versions - save uploaded files using the client-supplied filename
- place uploads in a web-accessible directory where PHP files can execute
Patches
Upgrade to v4.7.4 or later.
Workarounds
- Save uploads outside the public web root, preferably under
writable/uploads. - Use
$file->store()or$file->move($path, $file->getRandomName())instead of preserving the original client filename. - Disable script execution in any public upload directory.
- Manually verify the client filename extension before moving the file.
- For image uploads, reject files when
$file->getClientExtension()is not an allowed image extension. - For exact MIME-type validation, reject files when
$file->getClientExtension()does not match$file->guessExtension().
References
- https://github.com/advisories/GHSA-mmj4-63m4-r6h5
- https://github.com/codeigniter4/CodeIgniter4/security/advisories/GHSA-mmj4-63m4-r6h5
- https://nvd.nist.gov/vuln/detail/CVE-2026-63223
- https://github.com/codeigniter4/CodeIgniter4/commit/b6e9a4fa1dca2df3d3f261bdf61532df8c6420aa
- https://github.com/codeigniter4/CodeIgniter4/releases/tag/v4.7.4
Related vulnerabilities
All Supply chain →- HIGHCVE-2026-81891
elFinder: ZIP extraction bypasses uploadDeny MIME filter allowing PHP file upload (RCE)
- MEDIUMCVE-2026-55419
reachy_mini Allows Unrestricted Upload of File with Dangerous Type
- HIGHGHSA-ghvf-qf6h-g8x5
NocoBase: Arbitrary File Write chained with Local file Inclusion leads to Remote code execution
- MEDIUMCVE-2026-54179
Laravel Backpack CRUD: SingleBase64Image accepts any base64 payload behind a `data:image` prefix — SVG-with-script lands on the public disk
- MEDIUMCVE-2026-54177
Laravel Backpack CRUD: HasUploadFields keeps the attacker-supplied file extension — public-disk uploads of `shell.php` reach the webserver
- MEDIUMCVE-2026-71434
Statamic: Missing file upload validation on frontend forms allows uploading disallowed file types