` 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'","image":"https://o3.security/opengraph.png","datePublished":"2026-05-06T23:34:20Z","dateModified":"2026-05-06T23:49:30.988333Z","url":"https://o3.security/vulnerability/GHSA-gpxg-fx2g-qxj2","inLanguage":"en","author":{"@id":"https://o3.security/#organization"},"publisher":{"@id":"https://o3.security/#organization"},"mainEntityOfPage":{"@type":"WebPage","@id":"https://o3.security/vulnerability/GHSA-gpxg-fx2g-qxj2"},"speakable":{"@type":"SpeakableSpecification","cssSelector":["h1",".vuln-summary",".vuln-severity",".vuln-mitigation"]},"about":[{"@type":"SoftwareApplication","name":"kanidm","applicationCategory":"crates.io","softwareVersion":"1.9.3"}],"citation":[{"@type":"CreativeWork","name":"OSV.dev","url":"https://osv.dev/vulnerability/GHSA-gpxg-fx2g-qxj2"},{"@type":"CreativeWork","url":"https://github.com/kanidm/kanidm/security/advisories/GHSA-gpxg-fx2g-qxj2"}]}` 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'","url":"https://o3.security/vulnerability/GHSA-gpxg-fx2g-qxj2","identifier":"GHSA-gpxg-fx2g-qxj2","datePublished":"2026-05-06T23:34:20Z","dateModified":"2026-05-06T23:49:30.988333Z","inLanguage":"en","license":"https://creativecommons.org/licenses/by/4.0/","keywords":["GHSA-gpxg-fx2g-qxj2","MEDIUM severity","CVE","vulnerability","security advisory"],"creator":{"@id":"https://o3.security/#organization"},"isAccessibleForFree":true,"citation":[{"@type":"CreativeWork","name":"OSV.dev","url":"https://osv.dev/vulnerability/GHSA-gpxg-fx2g-qxj2"}],"variableMeasured":[{"@type":"PropertyValue","name":"CVSS Base Score","value":6.1,"description":"CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:U/C:H/I:H/A:N"},{"@type":"PropertyValue","name":"Severity","value":"MEDIUM"}]}` 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 bea"}},{"@type":"Question","name":"How severe is GHSA-gpxg-fx2g-qxj2?","acceptedAnswer":{"@type":"Answer","text":"GHSA-gpxg-fx2g-qxj2 has a CVSS score of 6.1/10, rated MEDIUM. Review your exposure and patch according to your risk tolerance."}},{"@type":"Question","name":"Which packages are affected by GHSA-gpxg-fx2g-qxj2?","acceptedAnswer":{"@type":"Answer","text":"GHSA-gpxg-fx2g-qxj2 affects the following packages: kanidm (crates.io). Ecosystems affected: crates.io."}},{"@type":"Question","name":"How do I fix GHSA-gpxg-fx2g-qxj2?","acceptedAnswer":{"@type":"Answer","text":"Update kanidm to 1.9.3 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms GHSA-gpxg-fx2g-qxj2 is resolved across your whole dependency graph."}},{"@type":"Question","name":"How do I detect GHSA-gpxg-fx2g-qxj2 in my crates.io dependencies?","acceptedAnswer":{"@type":"Answer","text":"Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for kanidm, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version."}},{"@type":"Question","name":"How do I mitigate GHSA-gpxg-fx2g-qxj2 if there is no patch (or I can't update yet)?","acceptedAnswer":{"@type":"Answer","text":"If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands."}},{"@type":"Question","name":"How does O3 Security protect against GHSA-gpxg-fx2g-qxj2?","acceptedAnswer":{"@type":"Answer","text":"O3 Security's impact-aware SCA analyses which vulnerable code paths your application actually calls, so a match like GHSA-gpxg-fx2g-qxj2 can be triaged on real exposure rather than presence alone."}},{"@type":"Question","name":"Is GHSA-gpxg-fx2g-qxj2 actively exploited in the wild?","acceptedAnswer":{"@type":"Answer","text":"No public exploit code has been indexed for GHSA-gpxg-fx2g-qxj2 yet. This does not mean the vulnerability cannot be exploited — absence of public exploits does not imply safety. Apply the recommended fix and use O3 Security to monitor your exposure."}},{"@type":"Question","name":"When was GHSA-gpxg-fx2g-qxj2 published, and has it been updated?","acceptedAnswer":{"@type":"Answer","text":"GHSA-gpxg-fx2g-qxj2 was published on May 6, 2026 and was last updated on May 6, 2026. Advisory data evolves as severity scores, affected ranges, and exploit intelligence are revised — always check the latest version of the advisory before acting."}}]}
Your RSA-2048 keys break in 2030. Find every one of them before attackers do.
🦀
🦀 crates.io
Not in CISA KEV
MEDIUM severity

GHSA-gpxg-fx2g-qxj2 kanidm

MEDIUM

GHSA-gpxg-fx2g-qxj2 is a medium-severity (CVSS 6.1) vulnerability in kanidm. A fix is available for kanidm — see the affected versions and patch details below.

Kanidm: Stored HTML injection in "passkey-enrolment" partial via displayname → htmx-driven authenticated request forgery

Published
May 6, 2026
Updated
May 6, 2026
Affected
1 pkg
Patched
1 / 1
Exploits
None indexed
Exploitation data as of May 6, 2026 · OSV.dev, FIRST.org (EPSS)

Real-World Exposure

1 pkg affected
🦀kanidm

Real-time download stats are indexed for npm and PyPI packages. This vulnerability affects crates.io packages — download data is not available via public APIs for these ecosystems.

Description

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

Affected versions

All releases shipping the htmx credential-update views

Affected Packages

1 total 1 fixed
EcosystemPackageVulnerable rangeFix
🦀crates.iokanidmall versions1.9.3cargo update -p kanidm --precise 1.9.3

Detection & mitigation playbook

Open-source dependency
  1. Detect

    Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for kanidm, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.

  2. Fix

    Update kanidm to 1.9.3 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms GHSA-gpxg-fx2g-qxj2 is resolved across your whole dependency graph.

  3. Workarounds

    If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.

  4. How O3 protects you

    O3 Security's impact-aware SCA analyses which vulnerable code paths your application actually calls, so a match like GHSA-gpxg-fx2g-qxj2 can be triaged on real exposure rather than presence alone.

Tailored to GHSA-gpxg-fx2g-qxj2. Runtime protection reduces exposure until a permanent patch is applied and verified — it complements patching, it doesn't replace it.

Frequently Asked Questions

### 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 bea
O3 Security · Impact-Aware SCA

Is GHSA-gpxg-fx2g-qxj2 in your dependencies?

O3 Security finds GHSA-gpxg-fx2g-qxj2 across crates.io dependencies, including transitive ones, and its impact-aware SCA ranks findings by whether your code actually calls the vulnerable path.

GHSA-gpxg-fx2g-qxj2: kanidm (Medium 6.1) | O3 Security