Every CVE Search/ Get API key

CVE-2025-64764

Astro is vulnerable to Reflected XSS via the server islands feature

7.1 HighFix available

Astro is a web framework. Prior to version 5.15.8, a reflected XSS vulnerability is present when the server islands feature is used in the targeted application, regardless of what was intended by the component template(s). This issue has been patched in version 5.15.8.

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
Low
Integrity
High
Availability
None

Exploit likelihood

0.53%Up 0.5 points since Nov 20, 2025
90%50%10%1%

What each source reports

CVE List Score used 7.1

Astro is vulnerable to Reflected XSS via the server islands feature

Astro is a web framework. Prior to version 5.15.8, a reflected XSS vulnerability is present when the server islands feature is used in the targeted application, regardless of what was intended by the component template(s). This issue has been patched in version 5.15.8.

Record
CVE-2025-64764
CVSS 3.1
7.1 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:H/A:N
Weakness
CWE-80
Updated
2026-11-02
EUVDEUVD-2025-198184 7.1

Astro is a web framework. Prior to version 5.15.8, a reflected XSS vulnerability is present when the server islands feature is used in the targeted application, regardless of what was intended by the component template(s). This issue has been patched in version 5.15.8.

Record
EUVD-2025-198184
CVSS 3.1
7.1 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:H/A:N
Updated
2026-11-02
GitHub AdvisoriesGHSA-wrwg-2hg8-v723 7.1

Astro vulnerable to reflected XSS via the server islands feature

Summary

After some research it appears that it is possible to obtain a reflected XSS when the server islands feature is used in the targeted application, regardless of what was intended by the component template(s).

Details

Server islands run in their own isolated context outside of the page request and use the following pattern path to hydrate the page: /_server-islands/[name]. These paths can be called via GET or POST and use three parameters:

  • e: component to export
  • p: the transmitted properties, encrypted
  • s: for the slots

Slots are placeholders for external HTML content, and therefore allow, by default, the injection of code if the component template supports it, nothing exceptional in principle, just a feature.

This is where it becomes problematic: it is possible, independently of the component template used, even if it is completely empty, to inject a slot containing an XSS payload, whose parent is a tag whose name is is the absolute path of the island file. Enabling reflected XSS on any application, regardless of the component templates used, provided that the server islands is used at least once.

How ?

By default, when a call is made to the endpoint /_server-islands/[name], the value of the parameter e is default, pointing to a function exported by the component's module.

Upon further investigation, we find that two other values ​​are possible for the component export (param e) in a typical configuration: url and file. file returns a string value corresponding to the absolute path of the island file. Since the value is of type string, it fulfills the following condition and leads to this code block:

<img width="804" height="571" alt="image" src="https://github.com/user-attachments/assets/25ea6c16-fc27-477a-a1ad-e5edf0819b31" />

An entire template is created, completely independently, and then returned:

  • the absolute path name is sanitized and then injected as the tag name
  • childSlots, the value provided to the s parameter, is injected as a child

All of this is done using markHTMLString. This allows the injection of any XSS payload, even if the component template intended by the application is initially empty or does not provide for the use of slots.

Proof of concept

For our Proof of Concept (PoC), we will use a minimal repository:

  • Latest Astro version at the time (5.15.6)
  • Use of Island servers, with a completely empty component, to demonstrate what we explained previously

Download the PoC repository

Access the following URL and note the opening of the popup, demonstrating the reflected XSS:

http://localhost:4321/_server-islands/ServerTime?e=file&p=&s={%22zhero%22:%22%3Cimg%20src=x%20onerror=alert(0)%3E%22}

<img width="1781" height="529" alt="image" src="https://github.com/user-attachments/assets/92f8134a-d1c7-4d3f-818e-214842c239c8" />

The value of the parameter s must be in JSON format and the payload must be injected at the value level, not the key level :

<img width="3273" height="1840" alt="for_respected_patron" src="https://github.com/user-attachments/assets/8ac0079a-3dee-49e8-b639-322f77c84b83" />

