{"id":"GHSA-hhmc-q9hp-r662","summary":"CodeIgniter: Path traversal in UploadedFile::move() when using client-provided filenames","details":"### Impact\nIn affected versions, calling `UploadedFile::move()` **without a second argument** uses the client-provided filename without sanitization. Depending on the destination path and server configuration, an attacker can supply a filename containing path traversal sequences (e.g. `../../public/shell.php`) to write uploaded content outside the intended upload directory.\n\nThe patch sanitizes this default (no-argument) path.\n\n**Note:** The patch only sanitizes the filename when no second argument is passed. If your application **explicitly** passes a client-provided name as the second argument, you remain responsible for sanitizing it - the patch does not (and cannot) sanitize a caller-supplied filename:\n```php\n// Unsafe - even after upgrading:\n$file-\u003emove(WRITEPATH . 'uploads', $file-\u003egetName());\n$file-\u003emove(WRITEPATH . 'uploads', $file-\u003egetClientName());\n```\n\n### Patches\nUpgrade to v4.7.4 or later.\n\n### Workarounds\nIf you cannot upgrade immediately, use a generated filename or sanitize the client filename before passing it to `move()`.\n\nUse a generated filename:\n```php\n$file-\u003emove(WRITEPATH . 'uploads', $file-\u003egetRandomName());\n```\nOr sanitize the client filename before passing it to `move()`:\n```php\nhelper('security');\n\n$name = sanitize_filename($file-\u003egetClientName());\n$file-\u003emove(WRITEPATH . 'uploads', $name);\n```","aliases":["CVE-2026-63222"],"modified":"2026-08-07T18:31:29.671164105Z","published":"2026-08-07T18:23:46Z","database_specific":{"severity":"HIGH","github_reviewed":true,"github_reviewed_at":"2026-08-07T18:23:46Z","nvd_published_at":"2026-07-31T06:16:31Z","cwe_ids":["CWE-22"]},"references":[{"type":"WEB","url":"https://github.com/codeigniter4/CodeIgniter4/security/advisories/GHSA-hhmc-q9hp-r662"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-63222"},{"type":"WEB","url":"https://github.com/codeigniter4/CodeIgniter4/commit/20ebcf4694d96d3c97fbc3938e360730e4f54618"},{"type":"PACKAGE","url":"https://github.com/codeigniter4/CodeIgniter4"},{"type":"WEB","url":"https://github.com/codeigniter4/CodeIgniter4/releases/tag/v4.7.4"}],"affected":[{"package":{"name":"codeigniter4/framework","ecosystem":"Packagist","purl":"pkg:composer/codeigniter4/framework"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"4.7.4"}]}],"versions":["4.0.0","4.0.0-rc.4","v4.0.0-alpha.3","v4.0.0-alpha.4","v4.0.0-alpha.5","v4.0.0-beta.1","v4.0.0-beta.2","v4.0.0-beta.3","v4.0.0-beta.4","v4.0.0-rc.1","v4.0.0-rc.2","v4.0.0-rc.2.1","v4.0.0-rc.3","v4.0.1","v4.0.2","v4.0.3","v4.0.4","v4.0.5","v4.1.0","v4.1.1","v4.1.2","v4.1.3","v4.1.4","v4.1.5","v4.1.6","v4.1.7","v4.1.8","v4.1.9","v4.2.0","v4.2.1","v4.2.10","v4.2.11","v4.2.12","v4.2.2","v4.2.3","v4.2.4","v4.2.5","v4.2.6","v4.2.7","v4.2.8","v4.2.9","v4.3.0","v4.3.1","v4.3.2","v4.3.3","v4.3.4","v4.3.5","v4.3.6","v4.3.7","v4.3.8","v4.4.0","v4.4.1","v4.4.2","v4.4.3","v4.4.4","v4.4.5","v4.4.6","v4.4.7","v4.4.8","v4.5.0","v4.5.1","v4.5.2","v4.5.3","v4.5.4","v4.5.5","v4.5.6","v4.5.7","v4.5.8","v4.6.0","v4.6.1","v4.6.2","v4.6.3","v4.6.4","v4.6.5","v4.7.0","v4.7.1","v4.7.2","v4.7.3"],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/08/GHSA-hhmc-q9hp-r662/GHSA-hhmc-q9hp-r662.json"}}],"schema_version":"1.9.0","severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"}]}