CVE-2026-63223
CodeIgniter: Uploaded file extension validation bypass in is_image and mime_in rules
CodeIgniter is a PHP full-stack web framework. Prior to 4.7.4, the is_image and mime_in upload validation rules do not independently enforce a safe client filename extension, allowing a remote attacker to upload executable content when an application preserves the client filename and stores uploads in a web-accessible script-enabled directory. Applications are impacted when they validate uploads using is_image or mime_in without an independent safe extension check (such as ext_in on patched versions), save uploaded files using the client-supplied filename, and place uploads in a web-accessible directory where PHP files can execute. This issue is fixed in version 4.7.4.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- High
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
9.8
CodeIgniter: Uploaded file extension validation bypass in is_image and mime_in rules
CodeIgniter is a PHP full-stack web framework. Prior to 4.7.4, the is_image and mime_in upload validation rules do not independently enforce a safe client filename extension, allowing a remote attacker to upload executable content when an application preserves the client filename and stores uploads in a web-accessible script-enabled directory. Applications are impacted when they validate uploads using is_image or mime_in without an independent safe extension check (such as ext_in on patched versions), save uploaded files using the client-supplied filename, and place uploads in a web-accessible directory where PHP files can execute. This issue is fixed in version 4.7.4.
- Record
CVE-2026-63223- CVSS 3.1
- 9.8 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-434
- Updated
- 2026-11-02
EUVDEUVD-2026-51399
9.8
CodeIgniter is a PHP full-stack web framework. Prior to 4.7.4, the is_image and mime_in upload validation rules do not independently enforce a safe client filename extension, allowing a remote attacker to upload executable content when an application preserves the client filename and stores uploads in a web-accessible script-enabled directory. Applications are impacted when they validate uploads using is_image or mime_in without an independent safe extension check (such as ext_in on patched versions), save uploaded files using the client-supplied filename, and place uploads in a web-accessible directory where PHP files can execute. This issue is fixed in version 4.7.4.
- Record
EUVD-2026-51399- CVSS 3.1
- 9.8 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-mmj4-63m4-r6h5
9.8
CodeIgniter: Uploaded file extension validation bypass in `is_image` and `mime_in` rules
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().
- Record
GHSA-mmj4-63m4-r6h5- CVSS 3.1
- 9.8 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-434
- Updated
- 2026-11-02
NVD
9.8
CodeIgniter is a PHP full-stack web framework. Prior to 4.7.4, the is_image and mime_in upload validation rules do not independently enforce a safe client filename extension, allowing a remote attacker to upload executable content when an application preserves the client filename and stores uploads in a web-accessible script-enabled directory. Applications are impacted when they validate uploads using is_image or mime_in without an independent safe extension check (such as ext_in on patched versions), save uploaded files using the client-supplied filename, and place uploads in a web-accessible directory where PHP files can execute. This issue is fixed in version 4.7.4.
- Record
CVE-2026-63223- CVSS 3.1
- 9.8 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-434
- Updated
- 2026-11-02
OSV
9.8
CodeIgniter: Uploaded file extension validation bypass in is_image and mime_in rules
CodeIgniter is a PHP full-stack web framework. Prior to 4.7.4, the is_image and mime_in upload validation rules do not independently enforce a safe client filename extension, allowing a remote attacker to upload executable content when an application preserves the client filename and stores uploads in a web-accessible script-enabled directory. Applications are impacted when they validate uploads using is_image or mime_in without an independent safe extension check (such as ext_in on patched versions), save uploaded files using the client-supplied filename, and place uploads in a web-accessible directory where PHP files can execute. This issue is fixed in version 4.7.4.
- Record
CVE-2026-63223- CVSS 3.1
- 9.8 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-434
- Updated
- 2026-11-02
OSVGHSA-mmj4-63m4-r6h5
9.8
CodeIgniter: Uploaded file extension validation bypass in `is_image` and `mime_in` rules
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().
- Record
GHSA-mmj4-63m4-r6h5- CVSS 3.1
- 9.8 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-434
- Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-63223
9.8
CodeIgniter is a PHP full-stack web framework. Prior to 4.7.4, the is_image and mime_in upload validation rules do not independently enforce a safe client filename extension, allowing a remote attacker to upload executable content when an application preserves the client filename and stores uploads in a web-accessible script-enabled directory. Applications are impacted when they validate uploads using is_image or mime_in without an independent safe extension check (such as ext_in on patched versions), save uploaded files using the client-supplied filename, and place uploads in a web-accessible directory where PHP files can execute. This issue is fixed in version 4.7.4.
- Record
UBUNTU-CVE-2026-63223- CVSS 3.1
- 9.8 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
codeigniter4/frameworkPackagist |
before 4.7.4 | 4.7.4 |
codeigniter4/frameworkPackagist |
before 4.7.4, plus listed versions 4.0.04.0.0-rc.4v4.0.0-alpha.3v4.0.0-alpha.4v4.0.0-alpha.5 Show 45 moreShow lessv4.0.0-beta.1v4.0.0-beta.2v4.0.0-beta.3v4.0.0-beta.4v4.0.0-rc.1v4.0.0-rc.2v4.0.0-rc.2.1v4.0.0-rc.3v4.0.1v4.0.2v4.0.3v4.0.4v4.0.5v4.1.0v4.1.1v4.1.2v4.1.3v4.1.4v4.1.5v4.1.6v4.1.7v4.1.8v4.1.9v4.2.0v4.2.1v4.2.10v4.2.11v4.2.12v4.2.2v4.2.3v4.2.4v4.2.5v4.2.6v4.2.7v4.2.8v4.2.9v4.3.0v4.3.1v4.3.2v4.3.3v4.3.4v4.3.5v4.3.6v4.3.7v4.3.8 |
4.7.4 |
php-codeigniter-frameworkUbuntu:24.04:LTS |
All versions, plus listed versions 3.1.13+dfsg1-13.1.13+dfsg1-23.1.13+dfsg1-2ubuntu23.1.13+dfsg1-3 |
None known |
php-codeigniter-frameworkUbuntu:26.10 |
All versions, plus listed versions 3.1.13+dfsg1-83.1.13+dfsg1-9 |
None known |
php-codeigniter-frameworkUbuntu:26.04:LTS |
All versions, plus listed versions 3.1.13+dfsg1-63.1.13+dfsg1-8 |
None known |
Public exploits
Links only. Every CVE stores no exploit code.
| Source | Link | Date |
|---|---|---|
| PoC in GitHub | imbas007/CVE-2026-63223-POC | 2026-08-03 |
| PoC in GitHub | myeongji1/cve-2026-63223-ctf | 2026-10-14 |
| PoC in GitHub | shinthink/CVE-2026-63223 | 2026-08-04 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV, PoC in GitHub |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-63223 is a critical vulnerability (CVSS 9.8) in Codeigniter4, published July 31, 2026. Public exploit code exists. EPSS puts the chance of exploitation in the next 30 days at 0.80%, the 56th percentile. Fixed in codeigniter4/framework 4.7.4.
References
github.com/codeigniter4/CodeIgniter4/security/advisories/GHSA-mmj4-63m4-r6h5
github.com/codeigniter4/CodeIgniter4/commit/b6e9a4fa1dca2df3d3f261bdf61532df8c6420aa
github.com/codeigniter4/CodeIgniter4/releases/tag/v4.7.4
nvd.nist.gov/vuln/detail/CVE-2026-63223
github.com/advisories/GHSA-mmj4-63m4-r6h5
github.com/CVEProject/cvelistV5/tree/main/cves/2026/63xxx/CVE-2026-63223.json
github.com/codeigniter4/CodeIgniter4
ubuntu.com/security/CVE-2026-63223
cve.org/CVERecord?id=CVE-2026-63223
Left out here: 28 versions. The JSON record has them.