Despite the initial template being empty, it is created because the value of the URL parameter e is set to file, as explained earlier. The parent tag is the name of the component's internal route, and its child is the value of the key "zhero" (the name doesn't matter) of the URL parameter s.

Credits

  • Allam Rachid (zhero;)
  • Allam Yasser (inzo)
Record
GHSA-wrwg-2hg8-v723
CVSS 3.1
7.1 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:H/A:N
Weakness
CWE-79, CWE-80
Updated
2026-11-02
NVD 7.1

Astro is a web framework. Prior to version 5.15.8, a reflected XSS vulnerability is present when the server islands feature is used in the targeted application, regardless of what was intended by the component template(s). This issue has been patched in version 5.15.8.

Record
CVE-2025-64764
CVSS 3.1
7.1 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:H/A:N
CVSS 3.1
5.4 MediumCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:N
Weakness
CWE-80
Updated
2026-11-02
OSV 7.1

Astro is vulnerable to Reflected XSS via the server islands feature

Astro is a web framework. Prior to version 5.15.8, a reflected XSS vulnerability is present when the server islands feature is used in the targeted application, regardless of what was intended by the component template(s). This issue has been patched in version 5.15.8.

Record
CVE-2025-64764
CVSS 3.1
7.1 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:H/A:N
Weakness
CWE-80
Updated
2026-11-02
OSVGHSA-wrwg-2hg8-v723 7.1

Astro vulnerable to reflected XSS via the server islands feature

Summary

After some research it appears that it is possible to obtain a reflected XSS when the server islands feature is used in the targeted application, regardless of what was intended by the component template(s).

Details

Server islands run in their own isolated context outside of the page request and use the following pattern path to hydrate the page: /_server-islands/[name]. These paths can be called via GET or POST and use three parameters:

  • e: component to export
  • p: the transmitted properties, encrypted
  • s: for the slots

Slots are placeholders for external HTML content, and therefore allow, by default, the injection of code if the component template supports it, nothing exceptional in principle, just a feature.

This is where it becomes problematic: it is possible, independently of the component template used, even if it is completely empty, to inject a slot containing an XSS payload, whose parent is a tag whose name is is the absolute path of the island file. Enabling reflected XSS on any application, regardless of the component templates used, provided that the server islands is used at least once.

How ?

By default, when a call is made to the endpoint /_server-islands/[name], the value of the parameter e is default, pointing to a function exported by the component's module.

Upon further investigation, we find that two other values ​​are possible for the component export (param e) in a typical configuration: url and file. file returns a string value corresponding to the absolute path of the island file. Since the value is of type string, it fulfills the following condition and leads to this code block:

<img width="804" height="571" alt="image" src="https://github.com/user-attachments/assets/25ea6c16-fc27-477a-a1ad-e5edf0819b31" />

An entire template is created, completely independently, and then returned:

  • the absolute path name is sanitized and then injected as the tag name
  • childSlots, the value provided to the s parameter, is injected as a child

All of this is done using markHTMLString. This allows the injection of any XSS payload, even if the component template intended by the application is initially empty or does not provide for the use of slots.

Proof of concept

For our Proof of Concept (PoC), we will use a minimal repository:

  • Latest Astro version at the time (5.15.6)
  • Use of Island servers, with a completely empty component, to demonstrate what we explained previously

Download the PoC repository

Access the following URL and note the opening of the popup, demonstrating the reflected XSS:

http://localhost:4321/_server-islands/ServerTime?e=file&p=&s={%22zhero%22:%22%3Cimg%20src=x%20onerror=alert(0)%3E%22}

<img width="1781" height="529" alt="image" src="https://github.com/user-attachments/assets/92f8134a-d1c7-4d3f-818e-214842c239c8" />

The value of the parameter s must be in JSON format and the payload must be injected at the value level, not the key level :

<img width="3273" height="1840" alt="for_respected_patron" src="https://github.com/user-attachments/assets/8ac0079a-3dee-49e8-b639-322f77c84b83" />

