CVE-2026-47228

MEDIUMPre-NVD 5.25.2
EchelonGraph scoreLOW confidence

This medium-severity CVE scores 5.2 under the CNA's CVSS (NVD's own analysis pending). EPSS exploit probability: 0.0%, top 97% of all CVEs by exploit prediction. GitHub Security Advisory data not yet ingested — confidence will rise once GHSA publishes (typical lag: hours to days for open-source ecosystem CVEs; never for infrastructure-only CVEs).

Triggered by: NVD CVSS baseline
Sources: cna:github_m, epss
5.2
EchelonGraph verdictMonitorLow exploitation likelihood right now — keep watching.
  • Lower severity and no public exploit yet
CISA-KEV: Not listedEPSS: 0%CVSS: 5.2Exploit: NoneExposed: 0

No vendor fix yet — apply a workaround or compensating control (WAF / firewall / segmentation) and watch for a patch.

Admidio's CSRF in registration send_login mode resets arbitrary user passwords

Summary

modules/registration.php mode send_login regenerates a random password for user_uuid_assigned, stores its bcrypt hash in adm_users.usr_password, and emails the cleartext to that user. Every other state-changing mode in the same file (assign_member, assign_user, delete_user, create_user) calls SecurityUtils::validateCsrfToken($_POST['adm_csrf_token']) first; the send_login branch does not. A page visited by a registration-administrator can issue the request as a top-level navigation, the browser sends the admin's SameSite=Lax cookies, and the server resets the chosen user's password without any further interaction from the admin.

Details

Vulnerable Code

