GHSA-gpxg-fx2g-qxj2

Suggest an improvement
Source
https://github.com/advisories/GHSA-gpxg-fx2g-qxj2
Import Source
https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-gpxg-fx2g-qxj2/GHSA-gpxg-fx2g-qxj2.json
JSON Data
https://api.osv.dev/v1/vulns/GHSA-gpxg-fx2g-qxj2
Published
2026-05-06T23:34:20Z
Modified
2026-05-06T23:49:30.988333Z
Severity
  • 6.1 (Medium) CVSS_V3 - CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:U/C:H/I:H/A:N CVSS Calculator
Summary
Kanidm: Stored HTML injection in "passkey-enrolment" partial via displayname → htmx-driven authenticated request forgery
Details

Summary

The kanidmd web UI renders the WebAuthn passkey-registration challenge as raw JSON inside an inline <script id="data"> element using the Askama |safe filter. The challenge embeds the account's displayname, which serde_json serialises without escaping </>. A displayname containing </script> therefore terminates the script element early and injects arbitrary HTML into the credential-update page. Because the page is htmx-driven and the server's CSP allows 'unsafe-eval', injected hx-* attributes can issue authenticated same-origin API requests with the viewer's bearer cookie.

Impact

An authenticated attacker who is a member of idm_people_admins can write the displayname of any Person entry — including high-privilege persons — because idm_acp_people_pii_manage carries no high-privilege exclusion filter. When the targeted high-privilege user later opens Add Passkey on their own credential-update page (/ui/reset), the injected markup is swapped into the DOM and htmx fires attacker-chosen same-origin requests authenticated as the victim. This allows a helpdesk-tier operator to escalate to idm_admins (e.g. by POSTing themselves into the group) or otherwise act with the victim's session. The self-write path (idm_people_self_name_write) is self-XSS only and is not counted toward impact. Even without the htmx vector, the breakout permits <meta http-equiv='refresh'> open-redirect and arbitrary defacement of the credential page.

Details

  • https://github.com/kanidm/kanidm/blob/master/server/core/templates/credentialupdateaddpasskeypartial.html#L3 — the |safe sink
  • https://github.com/kanidm/kanidm/blob/master/server/core/src/https/views/reset.rs#L506-L509 — serde_json::to_string of the challenge
  • https://github.com/kanidm/kanidm/blob/master/server/lib/src/idm/credupdatesession.rs#L2453-L2460 — displayname flows into start_passkey_registration

Affected versions

All releases shipping the htmx credential-update views

Database specific
{
    "nvd_published_at": null,
    "severity": "MODERATE",
    "github_reviewed_at": "2026-05-06T23:34:20Z",
    "cwe_ids": [
        "CWE-79"
    ],
    "github_reviewed": true
}
References

Affected packages

crates.io / kanidm

Package

Affected ranges

Type
SEMVER
Events
Introduced
0Unknown introduced version / All previous versions are affected
Fixed
1.9.3

Database specific

last_known_affected_version_range
"<= 1.9.2"
source
"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-gpxg-fx2g-qxj2/GHSA-gpxg-fx2g-qxj2.json"