Skip to main content

Boteraser | Website and Server Security Solutions

🛡️ CVE-2026-32816 — admidio

🟡 CVSS 5.7 — Medium ⚠️ Exploit Public CWE-352 NVD
5.7
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

Admidio is Missing CSRF Validation on Role Delete, Activate, and Deactivate Actions

Summary

The delete, activate, and deactivate modes in modules/groups-roles/groups_roles.php perform destructive state changes on organizational roles but never validate an anti-CSRF token. The client-side UI passes a CSRF token to callUrlHideElement(), which includes it in the POST body, but the server-side handlers ignore $_POST["adm_csrf_token"] entirely for these three modes. An attacker who can discover a role UUID (visible in the public cards view when the module is publicly accessible) can embed a forged POST form on any external page and trick any user with the rol_assign_roles right into deleting or toggling roles for the organization. Role deletion is permanent and cascades to all memberships, event associations, and rights data.

Details

CSRF Token Is Sent but Never Validated

File: D:/bugcrowd/admidio/repo/modules/groups-roles/groups_roles.php, lines 150-173

The save mode (lines 143-148) is CSRF-protected via RolesService::save() which calls getFormObject($_POST["adm_csrf_token"])->validate(). The delete, activate, and deactivate modes receive no equivalent protection:

```php

case 'delete':

// delete role from database

$role = new Role($gDb);

$role->readDataByUuid($getRoleUUID);

if ($role->delete()) {

echo json_encode(array('status' => 'success'));

}

break;

case 'activate':

// set role active

$role = new Role($gDb);

$role->readDataByUuid($getRoleUUID);

$role->activate();

echo 'done';

break;

case 'deactivate':

// set role inactive

$role = new Role($gDb);

$role->readDataByUuid($getRoleUUID);

$role->deactivate();

echo 'done';

break;

```

The only input validated is $getRoleUUID at line 41, checked as a 'uuid' type. This prevents SQL injection but provides no CSRF protection.

Client-Side UI Passes Token; Server Ignores It

File: D:/bugcrowd/admidio/repo/system/js/common_functions.js, lines 101-129

The presenter embeds the CSRF token into the JavaScript callUrlHideElement() call (GroupsRolesPresenter.php line 131). The function sends it in an AJAX POST body:

```javascript

function callUrlHideElement(elementId, url, csrfToken, callback) {

$.post(url, {

"adm_csrf_token": csrfToken, // sent in POST body

"uuid": elementId

}, function(data) { ... });

}

```

The server-side handler reads mode from $_GET but never reads or validates $_POST["adm_csrf_token"] for delete, activate, or deactivate. An attacker omits the token field entirely; the server does not check for its presence.

Who Can Be the CSRF Victim

File: D:/bugcrowd/admidio/repo/modules/groups-roles/groups_roles.php, lines 49-54

```php

if ($getMode !== 'cards') {

// only users with the special right are allowed to manage roles

if (!$gCurrentUser->isAdministratorRoles()) {

throw new Exception('SYS_NO_RIGHTS');

}

}

```

isAdministratorRoles() maps to checkRolesRight('rol_assign_roles'). This is a delegated organizational right, not full system administrator (isAdministrator()) access. Any member granted the right to manage roles -- for example, a volunteer coordinator or chapter secretary -- is a valid CSRF victim.

Role UUIDs Are Discoverable Without Authentication

File: D:/bugcrowd/admidio/repo/src/UI/Presenter/GroupsRolesPresenter.php, line 84

```php

$templateRow['id'] = 'role_' . $role->getValue('rol_uuid');

```

The cards mode (the default view) does not require the rol_assign_roles right and is publicly reachable when the module is enabled. Role UUIDs appear as HTML element IDs and in action data attributes in the page source. An unauthenticated visitor can collect all role UUIDs before staging the CSRF attack against a logged-in victim.

Role::delete() Is Permanent and Cascading

File: D:/bugcrowd/admidio/repo/src/Roles/Entity/Role.php, lines 264-288

```php

$this->db->startTransaction();

// Remove all role dependency relationships

$sql = 'DELETE FROM ' . TBL_ROLE_DEPENDENCIES . ' WHERE rld_rol_id_parent = ? OR rld_rol_id_child = ?';

$this->db->queryPrepared($sql, array($rolId, $rolId));

// Remove all memberships

$sql = 'DELETE FROM ' . TBL_MEMBERS . ' WHERE mem_rol_id = ?';

$this->db->queryPrepared($sql, array($rolId));

// Disassociate all events linked to this role

$sql = 'UPDATE ' . TBL_EVENTS . ' SET dat_rol_id = NULL WHERE dat_rol_id = ?';

$this->db->queryPrepared($sql, array($rolId));

// Remove all access-right entries for this role

$sql = 'DELETE FROM ' . TBL_ROLES_RIGHTS_DATA . ' WHERE rrd_rol_id = ?';

$this->db->queryPrepared($sql, array($rolId));

```

There is no soft-delete or recycle bin. Deletion permanently removes the role record, all memberships within it, all role dependency rules, and all per-module access rights granted to the role.

PoC

The attacker hosts the following HTML page and tricks a user with the `r

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is low, an attacker needs low-level privileges on the target. A user must be tricked into taking some action. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality none, integrity high, availability none.

CVSS metrics in full

The score comes from this vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:N/I:H/A:N

  • Attack vector: Network — reachable from anywhere that can route to the service.
  • Attack complexity: Low — the attack works reliably, with no preparation.
  • Privileges required: Low — an ordinary user account is enough.
  • User interaction: Required — someone has to click, open or visit something.
  • Scope: Unchanged — the damage stays inside the vulnerable component.
  • Confidentiality impact: None.
  • Integrity impact: High — total loss, or loss the attacker controls.
  • Availability impact: None.

Weakness class

CVE-2026-32816 is classified as CWE-352: Cross-Site Request Forgery (CSRF). A state-changing request is accepted without proof it was intended, so another site can trigger it using the victim's session.

Affected software

CVE-2026-32816 is recorded against 2 packages.

  • admidio (from 5.0.0 up to 5.0.7)
  • admidio/admidio (from 5.0.0 up to 5.0.7)

Timeline and source

Published on 19 March 2026 and last revised on 17 June 2026. A public exploit is known to exist, which raises the urgency of patching considerably. Record sourced from NVD.

References

github.com
github.com

Other advisories for this package

admidio has other advisories on record. If you are patching this one, these are worth checking on the same host:

Same weakness in other software

These advisories are the same class of weakness (CWE-352: Cross-Site Request Forgery (CSRF)) in other software:

Details

Severity MEDIUM
CVSS Score 5.7
CVSS Vector CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:N/I:H/A:N
CWE CWE-352
Public Exploit ⚠️ Yes
Source NVD
Published 2026-03-19
Updated 2026-08-20
Modified 2026-06-17
Fix URL N/A

Affected Packages

Software From version Fixed in
admidio 5.0.0 5.0.7
admidio/admidio 5.0.0 5.0.7

Similar Threats

Exploit Protection

Are you running admidio?

CVE-2026-32816 carries CVSS 5.7 Medium rating and a public exploit already exists. BotEraser checks your installation against this and other known CVE records, and blocks IPs associated with exploit activity.

Check My Site For CVE-2026-32816 →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.

Browse related advisories

All advisoriesCVECVE 2026