Every CVE Search/ Get API key

CVE-2026-47229

Admidio: CSRF in SSO client `enable` action toggles SAML/OIDC clients without token validation

5.4 MediumFix available

Admidio is an open-source user management solution. Prior to version 5.0.10, modules/sso/clients.php validates an adm_csrf_token on every state-changing branch except enable. The enable case loads the SAML or OIDC client by UUID, calls $client->enable($enabled), and persists the new state with no token check. Because the action is reachable via plain GET parameters, a third-party page can trick an authenticated administrator into disabling (or silently re-enabling) any configured SAML or OIDC client. Disabling an SSO client breaks every downstream relying-party application that authenticates through it. Version 5.0.10 contains a fix.

Attack profile

How easy it is to exploit

Attack vector
Network
Complexity
Low
Privileges needed
None
User interaction
Required

What an attacker can affect

Confidentiality
None
Integrity
Low
Availability
Low

Exploit likelihood

0.14%Up 0.1 points since Jun 12, 2026
90%50%10%1%

What each source reports

CVE List Score used 5.4

Admidio: CSRF in SSO client `enable` action toggles SAML/OIDC clients without token validation

Admidio is an open-source user management solution. Prior to version 5.0.10, modules/sso/clients.php validates an adm_csrf_token on every state-changing branch except enable. The enable case loads the SAML or OIDC client by UUID, calls $client->enable($enabled), and persists the new state with no token check. Because the action is reachable via plain GET parameters, a third-party page can trick an authenticated administrator into disabling (or silently re-enabling) any configured SAML or OIDC client. Disabling an SSO client breaks every downstream relying-party application that authenticates through it. Version 5.0.10 contains a fix.

Record
CVE-2026-47229
CVSS 3.1
5.4 MediumCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:L
Weakness
CWE-352
Updated
2026-11-02
EUVDEUVD-2026-57206 5.4

Admidio is an open-source user management solution. Prior to version 5.0.10, modules/sso/clients.php validates an adm_csrf_token on every state-changing branch except enable. The enable case loads the SAML or OIDC client by UUID, calls $client->enable($enabled), and persists the new state with no token check. Because the action is reachable via plain GET parameters, a third-party page can trick an authenticated administrator into disabling (or silently re-enabling) any configured SAML or OIDC client. Disabling an SSO client breaks every downstream relying-party application that authenticates through it. Version 5.0.10 contains a fix.

Record
EUVD-2026-57206
CVSS 3.1
5.4 MediumCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:L
Updated
2026-11-02
GitHub AdvisoriesGHSA-xg76-5qj2-2hhv 5.4

Admidio: CSRF in SSO client `enable` action toggles SAML/OIDC clients without token validation

Summary

modules/sso/clients.php validates an adm_csrf_token on every state-changing branch except enable. The enable case loads the SAML or OIDC client by UUID, calls $client->enable($enabled), and persists the new state with no token check. Because the action is reachable via plain GET parameters, a third-party page can trick an authenticated administrator into disabling (or silently re-enabling) any configured SAML or OIDC client. Disabling an SSO client breaks every downstream relying-party application that authenticates through it.

Details

Vulnerable Code

modules/sso/clients.php:84-115 — the file's other branches each begin with SecurityUtils::validateCsrfToken($_POST['adm_csrf_token']);, but case 'enable': does not:

case 'delete_oidc':
    // check the CSRF token of the form against the session token
    SecurityUtils::validateCsrfToken($_POST['adm_csrf_token']);

    $oidcService = new OIDCService($gDb, $gCurrentUser);
    $client = $oidcService->getClientFromUUID($getClientUUID);
    $client->delete();
    echo json_encode(array('status' => 'success'));
    break;

case 'enable':                                          // <- no CSRF validation
    $enabled = admFuncVariableIsValid($_GET, 'enabled', 'boolean');
    $client = new SAMLClient($gDb);
    $client->readDataByUuid($getClientUUID);
    if ($client->isNewRecord()) {
        // Not a SAML record, so try OIDC:
        $client = new OIDCClient($gDb);
        $client->readDataByUuid($getClientUUID);
    }
    if ($client->isNewRecord()) {
        throw new Exception('SYS_SSO_INVALID_CLIENT');
    }
    $client->enable($enabled);
    $client->save();
    echo json_encode(['success' => true]);
    break;