Despite the initial template being empty, it is created because the value of the URL parameter e is set to file, as explained earlier. The parent tag is the name of the component's internal route, and its child is the value of the key "zhero" (the name doesn't matter) of the URL parameter s.

Credits

  • Allam Rachid (zhero;)
  • Allam Yasser (inzo)
Record
GHSA-wrwg-2hg8-v723
CVSS 3.1
7.1 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:H/A:N
Weakness
CWE-79, CWE-80
Updated
2026-11-02
Show 19 moreShow less
OSVCLSA-2026-1777855417 No score

TuxCare security update for astro (10 CVEs)

TuxCare rebuilt astro to address 10 CVEs. Fixed in 1.9.2-tuxcare.1.

Record
CLSA-2026-1777855417
Updated
2026-11-02
OSVCLSA-2026-1777855422 No score

TuxCare security update for astro (10 CVEs)

TuxCare rebuilt astro to address 10 CVEs. Fixed in 0.26.1-tuxcare.1.

Record
CLSA-2026-1777855422
Updated
2026-11-02
OSVCLSA-2026-1777941830 No score

TuxCare security update for astro (10 CVEs)

TuxCare rebuilt astro to address 10 CVEs. Fixed in 2.10.15-tuxcare.1.

Record
CLSA-2026-1777941830
Updated
2026-11-02
OSVCLSA-2026-1778114666 No score

TuxCare security update for 5 packages (9 CVEs)

TuxCare rebuilt 5 packages to address 9 CVEs. Fixed in 4.16.19-tuxcare.1.

Record
CLSA-2026-1778114666
Updated
2026-11-02
OSVCLSA-2026-1778633121 No score

TuxCare security update for astro (11 CVEs)

TuxCare rebuilt astro to address 11 CVEs. Fixed in 3.6.5-tuxcare.1.

Record
CLSA-2026-1778633121
Updated
2026-11-02
OSVCLSA-2026-1792161544 No score

TuxCare security update for @astrojs/internal-helpers (11 CVEs)

TuxCare rebuilt @astrojs/internal-helpers to address 11 CVEs. Fixed in 2.10.15-tuxcare.1.

Record
CLSA-2026-1792161544
Updated
2026-11-02
OSVCLSA-2026-1792161545 No score

TuxCare security update for @astrojs/internal-helpers (10 CVEs)

TuxCare rebuilt @astrojs/internal-helpers to address 10 CVEs. Fixed in 4.16.19-tuxcare.1.

Record
CLSA-2026-1792161545
Updated
2026-11-02
OSVCLSA-2026-1792161546 No score

TuxCare security update for @astrojs/internal-helpers (13 CVEs)

TuxCare rebuilt @astrojs/internal-helpers to address 13 CVEs. Fixed in 3.6.5-tuxcare.1.

Record
CLSA-2026-1792161546
Updated
2026-11-02
OSVCLSA-2026-1792161681 No score

TuxCare security update for @astrojs/prism (10 CVEs)

TuxCare rebuilt @astrojs/prism to address 10 CVEs. Fixed in 1.9.2-tuxcare.1.

Record
CLSA-2026-1792161681
Updated
2026-11-02
OSVCLSA-2026-1792161682 No score

TuxCare security update for @astrojs/prism (10 CVEs)

TuxCare rebuilt @astrojs/prism to address 10 CVEs. Fixed in 0.26.1-tuxcare.1.

Record
CLSA-2026-1792161682
Updated
2026-11-02
OSVCLSA-2026-1792161683 No score

TuxCare security update for @astrojs/prism (11 CVEs)

TuxCare rebuilt @astrojs/prism to address 11 CVEs. Fixed in 2.10.15-tuxcare.1.

Record
CLSA-2026-1792161683
Updated
2026-11-02
OSVCLSA-2026-1792161684 No score

TuxCare security update for @astrojs/prism (10 CVEs)

TuxCare rebuilt @astrojs/prism to address 10 CVEs. Fixed in 4.16.19-tuxcare.1.

Record
CLSA-2026-1792161684
Updated
2026-11-02
OSVCLSA-2026-1792161686 No score

TuxCare security update for @astrojs/prism (13 CVEs)