modules/registration.php:124-138:

} elseif ($getMode === 'send_login') {
    // User already exists and has a login than sent access data with a new password
    $user = new User($gDb, $gProfileFields);
    $user->readDataByUuid($getUserUUIDAssigned);
    $user->sendNewPassword();

// delete the registration because it isn't necessary anymore $registrationUser->notSendEmail(); $registrationUser->delete(); admRedirect(ADMIDIO_URL.FOLDER_MODULES.'/registration.php'); // => EXIT }

The four sibling branches all begin with SecurityUtils::validateCsrfToken($_POST['adm_csrf_token']); — for example delete_user at lines 110-118:

} elseif ($getMode === 'delete_user') {
    // check the CSRF token of the form against the session token
    SecurityUtils::validateCsrfToken($_POST['adm_csrf_token']);

// delete registration $registrationUser->delete(); echo json_encode(array('status' => 'success')); exit(); }

User::sendNewPassword() (src/User/Entity/User.php) calls setPassword(PasswordUtils::generatePassword()) and persists the new hash before the email is queued; the password change happens unconditionally regardless of whether the e-mail send succeeds. This means even when the operator's SMTP is unconfigured, the victim's password is still reset.

The handler accepts GET (no enforcement of HTTP method, no $_POST requirement), so an ` or auto-submitting form is sufficient.

Exploitation Flow

  • Attacker prepares a "pending registration" row anywhere they can — either by registering a self-controlled user account (the public registration flow creates these), or by waiting for an existing pending registration to be reachable.
  • Attacker hosts a page that issues:
  • A registration-administrator (someone with isAdministratorRegistration() — usually the org admin) visits the page while logged in to Admidio. The browser sends their session cookie (Admidio's session cookie does not set SameSite=Strict).
  • Admidio's handler runs as that admin. It loads the assigned user, calls User::sendNewPassword() which writes a fresh bcrypt hash to adm_users.usr_password, and queues the cleartext password to be e-mailed to the user.
  • The victim user's old password no longer works.

The cleartext lands in the *victim's* mailbox, not the attacker's, so the attacker does not get the password directly. The primary impact is therefore forced password reset (account lock-out / DoS for the victim) plus an information-disclosure side effect: the victim now has a password they did not request, and may be socially-engineered into believing the e-mail.

PoC

Tested locally against HEAD c5cde53. The reproducer confirms the password column changes server-side without any user interaction beyond an admin's GET to the crafted URL.

# 0. observe current admin password hash (the testadmin from install)
mariadb -h 127.0.0.1 -P 3399 -u admidio -p... admidio \
    -e "SELECT usr_id, usr_login_name, LEFT(usr_password, 12) AS pwd FROM adm_users WHERE usr_id IN (2, 7);"
usr_id  usr_login_name  pwd
2       testadmin       $2y$12$AB.h
7       victim          $2y$12$L9q3

1. attacker creates a pending registration with user_uuid pointing at "victim"

mariadb ... admidio -e "INSERT INTO adm_registrations (reg_org_id, reg_usr_id, reg_timestamp) VALUES (1, 7, NOW());"

(the pending row gives the request a valid user_uuid for $registrationUser->delete())

2. crafted CSRF endpoint, hit from a third-party page in the admin's browser:

no adm_csrf_token, GET only

curl -b $admin_cookie \ "http://127.0.0.1:8085/modules/registration.php?mode=send_login&user_uuid=$pending_uuid&user_uuid_assigned="

3. observe the victim's password hash has changed

mariadb ... admidio \ -e "SELECT usr_id, usr_login_name, LEFT(usr_password, 12) AS pwd FROM adm_users WHERE usr_id=7;" usr_id usr_login_name pwd 7 victim $2y$12$w5lQ

The hash before the attack was $2y$12$L9q3...; after the attack it is $2y$12$w5lQ.... The victim's previously-known password no longer authenticates them.

The same call against user_uuid_assigned= resets the admin's own password — locking out the registration-administrator from their own account.

Impact

A registration-administrator who visits a hostile page is silently coerced into resetting any user's password.

* Account lockout / DoS. The victim user (which can be the admin themselves, or any other user with a registration row routed through this admin) loses access; their stored password is replaced with a server-generated one that only lands in the victim's mailbox. * Phish-flavoured social engineering. The unsolicited "your new Admidio password is …" e-mail is a credible-looking message that the attacker can pair with a phishing site to harvest the new password. * Self-targetable. Because the attacker also controls the public self-registration flow, they can reliably create a pending_registration row whose user_uuid_assigned points at any chosen victim.

UI:R reflects that an admin must visit a page; PR:N because the *attacker* needs no Admidio credentials; I:H because user authentication state is destroyed; A:L because the affected user is locked out of an account but the platform stays up.

Recommended Fix

Add a CSRF check at the top of the branch and require POST:

} elseif ($getMode === 'send_login') {
    // check the CSRF token of the form against the session token
    SecurityUtils::validateCsrfToken($_POST['adm_csrf_token']);

if ($_SERVER['REQUEST_METHOD'] !== 'POST') { throw new Exception('SYS_INVALID_PAGE_VIEW'); }

$user = new User($gDb, $gProfileFields); $user->readDataByUuid($getUserUUIDAssigned); $user->sendNewPassword(); ... }

A regression test should issue GET /modules/registration.php?mode=send_login&... from a session that has no current page (no in-session form key) and assert that usr_password` is unchanged.

CVSS v3
5.2
EG Score
5.2(low)
EPSS
3.1%
KEV
Not listed

Published

May 29, 2026

Last Modified

May 29, 2026

Vendor Advisories for CVE-2026-47228(1)

These vendors published their own advisory mentioning this CVE — often with vendor-specific remediation steps + affected product lists not in NVD.

Affected Packages

(1 across 1 ecosystem)
Packagist(1)
PackageVulnerable rangeFixed inDependents
admidio/admidio4.1.0 ... v5.0.9 (55 versions)5.0.10

Data Freshness Timeline

(refreshed 3× in last 7d / 14× in last 30d)

Each row is a source pipeline that fetched or updated this CVE on that date, with what changed. For example, "NVD update" means NVD published or revised its analysis for this CVE; "MITRE cvelistV5" means we ingested or refreshed it from the CNA feed. Most recent first.

  1. 2026-07-16 01:47 UTCEG score recompute
  2. 2026-07-14 13:51 UTCEG score recompute
  3. 2026-07-11 17:00 UTCEG score recompute
  4. 2026-07-08 17:15 UTCEG score recompute
  5. 2026-07-02 03:44 UTCEG score recompute
  6. 2026-07-01 01:17 UTCEG score recompute
  7. 2026-06-29 21:07 UTCEG score recompute
  8. 2026-06-28 19:28 UTCEG score recompute
  9. 2026-06-27 17:49 UTCEG score recompute
  10. 2026-06-26 16:11 UTCEG score recompute
  11. 2026-06-25 06:19 UTCEG score recompute
  12. 2026-06-24 02:45 UTCEG score recompute
  13. 2026-06-18 02:59 UTCEG score recompute
  14. 2026-06-17 01:20 UTCEG score recompute
  15. 2026-06-15 23:41 UTCEG score recompute
  16. 2026-06-14 23:18 UTCEPSS rescore
  17. 2026-06-14 22:03 UTCEG score recompute
  18. 2026-06-13 23:00 UTCEPSS rescore
  19. 2026-06-13 20:25 UTCEG score recompute
  20. 2026-06-12 23:12 UTCEPSS rescore
  21. 2026-06-12 18:46 UTCEG score recompute
  22. 2026-06-11 17:07 UTCEG score recompute
  23. 2026-06-10 15:29 UTCEG score recompute
  24. 2026-06-09 13:49 UTCEG score recompute
  25. 2026-06-08 12:11 UTCEG score recompute
Show 8 more
  1. 2026-06-07 10:32 UTCEG score recompute
  2. 2026-06-06 08:54 UTCEG score recompute
  3. 2026-06-05 07:16 UTCEG score recompute
  4. 2026-06-04 05:37 UTCEG score recompute
  5. 2026-06-03 03:58 UTCEG score recompute
  6. 2026-06-02 02:19 UTCEG score recompute
  7. 2026-06-01 00:41 UTCEG score recompute
  8. 2026-05-29 22:26 UTCEG score recompute

Frequently asked(5)

What is CVE-2026-47228?
CVE-2026-47228 is a medium vulnerability published on May 29, 2026. Admidio's CSRF in registration send_login mode resets arbitrary user passwords Summary modules/registration.php mode sendlogin regenerates a random password for useruuidassigned, stores its bcrypt hash in admusers.usrpassword, and emails the cleartext to that user. Every other state-changing mode…
When was CVE-2026-47228 disclosed?
CVE-2026-47228 was first published in the National Vulnerability Database on May 29, 2026. EchelonGraph re-ingests CVE updates from NVD on a 2-hour cycle, so this page reflects the latest published state.
Is CVE-2026-47228 actively exploited?
CVE-2026-47228 is not currently on CISA's Known Exploited Vulnerabilities catalog. FIRST EPSS estimates a 3.1% percentile likelihood of exploitation in the next 30 days — higher percentiles indicate greater predicted risk.
What is the CVSS score of CVE-2026-47228?
CVE-2026-47228 has a CVSS v4.0 base score of 5.2 (CNA self-assessment; NVD's own analysis pending). The EG score is currently aggregating — additional source signals are being incorporated as they become available..
How do I remediate CVE-2026-47228?
Patch to the fixed version published by the affected vendor. Where vendor advisories exist for CVE-2026-47228, EchelonGraph cross-links them in the Vendor Advisories panel below — those typically contain the canonical remediation steps, fixed version numbers, and any vendor-specific mitigations.

Dependency Blast Radius

See which npm, PyPI, Go, and Maven packages are affected by CVE-2026-47228

Explore →

Is Your Infrastructure Affected by CVE-2026-47228?

EchelonGraph automatically scans your cloud infrastructure and maps CVE exposure using blast radius analysis.