The enable($enabled) call is documented to set a single boolean column on the SAML / OIDC client row — smc_enabled for SAML, ocl_enabled for OIDC — and save() persists the change immediately. The handler accepts plain GET (admFuncVariableIsValid($_GET, 'enabled', 'boolean')), so a <img src=...> or auto-submitting form is sufficient.

Exploitation Flow

  1. Attacker prepares a hostile page that loads (e.g.) <img src="http://victim.example/modules/sso/clients.php?mode=enable&uuid=<known-sso-client-uuid>&enabled=0">. The client UUID can be observed by anyone who has visited the SSO settings, by anyone who has crawled the SAML metadata endpoint, or by anyone with read access to the SSO clients table — but the value is also enumerable: an admin viewing the list of SSO clients in the UI exposes data-uuid attributes in the rendered HTML, and SSO metadata endpoints (e.g. modules/sso/saml.php?metadata=1&uuid=...) confirm valid UUIDs by returning XML.
  2. An Admidio administrator visits the hostile page while logged in. The browser sends Admidio's session cookie (which does not set SameSite=Strict).
  3. The server runs case 'enable': as the admin, sets smc_enabled=0 (or ocl_enabled=0), and replies {"success":true}.
  4. The configured SAML / OIDC client is now disabled. Every downstream application authenticating through it gets SYS_SSO_INVALID_CLIENT on its next AuthnRequest / token-endpoint call. The outage persists until an admin notices and toggles it back on.

The attacker can also flip the bit the other way: silently re-enabling a client that an admin had previously deactivated (perhaps because of a security concern with that relying party).

PoC

Tested on HEAD c5cde53. To produce a deterministic test target, an SSO client is provisioned directly in the DB:

# 0. seed a SAML client
mariadb -h 127.0.0.1 -P 3399 -u admidio -p... admidio <<'SQL'
INSERT INTO adm_saml_clients (smc_uuid, smc_org_id, smc_client_name, smc_acs_url, smc_enabled,
                              smc_timestamp_create, smc_usr_id_create)
VALUES ('aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee', 1, 'Test SAML', 'https://app.example/acs', 1,
        NOW(), 2);
SQL

mariadb ... admidio -e "SELECT smc_uuid, smc_client_name,…
Record
GHSA-xg76-5qj2-2hhv
CVSS 3.1
5.4 MediumCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:L
Weakness
CWE-352
Updated
2026-11-02
NVD 5.4

Admidio is an open-source user management solution. Prior to version 5.0.10, modules/sso/clients.php validates an adm_csrf_token on every state-changing branch except enable. The enable case loads the SAML or OIDC client by UUID, calls $client->enable($enabled), and persists the new state with no token check. Because the action is reachable via plain GET parameters, a third-party page can trick an authenticated administrator into disabling (or silently re-enabling) any configured SAML or OIDC client. Disabling an SSO client breaks every downstream relying-party application that authenticates through it. Version 5.0.10 contains a fix.

Record
CVE-2026-47229
CVSS 3.1
5.4 MediumCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:L
Weakness
CWE-352
Updated
2026-11-02
OSV 5.4

Admidio: CSRF in SSO client `enable` action toggles SAML/OIDC clients without token validation

Admidio is an open-source user management solution. Prior to version 5.0.10, modules/sso/clients.php validates an adm_csrf_token on every state-changing branch except enable. The enable case loads the SAML or OIDC client by UUID, calls $client->enable($enabled), and persists the new state with no token check. Because the action is reachable via plain GET parameters, a third-party page can trick an authenticated administrator into disabling (or silently re-enabling) any configured SAML or OIDC client. Disabling an SSO client breaks every downstream relying-party application that authenticates through it. Version 5.0.10 contains a fix.

Record
CVE-2026-47229
CVSS 3.1
5.4 MediumCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:L
Weakness
CWE-352
Updated
2026-11-02
OSVGHSA-xg76-5qj2-2hhv 5.4

Admidio: CSRF in SSO client `enable` action toggles SAML/OIDC clients without token validation

Summary

modules/sso/clients.php validates an adm_csrf_token on every state-changing branch except enable. The enable case loads the SAML or OIDC client by UUID, calls $client->enable($enabled), and persists the new state with no token check. Because the action is reachable via plain GET parameters, a third-party page can trick an authenticated administrator into disabling (or silently re-enabling) any configured SAML or OIDC client. Disabling an SSO client breaks every downstream relying-party application that authenticates through it.

