The AssetsController->replaceFile() method has a targetFilename body parameter that is used unsanitized in a deleteFile() call before Assets::prepareAssetName() is applied on save. This allows an authenticated user with replaceFiles permission to delete arbitrary files within the same filesystem root by injecting ../ path traversal sequences into the filename.
This could allow an authenticated user with replaceFiles permission on one volume to delete files in other folders/volumes that share the same filesystem root.
This only affects local filesystems.
Users should update to Craft 4.17.5 or 5.9.11 to mitigate the issue.
{
"github_reviewed": true,
"severity": "MODERATE",
"github_reviewed_at": "2026-03-16T18:11:49Z",
"nvd_published_at": "2026-03-16T20:16:19Z",
"cwe_ids": [
"CWE-22"
]
}