TuxCare rebuilt @astrojs/prism to address 13 CVEs. Fixed in 3.6.5-tuxcare.1.

Record
CLSA-2026-1792161686
Updated
2026-11-02
OSVCLSA-2026-1792161759 No score

TuxCare security update for @astrojs/studio (10 CVEs)

TuxCare rebuilt @astrojs/studio to address 10 CVEs. Fixed in 4.16.19-tuxcare.1.

Record
CLSA-2026-1792161759
Updated
2026-11-02
OSVCLSA-2026-1792161775 No score

TuxCare security update for @astrojs/underscore-redirects (11 CVEs)

TuxCare rebuilt @astrojs/underscore-redirects to address 11 CVEs. Fixed in 2.10.15-tuxcare.1.

Record
CLSA-2026-1792161775
Updated
2026-11-02
OSVCLSA-2026-1792161776 No score

TuxCare security update for @astrojs/underscore-redirects (10 CVEs)

TuxCare rebuilt @astrojs/underscore-redirects to address 10 CVEs. Fixed in 4.16.19-tuxcare.1.

Record
CLSA-2026-1792161776
Updated
2026-11-02
OSVCLSA-2026-1792161777 No score

TuxCare security update for @astrojs/underscore-redirects (13 CVEs)

TuxCare rebuilt @astrojs/underscore-redirects to address 13 CVEs. Fixed in 3.6.5-tuxcare.1.

Record
CLSA-2026-1792161777
Updated
2026-11-02
OSVCLSA-2026-1792161847 No score

TuxCare security update for @astrojs/upgrade (10 CVEs)

TuxCare rebuilt @astrojs/upgrade to address 10 CVEs. Fixed in 4.16.19-tuxcare.1.

Record
CLSA-2026-1792161847
Updated
2026-11-02
OSVCLSA-2026-1792161848 No score

TuxCare security update for @astrojs/upgrade (13 CVEs)

TuxCare rebuilt @astrojs/upgrade to address 13 CVEs. Fixed in 3.6.5-tuxcare.1.

Record
CLSA-2026-1792161848
Updated
2026-11-02

Affected products

Affected packages

