CVE-2026-41656
Admidio: Path Traversal via Unvalidated `name` Parameter in Document Add Mode Enables Arbitrary Server File Read
Admidio is an open-source user management solution. Prior to version 5.0.9, the add mode in modules/documents-files.php accepts a name parameter validated only as 'string' type (HTML encoding), allowing path traversal characters (../) to pass through unfiltered. Combined with the absence of CSRF protection on this endpoint and SameSite=Lax session cookies, a low-privileged attacker can trick a documents administrator into clicking a crafted link that registers an arbitrary server file (e.g., install/config.php containing database credentials) into a documents folder accessible to the attacker. This issue has been patched in version 5.0.9.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- High
- User interaction
- Required
What an attacker can affect
- Confidentiality
- High
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
4.5
Admidio: Path Traversal via Unvalidated `name` Parameter in Document Add Mode Enables Arbitrary Server File Read
Admidio is an open-source user management solution. Prior to version 5.0.9, the add mode in modules/documents-files.php accepts a name parameter validated only as 'string' type (HTML encoding), allowing path traversal characters (../) to pass through unfiltered. Combined with the absence of CSRF protection on this endpoint and SameSite=Lax session cookies, a low-privileged attacker can trick a documents administrator into clicking a crafted link that registers an arbitrary server file (e.g., install/config.php containing database credentials) into a documents folder accessible to the attacker. This issue has been patched in version 5.0.9.
- Record
CVE-2026-41656- CVSS 3.1
- 4.5 Medium
CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:U/C:H/I:N/A:N - Weakness
- CWE-22
- Updated
- 2026-11-02
EUVDEUVD-2026-28265
4.5
Admidio is an open-source user management solution. Prior to version 5.0.9, the add mode in modules/documents-files.php accepts a name parameter validated only as 'string' type (HTML encoding), allowing path traversal characters (../) to pass through unfiltered. Combined with the absence of CSRF protection on this endpoint and SameSite=Lax session cookies, a low-privileged attacker can trick a documents administrator into clicking a crafted link that registers an arbitrary server file (e.g., install/config.php containing database credentials) into a documents folder accessible to the attacker. This issue has been patched in version 5.0.9.
- Record
EUVD-2026-28265- CVSS 3.1
- 4.5 Medium
CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:U/C:H/I:N/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-m9h6-8pqm-xrhf
4.5
Admidio has Path Traversal via Unvalidated `name` Parameter in Document Add Mode that Enables Arbitrary Server File Read
Summary
The add mode in modules/documents-files.php accepts a name parameter validated only as 'string' type (HTML encoding), allowing path traversal characters (../) to pass through unfiltered. Combined with the absence of CSRF protection on this endpoint and SameSite=Lax session cookies, a low-privileged attacker can trick a documents administrator into clicking a crafted link that registers an arbitrary server file (e.g., install/config.php containing database credentials) into a documents folder accessible to the attacker.
Details
Root cause — incorrect input validation type (modules/documents-files.php:222):
case 'add':
$getName = admFuncVariableIsValid($_GET, 'name', 'string');
The 'string' type in admFuncVariableIsValid() only applies SecurityUtils::encodeHTML(StringUtils::strStripTags($value)) (system/bootstrap/function.php:414-416). Since ../ contains no HTML special characters (<, >, &, ", '), path traversal sequences pass through unchanged.
The correct type would be 'file', which calls StringUtils::strIsValidFileName() (src/Infrastructure/Utils/StringUtils.php:217-236). This function checks basename($filename) !== $filename at line 228, which would reject any path containing directory separators.
Missing CSRF protection (modules/documents-files.php:221-238):
case 'add':
$getName = admFuncVariableIsValid($_GET, 'name', 'string');
if (!$gCurrentUser->isAdministratorDocumentsFiles()) {
throw new Exception('SYS_NO_RIGHTS');
}
$folder = new Folder($gDb);
$folder->readDataByUuid($getFolderUUID);
$folder->addFolderOrFileToDatabase($getName);
// ...
No SecurityUtils::validateCsrfToken() or form object validation. Compare with folder_delete (line 140) and file_delete (line 170) which both validate CSRF tokens. The add action operates entirely via GET parameters.
Unsafe path construction (src/Documents/Entity/Folder.php:121-135):
public function addFolderOrFileToDatabase(string $newFolderFileName): void
{
$newFolderFileName = urldecode($newFolderFileName);
$newObjectPath = $this->getFullFolderPath() . '/' . $newFolderFileName;
// ...
if (is_file($newObjectPath)) {
$newFile = new File($this->db);
$newFile->setValue('fil_fol_id', $folderId);
$newFile->setValue('fil_name', $newFolderFileName); // traversal stored in DB
// ...
$newFile->save();
}
}
No realpath() comparison or basename() check. The traversal filename (e.g., ../../../install/config.php) is stored verbatim as fil_name in the database.
File served on download (src/Documents/Entity/File.php:88-91, src/Documents/Service/DocumentsService.php:68-119):
// File.php:88-91
public function getFullFilePath(): string
{
return $this->getFullFolderPath() . '/' . $this->getValue('fil_name', 'database');
}
// DocumentsService.php:75-118
$completePath = $file->getFullFilePath(); // reconstructs traversal path
// ...
readfile($completePath); // serves arbitrary file
SameSite=Lax allows cross-site GET (src/Session/Entity/Session.php:544):
'samesite' => 'lax'
Top-level GET navigations from cross-site origins include the session cookie, enabling the CSRF attack vector.
PoC
Prerequisites: Attacker has a regular user account with access to the documents module. A documents administrator is available to be social-engineered.
# Step 1: As regular user, browse the documents module to obtain a public folder UUID
curl -b 'attacker_session' 'https://target.com/modules/documents-files.php?mode=list'
# Note a folder_uuid from the response, e.g., "550e8400-e29b-41d4-a716-446655440000"
# Step 2: Craft a link targeting install/config.php (adjust ../ depth for folder nesting)
# For a folder at adm_my_files/documents/Photos/, use three levels:…
- Record
GHSA-m9h6-8pqm-xrhf- CVSS 3.1
- 4.5 Medium
CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:U/C:H/I:N/A:N - Weakness
- CWE-22
- Updated
- 2026-11-02
NVD
4.5
Admidio is an open-source user management solution. Prior to version 5.0.9, the add mode in modules/documents-files.php accepts a name parameter validated only as 'string' type (HTML encoding), allowing path traversal characters (../) to pass through unfiltered. Combined with the absence of CSRF protection on this endpoint and SameSite=Lax session cookies, a low-privileged attacker can trick a documents administrator into clicking a crafted link that registers an arbitrary server file (e.g., install/config.php containing database credentials) into a documents folder accessible to the attacker. This issue has been patched in version 5.0.9.
- Record
CVE-2026-41656- CVSS 3.1
- 4.5 Medium
CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:U/C:H/I:N/A:N - Weakness
- CWE-22
- Updated
- 2026-11-02
OSV
4.5
Admidio: Path Traversal via Unvalidated `name` Parameter in Document Add Mode Enables Arbitrary Server File Read
Admidio is an open-source user management solution. Prior to version 5.0.9, the add mode in modules/documents-files.php accepts a name parameter validated only as 'string' type (HTML encoding), allowing path traversal characters (../) to pass through unfiltered. Combined with the absence of CSRF protection on this endpoint and SameSite=Lax session cookies, a low-privileged attacker can trick a documents administrator into clicking a crafted link that registers an arbitrary server file (e.g., install/config.php containing database credentials) into a documents folder accessible to the attacker. This issue has been patched in version 5.0.9.
- Record
CVE-2026-41656- CVSS 3.1
- 4.5 Medium
CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:U/C:H/I:N/A:N - Weakness
- CWE-22
- Updated
- 2026-11-02
OSVGHSA-m9h6-8pqm-xrhf
4.5
Admidio has Path Traversal via Unvalidated `name` Parameter in Document Add Mode that Enables Arbitrary Server File Read
Summary
The add mode in modules/documents-files.php accepts a name parameter validated only as 'string' type (HTML encoding), allowing path traversal characters (../) to pass through unfiltered. Combined with the absence of CSRF protection on this endpoint and SameSite=Lax session cookies, a low-privileged attacker can trick a documents administrator into clicking a crafted link that registers an arbitrary server file (e.g., install/config.php containing database credentials) into a documents folder accessible to the attacker.
Details
Root cause — incorrect input validation type (modules/documents-files.php:222):
case 'add':
$getName = admFuncVariableIsValid($_GET, 'name', 'string');
The 'string' type in admFuncVariableIsValid() only applies SecurityUtils::encodeHTML(StringUtils::strStripTags($value)) (system/bootstrap/function.php:414-416). Since ../ contains no HTML special characters (<, >, &, ", '), path traversal sequences pass through unchanged.
The correct type would be 'file', which calls StringUtils::strIsValidFileName() (src/Infrastructure/Utils/StringUtils.php:217-236). This function checks basename($filename) !== $filename at line 228, which would reject any path containing directory separators.
Missing CSRF protection (modules/documents-files.php:221-238):
case 'add':
$getName = admFuncVariableIsValid($_GET, 'name', 'string');
if (!$gCurrentUser->isAdministratorDocumentsFiles()) {
throw new Exception('SYS_NO_RIGHTS');
}
$folder = new Folder($gDb);
$folder->readDataByUuid($getFolderUUID);
$folder->addFolderOrFileToDatabase($getName);
// ...
No SecurityUtils::validateCsrfToken() or form object validation. Compare with folder_delete (line 140) and file_delete (line 170) which both validate CSRF tokens. The add action operates entirely via GET parameters.
Unsafe path construction (src/Documents/Entity/Folder.php:121-135):
public function addFolderOrFileToDatabase(string $newFolderFileName): void
{
$newFolderFileName = urldecode($newFolderFileName);
$newObjectPath = $this->getFullFolderPath() . '/' . $newFolderFileName;
// ...
if (is_file($newObjectPath)) {
$newFile = new File($this->db);
$newFile->setValue('fil_fol_id', $folderId);
$newFile->setValue('fil_name', $newFolderFileName); // traversal stored in DB
// ...
$newFile->save();
}
}
No realpath() comparison or basename() check. The traversal filename (e.g., ../../../install/config.php) is stored verbatim as fil_name in the database.
File served on download (src/Documents/Entity/File.php:88-91, src/Documents/Service/DocumentsService.php:68-119):
// File.php:88-91
public function getFullFilePath(): string
{
return $this->getFullFolderPath() . '/' . $this->getValue('fil_name', 'database');
}
// DocumentsService.php:75-118
$completePath = $file->getFullFilePath(); // reconstructs traversal path
// ...
readfile($completePath); // serves arbitrary file
SameSite=Lax allows cross-site GET (src/Session/Entity/Session.php:544):
'samesite' => 'lax'
Top-level GET navigations from cross-site origins include the session cookie, enabling the CSRF attack vector.
PoC
Prerequisites: Attacker has a regular user account with access to the documents module. A documents administrator is available to be social-engineered.
# Step 1: As regular user, browse the documents module to obtain a public folder UUID
curl -b 'attacker_session' 'https://target.com/modules/documents-files.php?mode=list'
# Note a folder_uuid from the response, e.g., "550e8400-e29b-41d4-a716-446655440000"
# Step 2: Craft a link targeting install/config.php (adjust ../ depth for folder nesting)
# For a folder at adm_my_files/documents/Photos/, use three levels:…
- Record
GHSA-m9h6-8pqm-xrhf- CVSS 3.1
- 4.5 Medium
CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:U/C:H/I:N/A:N - Weakness
- CWE-22
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
admidio/admidioPackagist |
through 5.0.8 | 5.0.9 |
admidio/admidioPackagist |
before 5.0.9, plus listed versions 4.1.04.1.3v4.2-Beta.1v4.2-Beta.2v4.2-Beta.3 Show 45 moreShow lessv4.2.0v4.2.1v4.2.10v4.2.11v4.2.12v4.2.13v4.2.14v4.2.2v4.2.3v4.2.4v4.2.5v4.2.6v4.2.7v4.2.8v4.2.9v4.3-Beta.1v4.3-Beta.3v4.3-Beta.4v4.3-Beta.5v4.3.0v4.3.1v4.3.10v4.3.11v4.3.12v4.3.13v4.3.14v4.3.15v4.3.16v4.3.17v4.3.2v4.3.3v4.3.4v4.3.5v4.3.6v4.3.7v4.3.8v4.3.9v5.0-Beta.1v5.0-Beta.2v5.0-Beta.3v5.0.0v5.0.1v5.0.2v5.0.3v5.0.4 |
5.0.9 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-41656 is a medium vulnerability (CVSS 4.5) in Admidio, published April 29, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.36%, the 30th percentile. Fixed in admidio/admidio 5.0.9.
References
Left out here: 4 versions and the rest of 2 source descriptions. The JSON record has them.