Admidio has Missing CSRF Protection on Registration Approval Actions
The create_user, assign_member, and assign_user action modes in modules/registration.php approve pending user registrations via GET request without validating a CSRF token. Unlike the delete_user mode in the same file (which correctly validates the token), these three approval actions read their parameters from $_GET and perform irreversible state changes without any protection. An attacker who has submitted a pending registration can extract their own user UUID from the registration confirmation email URL, then trick any user with the rol_approve_users right into visiting a crafted URL that automatically approves the registration. This bypasses the manual registration approval workflow entirely.
File: modules/registration.php, lines 90-128
The delete_user mode validates the CSRF token (line 99), but the three approval modes do not:
```php
// assign_member and assign_user: no CSRF check
} elseif (in_array($getMode, array('assign_member', 'assign_user'))) {
$registrationService = new RegistrationService($gDb, $getUserUUID);
$message = $registrationService->assignRegistration($getUserUUIDAssigned, $getMode === 'assign_member');
$gMessage->setForwardUrl($message['forwardUrl']);
$gMessage->show($message['message']);
// create_user: no CSRF check
} elseif ($getMode === 'create_user') {
$registrationUser->acceptRegistration();
if ($gCurrentUser->isAdministratorRoles()) {
admRedirect(SecurityUtils::encodeUrl(ADMIDIO_URL . FOLDER_MODULES.'/profile/roles.php',
array('accept_registration' => true, 'user_uuid' => $getUserUUID)));
}
// delete_user: CSRF IS validated
} elseif ($getMode === 'delete_user') {
SecurityUtils::validateCsrfToken($_POST['adm_csrf_token']); // <-- protected
$registrationUser->delete();
}
```
The three approval modes read both UUIDs exclusively from $_GET (lines 41-43):
The approve action modes accept $_GET parameters user_uuid and user_uuid_assigned without any POST body or CSRF token. Both parameters pass through admFuncVariableIsValid() with uuid type validation, which prevents SQL injection but provides no CSRF protection.
File: D:/bugcrowd/admidio/repo/src/Infrastructure/Service/RegistrationService.php, lines 154-157
When a user submits a registration, Admidio sends a confirmation email containing a URL of the form:
```
https://TARGET/adm_program/modules/registration.php?id=VALIDATION_ID&user_uuid=REGISTRANT_UUID
```
The user_uuid in this URL is the registrant's own UUID. The attacker has this UUID because they received the confirmation email for their own registration.
File: D:/bugcrowd/admidio/repo/src/Users/Entity/User.php, lines 1603-1606
```php
public function isAdministratorRegistration(): bool
{
return $this->checkRolesRight('rol_approve_users');
}
```
The rol_approve_users right is a delegated organizational privilege, not full system administrator access. Any member designated to review registrations -- for example, a membership secretary or club administrator -- is a valid CSRF victim.
Scenario: Attacker bypasses manual registration approval
Prerequisites: (1) Manual registration approval is enabled. (2) The attacker submits a registration form and receives a confirmation email with their user_uuid. (3) After clicking the confirmation link, their registration enters the pending queue.
Step 1: Attacker extracts their own user_uuid from the registration email
The confirmation email contains a link of the form:
```
https://TARGET/adm_program/modules/registration.php?id=VALIDATION_ID&user_uuid=ATTACKER_UUID
```
The ATTACKER_UUID is visible to the attacker from their own email.
Step 2: CSRF auto-approval via image tag
The attacker hosts a page that the victim (admin with rol_approve_users right) visits:
```html
<img src="https://TARGET/adm_program/modules/registration.php?mode=create_user&user_uuid=ATTACKER_UUID" width="1" height="1">
```
When the victim loads this page, Admidio silently accepts the attacker registration and assigns default organization roles. No confirmation or token is required.
Step 3: Force-assign registration to an existing account (account takeover)
If the attacker knows the UUID of an existing member (obtainable from profile page URLs when the user list is visible) and has a pending registration:
```html
<img src="https://TARGET/adm_program/modules/registration.php?mode=assign_user&user_uuid=ATTACKER_REG_UUID&user_uuid_assigned=EXISTING_USER_UUID" width="1" height="1">
```
This merges the pending registration into the existing account, replacing that account login credentials with the attacker credentials.
This issue can be reached over the network, attack complexity is low, an attacker needs administrative 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.
The score comes from this vector: CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:U/C:N/I:H/A:N
CVE-2026-34384 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.
CVE-2026-34384 is recorded against 2 packages.
Published on 31 March 2026 and last revised on 24 July 2026. A public exploit is known to exist, which raises the urgency of patching considerably. A vendor advisory or fix has been published. Record sourced from NVD.
github.com
github.com
github.com
admidio has other advisories on record. If you are patching this one, these are worth checking on the same host:
These advisories are the same class of weakness (CWE-352: Cross-Site Request Forgery (CSRF)) in other software:
Details
CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:U/C:N/I:H/A:N
Affected Packages
| Software | From version | Fixed in |
|---|---|---|
| admidio | — | 5.0.8 |
| admidio/admidio | — | 5.0.8 |
References
Similar Threats
Exploit Protection
CVE-2026-34384 carries CVSS 4.5 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-34384 →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.
Stay up to date with the latest from Boteraser.
We use cookies to improve your experience on our site. By using our site, you consent to cookies.
Manage your cookie preferences below:
Essential cookies enable basic functions and are necessary for the proper function of the website.
CloudFlare provides web performance and security solutions, enhancing site speed and protecting against threats.
Service URL: developers.cloudflare.com (opens in a new window)
These cookies are needed for adding comments on this website.
These cookies are used for managing login functionality on this website.
Statistics cookies collect information anonymously. This information helps us understand how visitors use our website.
Google Analytics is a powerful tool that tracks and analyzes website traffic for informed marketing decisions.
Service URL: policies.google.com (opens in a new window)
You can find more information in our Cookie Policy and Privacy Policy.