Affected packages
PackageAffectedFixed
astro
npm
through 5.15.6
5.15.8
astro
TuxCare:npm
From an advisory covering 10 CVEs
1.9.2-tuxcare.0 up to 1.9.2-tuxcare.1, plus listed versions
1.9.2
1.9.2-tuxcare.1
astro
TuxCare:npm
From an advisory covering 10 CVEs
0.26.1-tuxcare.0 up to 0.26.1-tuxcare.1, plus listed versions
0.26.1
0.26.1-tuxcare.1
astro
TuxCare:npm
From an advisory covering 10 CVEs
2.10.15-tuxcare.0 up to 2.10.15-tuxcare.1, plus listed versions
2.10.15
2.10.15-tuxcare.1
@astrojs/db
TuxCare:npm
From an advisory covering 8 CVEs
4.16.19-tuxcare.0 up to 4.16.19-tuxcare.1, plus listed versions
4.16.19
4.16.19-tuxcare.1
@astrojs/rss
TuxCare:npm
From an advisory covering 8 CVEs
4.16.19-tuxcare.0 up to 4.16.19-tuxcare.1, plus listed versions
4.16.19
4.16.19-tuxcare.1
@astrojs/telemetry
TuxCare:npm
From an advisory covering 8 CVEs
4.16.19-tuxcare.0 up to 4.16.19-tuxcare.1, plus listed versions
4.16.19
4.16.19-tuxcare.1
astro
TuxCare:npm
From an advisory covering 8 CVEs
4.16.19-tuxcare.0 up to 4.16.19-tuxcare.1, plus listed versions
4.16.19
4.16.19-tuxcare.1
create-astro
TuxCare:npm
From an advisory covering 8 CVEs
4.16.19-tuxcare.0 up to 4.16.19-tuxcare.1, plus listed versions
4.16.19
4.16.19-tuxcare.1
astro
TuxCare:npm
From an advisory covering 11 CVEs
3.6.5-tuxcare.0 up to 3.6.5-tuxcare.1, plus listed versions
3.6.5
3.6.5-tuxcare.1
Show 15 moreShow less
Affected packages
PackageAffectedFixed
@astrojs/internal-helpers
TuxCare:npm
From an advisory covering 11 CVEs
2.10.15-tuxcare.0 up to 2.10.15-tuxcare.1, plus listed versions
2.10.15
2.10.15-tuxcare.1
@astrojs/internal-helpers
TuxCare:npm
From an advisory covering 9 CVEs
4.16.19-tuxcare.0 up to 4.16.19-tuxcare.1, plus listed versions
4.16.19
4.16.19-tuxcare.1
@astrojs/internal-helpers
TuxCare:npm
From an advisory covering 13 CVEs
3.6.5-tuxcare.0 up to 3.6.5-tuxcare.1, plus listed versions
3.6.5
3.6.5-tuxcare.1
@astrojs/prism
TuxCare:npm
From an advisory covering 10 CVEs
1.9.2-tuxcare.0 up to 1.9.2-tuxcare.1, plus listed versions
1.9.2
1.9.2-tuxcare.1
@astrojs/prism
TuxCare:npm
From an advisory covering 10 CVEs
0.26.1-tuxcare.0 up to 0.26.1-tuxcare.1, plus listed versions
0.26.1
0.26.1-tuxcare.1
@astrojs/prism
TuxCare:npm
From an advisory covering 11 CVEs
2.10.15-tuxcare.0 up to 2.10.15-tuxcare.1, plus listed versions
2.10.15
2.10.15-tuxcare.1
@astrojs/prism
TuxCare:npm
From an advisory covering 9 CVEs
4.16.19-tuxcare.0 up to 4.16.19-tuxcare.1, plus listed versions
4.16.19
4.16.19-tuxcare.1
@astrojs/prism
TuxCare:npm
From an advisory covering 13 CVEs
3.6.5-tuxcare.0 up to 3.6.5-tuxcare.1, plus listed versions
3.6.5
3.6.5-tuxcare.1
@astrojs/studio
TuxCare:npm
From an advisory covering 9 CVEs
4.16.19-tuxcare.0 up to 4.16.19-tuxcare.1, plus listed versions
4.16.19
4.16.19-tuxcare.1
@astrojs/underscore-redirects
TuxCare:npm
From an advisory covering 11 CVEs
2.10.15-tuxcare.0 up to 2.10.15-tuxcare.1, plus listed versions
2.10.15
2.10.15-tuxcare.1
@astrojs/underscore-redirects
TuxCare:npm
From an advisory covering 9 CVEs
4.16.19-tuxcare.0 up to 4.16.19-tuxcare.1, plus listed versions
4.16.19
4.16.19-tuxcare.1
@astrojs/underscore-redirects
TuxCare:npm
From an advisory covering 13 CVEs
3.6.5-tuxcare.0 up to 3.6.5-tuxcare.1, plus listed versions
3.6.5
3.6.5-tuxcare.1
@astrojs/upgrade
TuxCare:npm
From an advisory covering 9 CVEs
4.16.19-tuxcare.0 up to 4.16.19-tuxcare.1, plus listed versions
4.16.19
4.16.19-tuxcare.1
@astrojs/upgrade
TuxCare:npm
From an advisory covering 13 CVEs
3.6.5-tuxcare.0 up to 3.6.5-tuxcare.1, plus listed versions
3.6.5
3.6.5-tuxcare.1
astro
npm
before 5.15.8
5.15.8

Public exploits

Links only. Every CVE stores no exploit code.

Public exploits
SourceLinkDate
NucleiAstro - Reflected XSS via server islands feature

History

History
RecordedChangedSources
affected, facts
first indexedCVE List, EUVD, GitHub Advisories, Nuclei, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2025-64764 is a high vulnerability (CVSS 7.1) in Astro, published November 19, 2025. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.53%, the 44th percentile. Fixed in astro 5.15.8.

References

MoveEnter Open