CVE-2026-59728
@astrojs/rss: XML Injection via Unescaped RSS Feed Fields
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.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- Required
What an attacker can affect
- Confidentiality
- None
- Integrity
- Low
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
4.3
@astrojs/rss: XML Injection via Unescaped RSS Feed Fields
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.
- Record
CVE-2026-59728- CVSS 3.1
- 4.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N - Weakness
- CWE-91
- Updated
- 2026-11-02
EUVDEUVD-2026-49584
4.3
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.
- Record
EUVD-2026-49584- CVSS 3.1
- 4.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-8j5q-mfj2-5q9q
4.3
@astrojs/rss: XML Injection via Unescaped RSS Feed Fields
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
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
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:
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:
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/[email protected].
- Record
GHSA-8j5q-mfj2-5q9q- CVSS 3.1
- 4.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N - Weakness
- CWE-91
- Updated
- 2026-11-02
NVD
4.3
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.
- Record
CVE-2026-59728- CVSS 3.1
- 4.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N - Weakness
- CWE-91
- Updated
- 2026-11-02
OSV
4.3
@astrojs/rss: XML Injection via Unescaped RSS Feed Fields
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.
- Record
CVE-2026-59728- CVSS 3.1
- 4.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N - Weakness
- CWE-91
- Updated
- 2026-11-02
OSVGHSA-8j5q-mfj2-5q9q
4.3
@astrojs/rss: XML Injection via Unescaped RSS Feed Fields
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
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
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:
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:
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/[email protected].
- Record
GHSA-8j5q-mfj2-5q9q- CVSS 3.1
- 4.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N - Weakness
- CWE-91
- Updated
- 2026-11-02
Show 11 moreShow less
OSVCLSA-2026-1784596299 No score
TuxCare security update for @astrojs/rss (1 CVE)
TuxCare rebuilt @astrojs/rss to address 1 CVE. Fixed in 3.6.5-tuxcare.3.
- Record
CLSA-2026-1784596299- Updated
- 2026-11-02
OSVCLSA-2026-1784943236 No score
TuxCare security update for @astrojs/rss (1 CVE)
TuxCare rebuilt @astrojs/rss to address 1 CVE. Fixed in 2.10.15-tuxcare.5.
- Record
CLSA-2026-1784943236- Updated
- 2026-11-02
OSVCLSA-2026-1792161555 No score
TuxCare security update for @astrojs/internal-helpers (1 CVE)
TuxCare rebuilt @astrojs/internal-helpers to address 1 CVE. Fixed in 3.6.5-tuxcare.3.
- Record
CLSA-2026-1792161555- Updated
- 2026-11-02
OSVCLSA-2026-1792161559 No score
TuxCare security update for @astrojs/internal-helpers (1 CVE)
TuxCare rebuilt @astrojs/internal-helpers to address 1 CVE. Fixed in 2.10.15-tuxcare.5.
- Record
CLSA-2026-1792161559- Updated
- 2026-11-02
OSVCLSA-2026-1792161694 No score
TuxCare security update for @astrojs/prism (1 CVE)
TuxCare rebuilt @astrojs/prism to address 1 CVE. Fixed in 3.6.5-tuxcare.3.
- Record
CLSA-2026-1792161694- Updated
- 2026-11-02
OSVCLSA-2026-1792161701 No score
TuxCare security update for @astrojs/prism (1 CVE)
TuxCare rebuilt @astrojs/prism to address 1 CVE. Fixed in 2.10.15-tuxcare.5.
- Record
CLSA-2026-1792161701- Updated
- 2026-11-02
OSVCLSA-2026-1792161786 No score
TuxCare security update for @astrojs/underscore-redirects (1 CVE)
TuxCare rebuilt @astrojs/underscore-redirects to address 1 CVE. Fixed in 3.6.5-tuxcare.3.
- Record
CLSA-2026-1792161786- Updated
- 2026-11-02
OSVCLSA-2026-1792161789 No score
TuxCare security update for @astrojs/underscore-redirects (1 CVE)
TuxCare rebuilt @astrojs/underscore-redirects to address 1 CVE. Fixed in 2.10.15-tuxcare.5.
- Record
CLSA-2026-1792161789- Updated
- 2026-11-02
OSVCLSA-2026-1792161855 No score
TuxCare security update for @astrojs/upgrade (1 CVE)
TuxCare rebuilt @astrojs/upgrade to address 1 CVE. Fixed in 3.6.5-tuxcare.3.
- Record
CLSA-2026-1792161855- Updated
- 2026-11-02
OSVCLSA-2026-1793093746 No score
TuxCare security update for @astrojs/rss (1 CVE)
TuxCare rebuilt @astrojs/rss to address 1 CVE. Fixed in 4.0.1-tuxcare.1.
- Record
CLSA-2026-1793093746- Updated
- 2026-11-02
OSVCLSA-2026-1793093842 No score
TuxCare security update for @astrojs/rss (1 CVE)
TuxCare rebuilt @astrojs/rss to address 1 CVE. Fixed in 4.0.2-tuxcare.1.
- Record
CLSA-2026-1793093842- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
@astrojs/rssnpm |
1.0.0 up to 4.0.19 | 4.0.19 |
@astrojs/rssTuxCare:npm |
3.6.5-tuxcare.0 up to 3.6.5-tuxcare.3, plus listed versions 3.6.53.6.5-tuxcare.13.6.5-tuxcare.2 |
3.6.5-tuxcare.3 |
@astrojs/rssTuxCare:npm |
2.10.15-tuxcare.0 up to 2.10.15-tuxcare.5, plus listed versions 2.10.152.10.15-tuxcare.12.10.15-tuxcare.22.10.15-tuxcare.32.10.15-tuxcare.4 |
2.10.15-tuxcare.5 |
@astrojs/internal-helpersTuxCare:npm |
3.6.5-tuxcare.0 up to 3.6.5-tuxcare.3, plus listed versions 3.6.53.6.5-tuxcare.13.6.5-tuxcare.2 |
3.6.5-tuxcare.3 |
@astrojs/internal-helpersTuxCare:npm |
2.10.15-tuxcare.0 up to 2.10.15-tuxcare.5, plus listed versions 2.10.152.10.15-tuxcare.12.10.15-tuxcare.22.10.15-tuxcare.32.10.15-tuxcare.4 |
2.10.15-tuxcare.5 |
@astrojs/prismTuxCare:npm |
3.6.5-tuxcare.0 up to 3.6.5-tuxcare.3, plus listed versions 3.6.53.6.5-tuxcare.13.6.5-tuxcare.2 |
3.6.5-tuxcare.3 |
@astrojs/prismTuxCare:npm |
2.10.15-tuxcare.0 up to 2.10.15-tuxcare.5, plus listed versions 2.10.152.10.15-tuxcare.12.10.15-tuxcare.22.10.15-tuxcare.32.10.15-tuxcare.4 |
2.10.15-tuxcare.5 |
@astrojs/underscore-redirectsTuxCare:npm |
3.6.5-tuxcare.0 up to 3.6.5-tuxcare.3, plus listed versions 3.6.53.6.5-tuxcare.13.6.5-tuxcare.2 |
3.6.5-tuxcare.3 |
@astrojs/underscore-redirectsTuxCare:npm |
2.10.15-tuxcare.0 up to 2.10.15-tuxcare.5, plus listed versions 2.10.152.10.15-tuxcare.12.10.15-tuxcare.22.10.15-tuxcare.32.10.15-tuxcare.4 |
2.10.15-tuxcare.5 |
@astrojs/upgradeTuxCare:npm |
3.6.5-tuxcare.0 up to 3.6.5-tuxcare.3, plus listed versions 3.6.53.6.5-tuxcare.13.6.5-tuxcare.2 |
3.6.5-tuxcare.3 |
@astrojs/rssTuxCare:npm |
4.0.1-tuxcare.0 up to 4.0.1-tuxcare.1, plus listed versions 4.0.1 |
4.0.1-tuxcare.1 |
@astrojs/rssTuxCare:npm |
4.0.2-tuxcare.0 up to 4.0.2-tuxcare.1, plus listed versions 4.0.2 |
4.0.2-tuxcare.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-59728 is a medium vulnerability (CVSS 4.3) in Withastro Astro, published July 20, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.32%, the 25th percentile. Fixed in @astrojs/rss 4.0.19.
References
github.com/withastro/astro/security/advisories/GHSA-8j5q-mfj2-5q9q
github.com/withastro/astro/pull/17209
github.com/withastro/astro/commit/fbcfa039dfe3d700b239f595a6c55ee35e45bd06
github.com/withastro/astro/releases/tag/@astrojs/[email protected]
nvd.nist.gov/vuln/detail/CVE-2026-59728
github.com/advisories/GHSA-8j5q-mfj2-5q9q
github.com/CVEProject/cvelistV5/tree/main/cves/2026/59xxx/CVE-2026-59728.json
github.com/withastro/astro