CVE-2026-59728
mediumpriority · track · 0EPSS 0.003 · 25 %ileEUUSEPSS · scored 2026-10-27
Astro is a web framework for content-driven websites. In versions 1.0.0 through 4.0.18, the source.title and enclosure.type item fields in packages/astro-rss/src/index.ts are interpolated directly into XML template strings without XML-character escaping before being parsed by fast-xml-parser. Both fields are validated only as z.string(), placing no restriction on XML special characters. An attacker who controls these values can inject arbitrary XML into the generated RSS feed: a value containing " can break out of an attribute (as with enclosure.type), and a value containing </source> can close an element early and inject additional nodes (as with source.title). This corrupts feed structure, injects false metadata (for example, a fake <link> pointing to a malicious URL), and can cause feed readers to misparse or display attacker-controlled content. In SSR mode (output: 'server'), the poisoned feed is served on every request to all subscribers. This issue has been fixed in version 4.0.19.
cvss
Technical severity, 0–10. One row per scoring source.
base score 0–10 · higher = more severe · hover a vector to decode
ssvc
A stakeholder decision — act, attend, or track — from exploitation and impact.
weaknesses
The CWE weakness classes this flaw belongs to.
affected products (2)
Products and version ranges known to be affected.
advisories (1)
Vendor and ecosystem advisories describing this.
- GHSA-8j5q-mfj2-5q9q@astrojs/rss: XML Injection via Unescaped RSS Feed Fields2026-07-20ghsa · osvUS
## Summary In `@astrojs/rss`, the `source.title` and `enclosure.type` item fields are interpolated directly into XML template strings without XML-character escaping before being parsed by `fast-xml-parser`. An attacker who controls these field values can inject arbitrary XML elements into the generated RSS feed. ## Details Two fields in `packages/astro-rss/src/index.ts` are affected: ### `source.title` ```typescript item.source = parser.parse( `<source url="${result.source.url}">${result.source.title}</source>`, ).source; ``` `source.title` is validated only as `z.string()`, with no restriction on XML special characters. A value containing `</source>` followed by arbitrary XML is parsed as real XML elements, merging injected nodes into the RSS item. ### `enclosure.type` ```typescript item.enclosure = parser.parse( `<enclosure url="${enclosureURL}" length="${result.enclosure.length}" type="${result.enclosure.type}"/>`, ).enclosure; ``` `enclosure.type` is also `z.string()` and is interpolated into an XML attribute without escaping. A value containing `"` followed by additional XML can break out of the attribute and inject extra elements. ## Proof of Concept `source.title` injection: ```javascript source: { url: 'https://legit.example.com', title: '</source><item><title>INJECTED</title><link>https://evil.com</link></item><source>', } // Result: RSS feed contains an injected <item> element with an evil.com link ``` `enclosure.type` injection: ```javascript enclosure: { url: 'https://example.com/a.mp3', length: 0, type: 'audio/mpeg" /><link>https://evil.example.com</link><enclosure fake="', } // Result: RSS feed contains an injected <link> element ``` Both injections were confirmed with `fast-xml-parser`: the injected `"link": "https://evil.com"` appears in the parsed output. ## Impact An attacker who can control `source.title` or `enclosure.type` values (e.g., via a CMS, database, or user-submitted content that populates `RSSFeedItem`) can inject arbitrary XML into the generated RSS feed. This corrupts feed structure, injects false metadata (e.g., a fake `<link>` pointing to a malicious URL), and can cause feed readers to misparse or display attacker-controlled content. In SSR mode (`output: 'server'`), the poisoned feed is served on every request to all subscribers. ## Patches Fixed in `@astrojs/rss@4.0.19`.
also known as (3)
Other names and identifiers for this entity.
sources
Which sources assert this record, and when.
references (12)
External citations — patches, advisories, analysis.
- https://github.com/withastro/astro/commit/fbcfa039dfe3d700b239f595a6c55ee35e45bd06cnnvd
- https://github.com/withastro/astro/pull/17209cnnvd
- https://github.com/withastro/astro/releases/tag/@astrojs/rss@4.0.19cnnvd
- https://github.com/withastro/astro/security/advisories/GHSA-8j5q-mfj2-5q9qcnnvd
- https://github.com/withastro/astro/commit/fbcfa039dfe3d700b239f595a6c55ee35e45bd06enisa_euvd
- https://github.com/withastro/astro/pull/17209enisa_euvd
- https://github.com/withastro/astro/releases/tag/@astrojs/rss@4.0.19enisa_euvd
- https://github.com/withastro/astro/security/advisories/GHSA-8j5q-mfj2-5q9qenisa_euvd
Attackers weaponise vulnerabilities like this against internet-exposed services. See what is exposed on your perimeter with a free passive scan.
Free scan