{"id":"GHSA-9vx2-j98c-p72w","summary":"Kirby: Access to image files and limited access to JSON files outside of the site root via path traversal in the media handling","details":"### TL;DR\n\nThis vulnerability affects all Kirby sites that are deployed to a server that allows requests for URLs with encoded slashes (`%2f`), such as nginx, PHP's built-in server or Apache setups that have the option `AllowEncodedSlashes` enabled.\n \nIt was possible to create and access thumbnails from media files in arbitrary accessible directories on the server that have a valid thumbnail configuration (JSON job file). It was also possible to detect the presence of files with the `.json` file extension anywhere on the server.\n \n**This vulnerability is of high severity for affected sites.**\n \nServer setups using Apache's default configuration or other servers that have been hardened against encoded slashes in URLs are *not* affected.\n\n----\n\n### Introduction\n\nA path traversal (also known as directory traversal) vulnerability occurs when untrusted input is used to build a filesystem path without properly confining the result to an intended base directory. By injecting sequences such as `../`, an attacker can escape that directory and reach files elsewhere on the server.\n\n### Affected components\n\nKirby's media handler processes requests for files in the `media` directory that have not been generated yet. It parses the provided path and finds the correct file or asset from which to generate a thumbnail. Each thumbnail needs to have a prepared job file (a metadata file with file extension `.json`) in order to allow the media handler to generate it.\n \nEach parent (such as a page) has its own media directory, which in turn contains the individual files. Kirby's media handler searches for the file within the parent's media directory.\n\n### Impact\n\nIn affected releases, Kirby did not prevent path traversal in the filenames that were searched within the parent directory. In affected server setups where the attacker can provide encoded slashes (`%2f`) in the request, Kirby allowed the request to traverse away from the parent's media directory.\n \nBecause the response differs between existing and non-existing thumbnail configurations, attackers were able to tell whether an arbitrary JSON file exists on the server (addressed by a relative path from the media directory of an arbitrary existing parent, including a relative path that points outside of the site's `index` root). For existing files with the file extension `.json` and a valid `filename` key (resulting in a valid job file), it was possible to generate thumbnails of the referenced media files, deleting the job file in the process.\n \n### Patches\n\nThe problem has been patched in [Kirby 4.9.5](https://github.com/getkirby/kirby/releases/tag/4.9.5) and [Kirby 5.5.2](https://github.com/getkirby/kirby/releases/tag/5.5.2). Please update to one of these or a [later version](https://github.com/getkirby/kirby/releases) to fix the vulnerability.\n\nIn all of the mentioned releases, `Kirby\\Cms\\Media::thumb()` now rejects any filename that contains path information (anything other than a plain filename) before it is appended to the validated root. We have also hardened the `file::version` component to block paths that contain the `../` sequence.\n\n### Credits\n\nThanks to Jorge González Milla (@Pig-Tail) for responsibly reporting the identified issue.","aliases":["CVE-2026-75594"],"modified":"2026-08-31T22:40:38.012862Z","published":"2026-08-31T22:12:45Z","database_specific":{"github_reviewed_at":"2026-08-31T22:12:45Z","nvd_published_at":"2026-08-31T21:17:48Z","cwe_ids":["CWE-22"],"severity":"HIGH","github_reviewed":true},"references":[{"type":"WEB","url":"https://github.com/getkirby/kirby/security/advisories/GHSA-9vx2-j98c-p72w"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-75594"},{"type":"WEB","url":"https://github.com/getkirby/kirby/commit/22fbaedb7e6dd61f5def10829ba7bd7e73e0dcc9"},{"type":"WEB","url":"https://github.com/getkirby/kirby/commit/a40808f5c2ee5d42bb597fb6ffbe0de0ce8e4d20"},{"type":"WEB","url":"https://github.com/getkirby/kirby/commit/cd7abb68d298f3443eafd43fa2d0c7ad0f933d0e"},{"type":"WEB","url":"https://github.com/getkirby/kirby/commit/e0dca5f709adc21b36f5549df2c0619bc59da56c"},{"type":"PACKAGE","url":"https://github.com/getkirby/kirby"},{"type":"WEB","url":"https://github.com/getkirby/kirby/releases/tag/4.9.5"},{"type":"WEB","url":"https://github.com/getkirby/kirby/releases/tag/5.5.2"}],"affected":[{"package":{"name":"getkirby/cms","ecosystem":"Packagist","purl":"pkg:composer/getkirby/cms"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"4.9.5"}]}],"versions":["3.0.0","3.0.1","3.0.1-rc.1","3.0.2","3.0.2-rc.1","3.0.3","3.0.3-rc.1","3.0.3-rc.2","3.0.3-rc.3","3.1.0","3.1.0-rc.1","3.1.1","3.1.2","3.1.2-rc.1","3.1.3","3.1.3-rc.1","3.1.4","3.1.4-rc.1","3.10.0","3.10.0.1","3.10.1","3.10.1.1","3.10.1.2","3.2.0","3.2.0-rc.1","3.2.0-rc.2","3.2.0-rc.3","3.2.0-rc.4","3.2.1","3.2.1-rc.1","3.2.2","3.2.3","3.2.3-rc.1","3.2.4","3.2.4-rc.1","3.2.5","3.2.5-rc.1","3.2.5-rc.2","3.3.0","3.3.0-rc.1","3.3.0-rc.2","3.3.0-rc.3","3.3.0-rc.4","3.3.0-rc.5","3.3.1","3.3.1-rc.1","3.3.2","3.3.2-rc.1","3.3.3","3.3.3-rc.1","3.3.4","3.3.4-rc.1","3.3.5","3.3.5-rc.1","3.3.6","3.4.0","3.4.0-rc.1","3.4.0-rc.2","3.4.0-rc.3","3.4.1","3.4.1-rc.1","3.4.2","3.4.3","3.4.3-rc.1","3.4.4","3.4.4-rc.1","3.4.5","3.5.0","3.5.0-rc.1","3.5.0-rc.2","3.5.0-rc.3","3.5.0-rc.4","3.5.0-rc.5","3.5.0-rc.6","3.5.0-rc.7","3.5.1","3.5.1-rc.1","3.5.2","3.5.2-rc.1","3.5.3","3.5.3.1","3.5.4","3.5.5","3.5.5-rc.1","3.5.6","3.5.6-rc.1","3.5.7","3.5.7-rc.1","3.5.7.1","3.5.8","3.5.8.1","3.5.8.2","3.5.8.3","3.5.8.4","3.6.0","3.6.0-alpha.1","3.6.0-alpha.2","3.6.0-alpha.3","3.6.0-alpha.4","3.6.0-beta.1","3.6.0-beta.2","3.6.0-beta.3","3.6.0-rc.1","3.6.0-rc.2","3.6.0-rc.3","3.6.0-rc.4","3.6.0-rc.5","3.6.1","3.6.1.1","3.6.2","3.6.2-rc.1","3.6.2-rc.2","3.6.2-rc.3","3.6.3","3.6.3-rc.1","3.6.3-rc.2","3.6.3.1","3.6.4","3.6.4-rc.1","3.6.5","3.6.5-rc.1","3.6.6","3.6.6-rc.1","3.6.6.1","3.6.6.2","3.6.6.3","3.6.6.4","3.6.6.5","3.6.6.6","3.7.0","3.7.0-rc.1","3.7.0-rc.2","3.7.0-rc.3","3.7.0.1","3.7.0.2","3.7.1","3.7.1-rc.1","3.7.2","3.7.2-rc.1","3.7.2.1","3.7.3","3.7.3-rc.1","3.7.4","3.7.4-rc.1","3.7.5","3.7.5.1","3.7.5.2","3.7.5.3","3.7.5.4","3.7.5.5","3.8.0","3.8.0-rc.1","3.8.0-rc.2","3.8.0-rc.3","3.8.1","3.8.1-rc.1","3.8.1.1","3.8.2","3.8.2-rc.1","3.8.3","3.8.3-rc.1","3.8.3-rc.2","3.8.4","3.8.4.1","3.8.4.2","3.8.4.3","3.8.4.4","3.9.0","3.9.0-rc.1","3.9.0-rc.2","3.9.1","3.9.1-rc.1","3.9.2","3.9.2-rc.1","3.9.3","3.9.3-rc.1","3.9.4","3.9.4-rc.1","3.9.5","3.9.5-rc.1","3.9.6","3.9.6-rc.1","3.9.6.1","3.9.7","3.9.7-rc.1","3.9.8","3.9.8-rc.1","3.9.8.1","3.9.8.2","3.9.8.3","4.0.0","4.0.0-alpha.1","4.0.0-alpha.2","4.0.0-alpha.3","4.0.0-alpha.4","4.0.0-alpha.5","4.0.0-alpha.6","4.0.0-alpha.7","4.0.0-beta.1","4.0.0-beta.2","4.0.0-beta.3","4.0.0-rc.1","4.0.0-rc.2","4.0.0-rc.3","4.0.0-rc.4","4.0.1","4.0.2","4.0.3","4.1.0","4.1.0-rc.1","4.1.0-rc.2","4.1.0-rc.3","4.1.1","4.1.2","4.2.0","4.2.0-rc.1","4.3.0","4.3.0-rc.1","4.3.1","4.4.0","4.4.0-rc.1","4.4.1","4.5.0","4.5.0-rc.1","4.6.0","4.6.0-rc.1","4.6.1","4.7.0","4.7.0-rc.1","4.7.1","4.7.2","4.8.0","4.8.0-rc.1","4.9.0","4.9.1","4.9.2","4.9.3","4.9.4"],"database_specific":{"last_known_affected_version_range":"\u003c= 4.9.4","source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/08/GHSA-9vx2-j98c-p72w/GHSA-9vx2-j98c-p72w.json"}},{"package":{"name":"getkirby/cms","ecosystem":"Packagist","purl":"pkg:composer/getkirby/cms"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"5.0.0"},{"fixed":"5.5.2"}]}],"versions":["5.0.0","5.0.1","5.0.2","5.0.3","5.0.4","5.1.0","5.1.0-rc.1","5.1.1","5.1.2","5.1.3","5.1.4","5.2.0","5.2.0-rc.1","5.2.1","5.2.2","5.2.3","5.3.0","5.3.0-rc.1","5.3.1","5.3.2","5.3.3","5.4.0","5.4.1","5.4.2","5.4.3","5.4.4","5.5.0","5.5.1"],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/08/GHSA-9vx2-j98c-p72w/GHSA-9vx2-j98c-p72w.json"}}],"schema_version":"1.9.0","severity":[{"type":"CVSS_V4","score":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N"}]}