Every CVE Search/ Get API key

CVE-2026-59728

@astrojs/rss: XML Injection via Unescaped RSS Feed Fields

4.3 MediumFix available

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

0.32%Up 0.1 points since Jul 28, 2026
90%50%10%1%

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 MediumCVSS: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 MediumCVSS: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 MediumCVSS: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 MediumCVSS: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 MediumCVSS: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 MediumCVSS: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

Affected packages
PackageAffectedFixed
@astrojs/rss
npm
1.0.0 up to 4.0.19
4.0.19
@astrojs/rss
TuxCare: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/rss
TuxCare: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-helpers
TuxCare: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-helpers
TuxCare: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/prism
TuxCare: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/prism
TuxCare: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-redirects
TuxCare: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-redirects
TuxCare: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/upgrade
TuxCare: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/rss
TuxCare: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/rss
TuxCare: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

History
RecordedChangedSources
first indexedCVE 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

MoveEnter Open