CVE-2026-54889 (GCVE-0-2026-54889)
Vulnerability from cvelistv5 – Published: 2026-06-29 19:10 – Updated: 2026-06-30 04:38
VLAI
EPSS
VEX
Title
Unsanitized URL schemes in MDEx Quill Delta output allow javascript: injection (XSS)
Summary
Improper Neutralization of Input During Web Page Generation (XSS) vulnerability in leandrocp mdex allows cross-site scripting via unsanitized URL schemes in Quill Delta output.
'Elixir.MDEx':to_delta/2 converts Markdown into a Quill Delta. 'Elixir.MDEx.DeltaConverter':default_convert_node/3 in lib/mdex/delta_converter.ex copies the URL of a link, wikilink, or image node directly from the parsed Markdown into the Delta "link" or "image" attribute without applying a scheme allowlist or any normalization.
An attacker who controls the Markdown text can supply a javascript: URL (for example [click](javascript:alert(document.cookie))) that survives verbatim into the Delta attribute. When the Delta is rendered to HTML by a downstream renderer (such as quill-delta-to-html or the Quill client), the attribute becomes an <a href> or <img src>, and the javascript: scheme executes in the browser of anyone who views the rendered content. The link and wikilink cases are the strongest vectors because javascript: in an href executes on click; the image case is lower impact because javascript: in <img src> generally does not execute in modern browsers.
This issue affects mdex: from 0.8.3 before 0.13.2.
Severity
SSVC
Exploitation: poc
Automatable: no
Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-06-29 20:48 UTC
CWE
- CWE-79 - Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
Assigner
References
4 references
| URL | Tags |
|---|---|
| https://github.com/leandrocp/mdex/security/adviso… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-54889.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-54889 | related |
| https://github.com/leandrocp/mdex/commit/2817147f… | patch |
Impacted products
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-54889",
"options": [
{
"Exploitation": "poc"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-06-29T20:48:34.044130Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-06-29T20:48:52.206Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"references": [
{
"tags": [
"exploit"
],
"url": "https://github.com/leandrocp/mdex/security/advisories/GHSA-4383-7xfp-gpph"
}
],
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:leandrocp:mdex:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MDEx\u0027",
"\u0027Elixir.MDEx.DeltaConverter\u0027"
],
"packageName": "mdex",
"packageURL": "pkg:hex/mdex",
"product": "mdex",
"programFiles": [
"lib/mdex.ex",
"lib/mdex/delta_converter.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MDEx\u0027:to_delta/2"
},
{
"name": "\u0027Elixir.MDEx.DeltaConverter\u0027:convert/2"
},
{
"name": "\u0027Elixir.MDEx.DeltaConverter\u0027:default_convert_node/3"
}
],
"repo": "https://github.com/leandrocp/mdex",
"vendor": "leandrocp",
"versions": [
{
"lessThan": "0.13.2",
"status": "affected",
"version": "0.8.3",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:leandrocp:mdex:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MDEx\u0027",
"\u0027Elixir.MDEx.DeltaConverter\u0027"
],
"packageName": "leandrocp/mdex",
"packageURL": "pkg:github/leandrocp/mdex",
"product": "mdex",
"programFiles": [
"lib/mdex.ex",
"lib/mdex/delta_converter.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MDEx\u0027:to_delta/2"
},
{
"name": "\u0027Elixir.MDEx.DeltaConverter\u0027:convert/2"
},
{
"name": "\u0027Elixir.MDEx.DeltaConverter\u0027:default_convert_node/3"
}
],
"repo": "https://github.com/leandrocp/mdex",
"vendor": "leandrocp",
"versions": [
{
"lessThan": "2817147f5b87ce7186aa604c9ee72499485b8f2f",
"status": "affected",
"version": "9852db2456fdc9d856eb636603a7f608e22e3793",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eThe application must pass untrusted Markdown to \u003ctt\u003e\u0027Elixir.MDEx\u0027:to_delta/2\u003c/tt\u003e and then render the resulting Quill Delta to HTML with a renderer that maps the \u003ctt\u003e\"link\"\u003c/tt\u003e and \u003ctt\u003e\"image\"\u003c/tt\u003e attributes to \u003ctt\u003ehref\u003c/tt\u003e and \u003ctt\u003esrc\u003c/tt\u003e without applying its own URL scheme sanitization (for example \u003ctt\u003equill-delta-to-html\u003c/tt\u003e or the Quill client).\u003c/p\u003e"
}
],
"value": "The application must pass untrusted Markdown to \u0027Elixir.MDEx\u0027:to_delta/2 and then render the resulting Quill Delta to HTML with a renderer that maps the \"link\" and \"image\" attributes to href and src without applying its own URL scheme sanitization (for example quill-delta-to-html or the Quill client)."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:leandrocp:mdex:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.13.2",
"versionStartIncluding": "0.8.3",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
],
"operator": "AND"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "Peter Ullrich"
},
{
"lang": "en",
"type": "remediation developer",
"value": "Leandro Pereira"
},
{
"lang": "en",
"type": "analyst",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "Improper Neutralization of Input During Web Page Generation (XSS) vulnerability in leandrocp mdex allows cross-site scripting via unsanitized URL schemes in Quill Delta output.\u003cp\u003e\u003ctt\u003e\u0027Elixir.MDEx\u0027:to_delta/2\u003c/tt\u003e converts Markdown into a Quill Delta. \u003ctt\u003e\u0027Elixir.MDEx.DeltaConverter\u0027:default_convert_node/3\u003c/tt\u003e in \u003ctt\u003elib/mdex/delta_converter.ex\u003c/tt\u003e copies the URL of a link, wikilink, or image node directly from the parsed Markdown into the Delta \u003ctt\u003e\"link\"\u003c/tt\u003e or \u003ctt\u003e\"image\"\u003c/tt\u003e attribute without applying a scheme allowlist or any normalization.\u003c/p\u003e\u003cp\u003eAn attacker who controls the Markdown text can supply a \u003ctt\u003ejavascript:\u003c/tt\u003e URL (for example \u003ctt\u003e[click](javascript:alert(document.cookie))\u003c/tt\u003e) that survives verbatim into the Delta attribute. When the Delta is rendered to HTML by a downstream renderer (such as \u003ctt\u003equill-delta-to-html\u003c/tt\u003e or the Quill client), the attribute becomes an \u003ctt\u003e\u0026lt;a href\u0026gt;\u003c/tt\u003e or \u003ctt\u003e\u0026lt;img src\u0026gt;\u003c/tt\u003e, and the \u003ctt\u003ejavascript:\u003c/tt\u003e scheme executes in the browser of anyone who views the rendered content. The link and wikilink cases are the strongest vectors because \u003ctt\u003ejavascript:\u003c/tt\u003e in an \u003ctt\u003ehref\u003c/tt\u003e executes on click; the image case is lower impact because \u003ctt\u003ejavascript:\u003c/tt\u003e in \u003ctt\u003e\u0026lt;img src\u0026gt;\u003c/tt\u003e generally does not execute in modern browsers.\u003c/p\u003e\u003cp\u003eThis issue affects mdex: from 0.8.3 before 0.13.2.\u003c/p\u003e"
}
],
"value": "Improper Neutralization of Input During Web Page Generation (XSS) vulnerability in leandrocp mdex allows cross-site scripting via unsanitized URL schemes in Quill Delta output.\n\n\u0027Elixir.MDEx\u0027:to_delta/2 converts Markdown into a Quill Delta. \u0027Elixir.MDEx.DeltaConverter\u0027:default_convert_node/3 in lib/mdex/delta_converter.ex copies the URL of a link, wikilink, or image node directly from the parsed Markdown into the Delta \"link\" or \"image\" attribute without applying a scheme allowlist or any normalization.\n\nAn attacker who controls the Markdown text can supply a javascript: URL (for example [click](javascript:alert(document.cookie))) that survives verbatim into the Delta attribute. When the Delta is rendered to HTML by a downstream renderer (such as quill-delta-to-html or the Quill client), the attribute becomes an \u003ca href\u003e or \u003cimg src\u003e, and the javascript: scheme executes in the browser of anyone who views the rendered content. The link and wikilink cases are the strongest vectors because javascript: in an href executes on click; the image case is lower impact because javascript: in \u003cimg src\u003e generally does not execute in modern browsers.\n\nThis issue affects mdex: from 0.8.3 before 0.13.2."
}
],
"impacts": [
{
"capecId": "CAPEC-244",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-244 XSS Targeting URI Placeholders"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"attackComplexity": "LOW",
"attackRequirements": "NONE",
"attackVector": "NETWORK",
"baseScore": 5.1,
"baseSeverity": "MEDIUM",
"privilegesRequired": "NONE",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "LOW",
"subIntegrityImpact": "LOW",
"userInteraction": "ACTIVE",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "LOW",
"vulnIntegrityImpact": "LOW"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-79",
"description": "CWE-79 Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-06-30T04:38:42.158Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/leandrocp/mdex/security/advisories/GHSA-4383-7xfp-gpph"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-54889.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-54889"
},
{
"tags": [
"patch"
],
"url": "https://github.com/leandrocp/mdex/commit/2817147f5b87ce7186aa604c9ee72499485b8f2f"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "Unsanitized URL schemes in MDEx Quill Delta output allow javascript: injection (XSS)",
"workarounds": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eSanitize the Quill Delta produced by \u003ctt\u003e\u0027Elixir.MDEx\u0027:to_delta/2\u003c/tt\u003e before rendering it: drop or blank any \u003ctt\u003e\"link\"\u003c/tt\u003e or \u003ctt\u003e\"image\"\u003c/tt\u003e value whose URL scheme is not in a safe allowlist (\u003ctt\u003ehttp\u003c/tt\u003e, \u003ctt\u003ehttps\u003c/tt\u003e, \u003ctt\u003emailto\u003c/tt\u003e, \u003ctt\u003etel\u003c/tt\u003e).\u003c/p\u003e"
}
],
"value": "Sanitize the Quill Delta produced by \u0027Elixir.MDEx\u0027:to_delta/2 before rendering it: drop or blank any \"link\" or \"image\" value whose URL scheme is not in a safe allowlist (http, https, mailto, tel)."
}
],
"x_generator": {
"engine": "cvelib 1.8.0"
}
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-54889",
"datePublished": "2026-06-29T19:10:49.841Z",
"dateReserved": "2026-06-16T10:47:13.915Z",
"dateUpdated": "2026-06-30T04:38:42.158Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2",
"vulnerability-lookup:meta": {
"epss": {
"cve": "CVE-2026-54889",
"date": "2026-11-06",
"epss": "0.00393",
"percentile": "0.33698"
},
"nvd": {
"cve": {
"affected": [
{
"affectedData": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:leandrocp:mdex:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MDEx\u0027",
"\u0027Elixir.MDEx.DeltaConverter\u0027"
],
"packageName": "mdex",
"packageURL": "pkg:hex/mdex",
"product": "mdex",
"programFiles": [
"lib/mdex.ex",
"lib/mdex/delta_converter.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MDEx\u0027:to_delta/2"
},
{
"name": "\u0027Elixir.MDEx.DeltaConverter\u0027:convert/2"
},
{
"name": "\u0027Elixir.MDEx.DeltaConverter\u0027:default_convert_node/3"
}
],
"repo": "https://github.com/leandrocp/mdex",
"vendor": "leandrocp",
"versions": [
{
"lessThan": "0.13.2",
"status": "affected",
"version": "0.8.3",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:leandrocp:mdex:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MDEx\u0027",
"\u0027Elixir.MDEx.DeltaConverter\u0027"
],
"packageName": "leandrocp/mdex",
"packageURL": "pkg:github/leandrocp/mdex",
"product": "mdex",
"programFiles": [
"lib/mdex.ex",
"lib/mdex/delta_converter.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MDEx\u0027:to_delta/2"
},
{
"name": "\u0027Elixir.MDEx.DeltaConverter\u0027:convert/2"
},
{
"name": "\u0027Elixir.MDEx.DeltaConverter\u0027:default_convert_node/3"
}
],
"repo": "https://github.com/leandrocp/mdex",
"vendor": "leandrocp",
"versions": [
{
"lessThan": "2817147f5b87ce7186aa604c9ee72499485b8f2f",
"status": "affected",
"version": "9852db2456fdc9d856eb636603a7f608e22e3793",
"versionType": "git"
}
]
}
],
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
}
],
"cveTags": [],
"descriptions": [
{
"lang": "en",
"value": "Improper Neutralization of Input During Web Page Generation (XSS) vulnerability in leandrocp mdex allows cross-site scripting via unsanitized URL schemes in Quill Delta output.\n\n\u0027Elixir.MDEx\u0027:to_delta/2 converts Markdown into a Quill Delta. \u0027Elixir.MDEx.DeltaConverter\u0027:default_convert_node/3 in lib/mdex/delta_converter.ex copies the URL of a link, wikilink, or image node directly from the parsed Markdown into the Delta \"link\" or \"image\" attribute without applying a scheme allowlist or any normalization.\n\nAn attacker who controls the Markdown text can supply a javascript: URL (for example [click](javascript:alert(document.cookie))) that survives verbatim into the Delta attribute. When the Delta is rendered to HTML by a downstream renderer (such as quill-delta-to-html or the Quill client), the attribute becomes an \u003ca href\u003e or \u003cimg src\u003e, and the javascript: scheme executes in the browser of anyone who views the rendered content. The link and wikilink cases are the strongest vectors because javascript: in an href executes on click; the image case is lower impact because javascript: in \u003cimg src\u003e generally does not execute in modern browsers.\n\nThis issue affects mdex: from 0.8.3 before 0.13.2."
},
{
"lang": "es",
"value": "Vulnerabilidad de Neutralizaci\u00f3n Incorrecta de Entrada Durante la Generaci\u00f3n de P\u00e1ginas Web (XSS) en leandrocp mdex permite cross-site scripting a trav\u00e9s de esquemas de URL no saneados en la salida de Quill Delta.\n\n\u2019Elixir.MDEx\u2019:to_delta/2 convierte Markdown en un Quill Delta. \u2019Elixir.MDEx.DeltaConverter\u2019:default_convert_node/3 en lib/mdex/delta_converter.ex copia la URL de un enlace, wikienlace o nodo de imagen directamente desde el Markdown analizado en el atributo Delta \u201clink\u201d o \u201cimage\u201d sin aplicar una lista blanca de esquemas o ninguna normalizaci\u00f3n.\n\nUn atacante que controla el texto Markdown puede proporcionar una URL javascript_disabled: (por ejemplo [click](javascript_disabled: alert(document.cookie))) que sobrevive textualmente en el atributo Delta. Cuando el Delta se renderiza a HTML por un renderizador descendente (como quill-delta-to-html o el cliente Quill), el atributo se convierte en un \u003ca href\u003e o \u003cimg src\u003e, y el esquema javascript_disabled: se ejecuta en el navegador de cualquiera que vea el contenido renderizado. Los casos de enlace y wikienlace son los vectores m\u00e1s fuertes porque javascript_disabled: en un href se ejecuta al hacer clic; el caso de la imagen tiene un impacto menor porque javascript_disabled: en \u003cimg src\u003e generalmente no se ejecuta en navegadores modernos.\n\nEste problema afecta a mdex: desde 0.8.3 antes de 0.13.2."
}
],
"id": "CVE-2026-54889",
"lastModified": "2026-10-25T21:10:00.770",
"metrics": {
"cvssMetricV40": [
{
"cvssData": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "NONE",
"attackVector": "NETWORK",
"availabilityRequirement": "NOT_DEFINED",
"baseScore": 5.1,
"baseSeverity": "MEDIUM",
"confidentialityRequirement": "NOT_DEFINED",
"exploitMaturity": "NOT_DEFINED",
"integrityRequirement": "NOT_DEFINED",
"modifiedAttackComplexity": "NOT_DEFINED",
"modifiedAttackRequirements": "NOT_DEFINED",
"modifiedAttackVector": "NOT_DEFINED",
"modifiedPrivilegesRequired": "NOT_DEFINED",
"modifiedSubAvailabilityImpact": "NOT_DEFINED",
"modifiedSubConfidentialityImpact": "NOT_DEFINED",
"modifiedSubIntegrityImpact": "NOT_DEFINED",
"modifiedUserInteraction": "NOT_DEFINED",
"modifiedVulnAvailabilityImpact": "NOT_DEFINED",
"modifiedVulnConfidentialityImpact": "NOT_DEFINED",
"modifiedVulnIntegrityImpact": "NOT_DEFINED",
"privilegesRequired": "NONE",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "LOW",
"subIntegrityImpact": "LOW",
"userInteraction": "ACTIVE",
"valueDensity": "NOT_DEFINED",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "LOW",
"vulnIntegrityImpact": "LOW",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"type": "Secondary"
}
],
"ssvcV203": [
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"ssvcData": {
"id": "CVE-2026-54889",
"options": [
{
"exploitation": "poc"
},
{
"automatable": "no"
},
{
"technicalImpact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-06-29T20:48:34.044130Z",
"version": "2.0.3"
}
}
]
},
"published": "2026-06-29T20:17:39.407",
"references": [
{
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"url": "https://cna.erlef.org/cves/CVE-2026-54889.html"
},
{
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"url": "https://github.com/leandrocp/mdex/commit/2817147f5b87ce7186aa604c9ee72499485b8f2f"
},
{
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"url": "https://github.com/leandrocp/mdex/security/advisories/GHSA-4383-7xfp-gpph"
},
{
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-54889"
},
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"url": "https://github.com/leandrocp/mdex/security/advisories/GHSA-4383-7xfp-gpph"
}
],
"sourceIdentifier": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"vulnStatus": "Deferred",
"weaknesses": [
{
"description": [
{
"lang": "en",
"value": "CWE-79"
}
],
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"type": "Secondary"
}
]
}
},
"vulnrichment": {
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-54889",
"options": [
{
"Exploitation": "poc"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-06-29T20:48:34.044130Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-06-29T20:48:47.453Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"references": [
{
"tags": [
"exploit"
],
"url": "https://github.com/leandrocp/mdex/security/advisories/GHSA-4383-7xfp-gpph"
}
],
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:leandrocp:mdex:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MDEx\u0027",
"\u0027Elixir.MDEx.DeltaConverter\u0027"
],
"packageName": "mdex",
"packageURL": "pkg:hex/mdex",
"product": "mdex",
"programFiles": [
"lib/mdex.ex",
"lib/mdex/delta_converter.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MDEx\u0027:to_delta/2"
},
{
"name": "\u0027Elixir.MDEx.DeltaConverter\u0027:convert/2"
},
{
"name": "\u0027Elixir.MDEx.DeltaConverter\u0027:default_convert_node/3"
}
],
"repo": "https://github.com/leandrocp/mdex",
"vendor": "leandrocp",
"versions": [
{
"lessThan": "0.13.2",
"status": "affected",
"version": "0.8.3",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:leandrocp:mdex:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MDEx\u0027",
"\u0027Elixir.MDEx.DeltaConverter\u0027"
],
"packageName": "leandrocp/mdex",
"packageURL": "pkg:github/leandrocp/mdex",
"product": "mdex",
"programFiles": [
"lib/mdex.ex",
"lib/mdex/delta_converter.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MDEx\u0027:to_delta/2"
},
{
"name": "\u0027Elixir.MDEx.DeltaConverter\u0027:convert/2"
},
{
"name": "\u0027Elixir.MDEx.DeltaConverter\u0027:default_convert_node/3"
}
],
"repo": "https://github.com/leandrocp/mdex",
"vendor": "leandrocp",
"versions": [
{
"lessThan": "2817147f5b87ce7186aa604c9ee72499485b8f2f",
"status": "affected",
"version": "9852db2456fdc9d856eb636603a7f608e22e3793",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eThe application must pass untrusted Markdown to \u003ctt\u003e\u0027Elixir.MDEx\u0027:to_delta/2\u003c/tt\u003e and then render the resulting Quill Delta to HTML with a renderer that maps the \u003ctt\u003e\"link\"\u003c/tt\u003e and \u003ctt\u003e\"image\"\u003c/tt\u003e attributes to \u003ctt\u003ehref\u003c/tt\u003e and \u003ctt\u003esrc\u003c/tt\u003e without applying its own URL scheme sanitization (for example \u003ctt\u003equill-delta-to-html\u003c/tt\u003e or the Quill client).\u003c/p\u003e"
}
],
"value": "The application must pass untrusted Markdown to \u0027Elixir.MDEx\u0027:to_delta/2 and then render the resulting Quill Delta to HTML with a renderer that maps the \"link\" and \"image\" attributes to href and src without applying its own URL scheme sanitization (for example quill-delta-to-html or the Quill client)."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:leandrocp:mdex:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.13.2",
"versionStartIncluding": "0.8.3",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
],
"operator": "AND"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "Peter Ullrich"
},
{
"lang": "en",
"type": "remediation developer",
"value": "Leandro Pereira"
},
{
"lang": "en",
"type": "analyst",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "Improper Neutralization of Input During Web Page Generation (XSS) vulnerability in leandrocp mdex allows cross-site scripting via unsanitized URL schemes in Quill Delta output.\u003cp\u003e\u003ctt\u003e\u0027Elixir.MDEx\u0027:to_delta/2\u003c/tt\u003e converts Markdown into a Quill Delta. \u003ctt\u003e\u0027Elixir.MDEx.DeltaConverter\u0027:default_convert_node/3\u003c/tt\u003e in \u003ctt\u003elib/mdex/delta_converter.ex\u003c/tt\u003e copies the URL of a link, wikilink, or image node directly from the parsed Markdown into the Delta \u003ctt\u003e\"link\"\u003c/tt\u003e or \u003ctt\u003e\"image\"\u003c/tt\u003e attribute without applying a scheme allowlist or any normalization.\u003c/p\u003e\u003cp\u003eAn attacker who controls the Markdown text can supply a \u003ctt\u003ejavascript:\u003c/tt\u003e URL (for example \u003ctt\u003e[click](javascript:alert(document.cookie))\u003c/tt\u003e) that survives verbatim into the Delta attribute. When the Delta is rendered to HTML by a downstream renderer (such as \u003ctt\u003equill-delta-to-html\u003c/tt\u003e or the Quill client), the attribute becomes an \u003ctt\u003e\u0026lt;a href\u0026gt;\u003c/tt\u003e or \u003ctt\u003e\u0026lt;img src\u0026gt;\u003c/tt\u003e, and the \u003ctt\u003ejavascript:\u003c/tt\u003e scheme executes in the browser of anyone who views the rendered content. The link and wikilink cases are the strongest vectors because \u003ctt\u003ejavascript:\u003c/tt\u003e in an \u003ctt\u003ehref\u003c/tt\u003e executes on click; the image case is lower impact because \u003ctt\u003ejavascript:\u003c/tt\u003e in \u003ctt\u003e\u0026lt;img src\u0026gt;\u003c/tt\u003e generally does not execute in modern browsers.\u003c/p\u003e\u003cp\u003eThis issue affects mdex: from 0.8.3 before 0.13.2.\u003c/p\u003e"
}
],
"value": "Improper Neutralization of Input During Web Page Generation (XSS) vulnerability in leandrocp mdex allows cross-site scripting via unsanitized URL schemes in Quill Delta output.\n\n\u0027Elixir.MDEx\u0027:to_delta/2 converts Markdown into a Quill Delta. \u0027Elixir.MDEx.DeltaConverter\u0027:default_convert_node/3 in lib/mdex/delta_converter.ex copies the URL of a link, wikilink, or image node directly from the parsed Markdown into the Delta \"link\" or \"image\" attribute without applying a scheme allowlist or any normalization.\n\nAn attacker who controls the Markdown text can supply a javascript: URL (for example [click](javascript:alert(document.cookie))) that survives verbatim into the Delta attribute. When the Delta is rendered to HTML by a downstream renderer (such as quill-delta-to-html or the Quill client), the attribute becomes an \u003ca href\u003e or \u003cimg src\u003e, and the javascript: scheme executes in the browser of anyone who views the rendered content. The link and wikilink cases are the strongest vectors because javascript: in an href executes on click; the image case is lower impact because javascript: in \u003cimg src\u003e generally does not execute in modern browsers.\n\nThis issue affects mdex: from 0.8.3 before 0.13.2."
}
],
"impacts": [
{
"capecId": "CAPEC-244",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-244 XSS Targeting URI Placeholders"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"attackComplexity": "LOW",
"attackRequirements": "NONE",
"attackVector": "NETWORK",
"baseScore": 5.1,
"baseSeverity": "MEDIUM",
"privilegesRequired": "NONE",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "LOW",
"subIntegrityImpact": "LOW",
"userInteraction": "ACTIVE",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "LOW",
"vulnIntegrityImpact": "LOW"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-79",
"description": "CWE-79 Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-06-30T04:38:42.158Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/leandrocp/mdex/security/advisories/GHSA-4383-7xfp-gpph"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-54889.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-54889"
},
{
"tags": [
"patch"
],
"url": "https://github.com/leandrocp/mdex/commit/2817147f5b87ce7186aa604c9ee72499485b8f2f"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "Unsanitized URL schemes in MDEx Quill Delta output allow javascript: injection (XSS)",
"workarounds": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eSanitize the Quill Delta produced by \u003ctt\u003e\u0027Elixir.MDEx\u0027:to_delta/2\u003c/tt\u003e before rendering it: drop or blank any \u003ctt\u003e\"link\"\u003c/tt\u003e or \u003ctt\u003e\"image\"\u003c/tt\u003e value whose URL scheme is not in a safe allowlist (\u003ctt\u003ehttp\u003c/tt\u003e, \u003ctt\u003ehttps\u003c/tt\u003e, \u003ctt\u003emailto\u003c/tt\u003e, \u003ctt\u003etel\u003c/tt\u003e).\u003c/p\u003e"
}
],
"value": "Sanitize the Quill Delta produced by \u0027Elixir.MDEx\u0027:to_delta/2 before rendering it: drop or blank any \"link\" or \"image\" value whose URL scheme is not in a safe allowlist (http, https, mailto, tel)."
}
],
"x_generator": {
"engine": "cvelib 1.8.0"
}
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-54889",
"datePublished": "2026-06-29T19:10:49.841Z",
"dateReserved": "2026-06-16T10:47:13.915Z",
"dateUpdated": "2026-06-30T04:38:42.158Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
}
}
Loading…
Loading…
Drag nodes to arrange them. Double-click a related vulnerability to open it, or a source to visit its link. The Physics button on the left tunes the layout and the simulation; the legend at the bottom left hides or shows nodes by kind and by sighting type.
Experimental. This forecast is provided for visualization only and may change without notice. Do not use it for operational decisions.
Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Vulnerability timeline
Sightings and recorded dates, grouped by day · UTC
Loading timeline…
Loading…
Loading…
The MITRE ATT&CK techniques below are AI-generated suggestions, inferred from the description of the
vulnerability by the CIRCL/vulnerability-attack-technique-classification-roberta-base
model, served locally by ML-Gateway.
They have not been verified by an analyst and are provided for guidance only.
The approach is described in our paper Mapping CVEs to MITRE ATT&CK Techniques: A Curated Gold-Set Classifier and the Limits of LLM-Assisted Label Expansion.
Browse all ATT&CK techniques and the vulnerabilities related to each.
The approach is described in our paper Mapping CVEs to MITRE ATT&CK Techniques: A Curated Gold-Set Classifier and the Limits of LLM-Assisted Label Expansion.
Browse all ATT&CK techniques and the vulnerabilities related to each.
Loading…
Related by attack behaviour
Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.