Details

Vulnerable Code

modules/sso/clients.php:84-115 — the file's other branches each begin with SecurityUtils::validateCsrfToken($_POST['adm_csrf_token']);, but case 'enable': does not:

case 'delete_oidc':
    // check the CSRF token of the form against the session token
    SecurityUtils::validateCsrfToken($_POST['adm_csrf_token']);

    $oidcService = new OIDCService($gDb, $gCurrentUser);
    $client = $oidcService->getClientFromUUID($getClientUUID);
    $client->delete();
    echo json_encode(array('status' => 'success'));
    break;

case 'enable':                                          // <- no CSRF validation
    $enabled = admFuncVariableIsValid($_GET, 'enabled', 'boolean');
    $client = new SAMLClient($gDb);
    $client->readDataByUuid($getClientUUID);
    if ($client->isNewRecord()) {
        // Not a SAML record, so try OIDC:
        $client = new OIDCClient($gDb);
        $client->readDataByUuid($getClientUUID);
    }
    if ($client->isNewRecord()) {
        throw new Exception('SYS_SSO_INVALID_CLIENT');
    }
    $client->enable($enabled);
    $client->save();
    echo json_encode(['success' => true]);
    break;

The enable($enabled) call is documented to set a single boolean column on the SAML / OIDC client row — smc_enabled for SAML, ocl_enabled for OIDC — and save() persists the change immediately. The handler accepts plain GET (admFuncVariableIsValid($_GET, 'enabled', 'boolean')), so a <img src=...> or auto-submitting form is sufficient.

Exploitation Flow

  1. Attacker prepares a hostile page that loads (e.g.) <img src="http://victim.example/modules/sso/clients.php?mode=enable&uuid=<known-sso-client-uuid>&enabled=0">. The client UUID can be observed by anyone who has visited the SSO settings, by anyone who has crawled the SAML metadata endpoint, or by anyone with read access to the SSO clients table — but the value is also enumerable: an admin viewing the list of SSO clients in the UI exposes data-uuid attributes in the rendered HTML, and SSO metadata endpoints (e.g. modules/sso/saml.php?metadata=1&uuid=...) confirm valid UUIDs by returning XML.
  2. An Admidio administrator visits the hostile page while logged in. The browser sends Admidio's session cookie (which does not set SameSite=Strict).
  3. The server runs case 'enable': as the admin, sets smc_enabled=0 (or ocl_enabled=0), and replies {"success":true}.
  4. The configured SAML / OIDC client is now disabled. Every downstream application authenticating through it gets SYS_SSO_INVALID_CLIENT on its next AuthnRequest / token-endpoint call. The outage persists until an admin notices and toggles it back on.

The attacker can also flip the bit the other way: silently re-enabling a client that an admin had previously deactivated (perhaps because of a security concern with that relying party).

PoC

Tested on HEAD c5cde53. To produce a deterministic test target, an SSO client is provisioned directly in the DB:

# 0. seed a SAML client
mariadb -h 127.0.0.1 -P 3399 -u admidio -p... admidio <<'SQL'
INSERT INTO adm_saml_clients (smc_uuid, smc_org_id, smc_client_name, smc_acs_url, smc_enabled,
                              smc_timestamp_create, smc_usr_id_create)
VALUES ('aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee', 1, 'Test SAML', 'https://app.example/acs', 1,
        NOW(), 2);
SQL

mariadb ... admidio -e "SELECT smc_uuid, smc_client_name,…
Record
GHSA-xg76-5qj2-2hhv
CVSS 3.1
5.4 MediumCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:L
Weakness
CWE-352
Updated
2026-11-02

Affected products

Affected packages

Affected packages
PackageAffectedFixed
admidio/admidio
Packagist
through 5.0.9
5.0.10
admidio/admidio
Packagist
before 5.0.10, plus listed versions
4.1.04.1.3v4.2-Beta.1v4.2-Beta.2v4.2-Beta.3
Show 45 moreShow less
v4.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.10

History

History
RecordedChangedSources
aliasesEUVD
first indexedCVE List, GitHub Advisories, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2026-47229 is a medium vulnerability (CVSS 5.4) in Admidio, published May 29, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.14%, the 3rd percentile. Fixed in admidio/admidio 5.0.10.

References

This page doesn't list everything

Left out here: 5 versions and the rest of 2 source descriptions. The JSON record has them.

MoveEnter Open