Update dependency @astrojs/node to v10 [SECURITY] - #88
Open
renovate[bot] wants to merge 1 commit into
Open
Conversation
renovate
Bot
force-pushed
the
renovate/npm-astrojs-node-vulnerability
branch
from
April 1, 2026 19:35
1f356d8 to
8538380
Compare
renovate
Bot
force-pushed
the
renovate/npm-astrojs-node-vulnerability
branch
from
April 23, 2026 19:17
8538380 to
4a86581
Compare
renovate
Bot
force-pushed
the
renovate/npm-astrojs-node-vulnerability
branch
2 times, most recently
from
April 27, 2026 21:44
4a86581 to
dea385e
Compare
renovate
Bot
force-pushed
the
renovate/npm-astrojs-node-vulnerability
branch
2 times, most recently
from
May 18, 2026 19:59
7a7d4a9 to
2455f07
Compare
renovate
Bot
force-pushed
the
renovate/npm-astrojs-node-vulnerability
branch
from
June 1, 2026 17:35
2455f07 to
9135f23
Compare
renovate
Bot
force-pushed
the
renovate/npm-astrojs-node-vulnerability
branch
from
June 11, 2026 11:03
9135f23 to
add6010
Compare
renovate
Bot
force-pushed
the
renovate/npm-astrojs-node-vulnerability
branch
from
July 12, 2026 11:48
add6010 to
ae5aec2
Compare
renovate
Bot
force-pushed
the
renovate/npm-astrojs-node-vulnerability
branch
from
July 20, 2026 21:36
ae5aec2 to
3a287cf
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
^9.5.0→^10.0.0Astro: Memory exhaustion DoS due to missing request body size limit in Server Islands
CVE-2026-29772 / GHSA-3rmj-9m5h-8fpv
More information
Details
Summary
Astro's Server Islands POST handler buffers and parses the full request body as JSON without enforcing a size limit. Because
JSON.parse()allocates a V8 heap object for every element in the input, a crafted payload of many small JSON objects achieves ~15x memory amplification (wire bytes to heap bytes), allowing a single unauthenticated request to exhaust the process heap and crash the server. The/_server-islands/[name]route is registered on all Astro SSR apps regardless of whether any component usesserver:defer, and the body is parsed before the island name is validated, so any Astro SSR app with the Node standalone adapter is affected.Details
Astro automatically registers a Server Islands route at
/_server-islands/[name]on all SSR apps, regardless of whether any component usesserver:defer. The POST handler inpackages/astro/src/core/server-islands/endpoint.tsbuffers the entire request body into memory and parses it as JSON with no size or depth limit:The request body is parsed before the island name is validated, so the attacker does not need to know any valid island name —
/_server-islands/anythingtriggers the vulnerable code path. No authentication is required.Additionally,
JSON.parse()allocates a heap object for every array/object in the input, so a payload consisting of many empty JSON objects (e.g.,[{},{},{},...]) achieves ~15x memory amplification (wire bytes to heap bytes). The entire object graph is held as a single live reference until parsing completes, preventing garbage collection. An 8.6 MB request is sufficient to crash a server with a 128 MB heap limit.PoC
Environment: Astro 5.18.0,
@astrojs/node9.5.4, Node.js 22 with--max-old-space-size=128.The app does not use
server:defer— this is a minimal SSR setup with no server island components. The route is still registered and exploitable.Setup files:
package.json:{ "name": "poc-server-islands-dos", "scripts": { "build": "astro build", "start": "node --max-old-space-size=128 dist/server/entry.mjs" }, "dependencies": { "astro": "5.18.0", "@​astrojs/node": "9.5.4" } }astro.config.mjs:src/pages/index.astro:Dockerfile:docker-compose.yml:Reproduction:
crash.py:The server process is killed and does not recover. Repeated requests in a containerized environment with restart policies cause a persistent crash-restart loop.
Impact
Any Astro SSR app with the Node standalone adapter is affected — the
/_server-islands/[name]route is registered by default regardless of whether any component usesserver:defer. Unauthenticated attackers can crash the server process with a single crafted HTTP request under 9 MB. In containerized environments with memory limits, repeated requests cause a persistent crash-restart loop, denying service to all users. The attack requires no authentication and no knowledge of valid island names — any value in the[name]parameter works because the body is parsed before the name is validated.Severity
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:HReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Astro has Full-Read SSRF in error rendering via Host: header injection
CVE-2026-25545 / GHSA-qq67-mvv5-fw3g
More information
Details
Summary
Server-Side Rendered pages that return an error with a prerendered custom error page (eg.
404.astroor500.astro) are vulnerable to SSRF. If theHost:header is changed to an attacker's server, it will be fetched on/500.htmland they can redirect this to any internal URL to read the response body through the first request.Details
The following line of code fetches
statusURLand returns the response back to the client:https://github.com/withastro/astro/blob/bf0b4bfc7439ddc565f61a62037880e4e701eb05/packages/astro/src/core/app/base.ts#L534
statusURLcomes fromthis.baseWithoutTrailingSlash, which is built from theHost:header.prerenderedErrorPageFetch()is justfetch(), and follows redirects. This makes it possible for an attacker to set theHost:header to their server (eg.Host: attacker.tld), and if the server still receives the request without normalization, Astro will now fetchhttp://attacker.tld/500.html.The attacker can then redirect this request to http://localhost:8000/ssrf.txt, for example, to fetch any locally listening service. The response code is not checked, because as the comment in the code explains, this fetch may give a 200 OK. The body and headers are returned back to the attacker.
Looking at the vulnerable code, the way to reach this is if the
renderError()function is called (error response during SSR) and the error page is prerendered (custom500.astroerror page). The PoC below shows how a basic project with these requirements can be set up.Note: Another common vulnerable pattern for
404.astrowe saw is:Also, it does not matter what
allowedDomainsis set to, since it only checks theX-Forwarded-Host:header.https://github.com/withastro/astro/blob/9e16d63cdd2537c406e50d005b389ac115755e8e/packages/astro/src/core/app/base.ts#L146
PoC
poc/src/pages/error.astrowhich throws an error with SSR:poc/src/pages/500.astrowith any content like:ssrf.txtand host it locally on http://localhost:8000:$ curl -i http://localhost:4321/error -H 'Host: localhost:5000' HTTP/1.1 500 OK content-type: text/plain date: Tue, 03 Feb 2026 09:51:28 GMT last-modified: Tue, 03 Feb 2026 09:51:09 GMT server: SimpleHTTP/0.6 Python/3.12.3 Connection: keep-alive Keep-Alive: timeout=5 Transfer-Encoding: chunked SECRET CONTENTImpact
An attacker who can access the application without
Host:header validation (eg. through finding the origin IP behind a proxy, or just by default) can fetch their own server to redirect to any internal IP. With this they can fetch cloud metadata IPs and interact with services in the internal network or localhost.For this to be vulnerable, a common feature needs to be used, with direct access to the server (no proxies).
Severity
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:N/VI:N/VA:N/SC:H/SI:L/SA:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Astro is vulnerable to SSRF due to missing allowlist enforcement in remote image inferSize
CVE-2026-27829 / GHSA-cj9f-h6r6-4cx2
More information
Details
Summary
A bug in Astro's image pipeline allows bypassing
image.domains/image.remotePatternsrestrictions, enabling the server to fetch content from unauthorized remote hosts.Details
Astro provides an
inferSizeoption that fetches remote images at render time to determine their dimensions. Remote image fetches are intended to be restricted to domains the site developer has manually authorized (using theimage.domainsorimage.remotePatternsoptions).However, when
inferSizeis used, no domain validation is performed — the image is fetched from any host regardless of the configured restrictions. An attacker who can influence the image URL (e.g., via CMS content or user-supplied data) can cause the server to fetch from arbitrary hosts.PoC
Details
Setup
Create a new Astro project with the following files:
package.json:{ "name": "poc-ssrf-infersize", "private": true, "scripts": { "dev": "astro dev --port 4322", "build": "astro build" }, "dependencies": { "astro": "5.17.2", "@​astrojs/node": "9.5.3" } }astro.config.mjs— onlylocalhost:9000is authorized:internal-service.mjs— simulates an internal service on a non-allowlisted host (127.0.0.1:8888):src/pages/test.astro:Steps to reproduce
npm installand start the internal service:internal-service.mjslogsReceived: GET /internal-api— the request was sent to127.0.0.1:8888despite onlylocalhost:9000being in the allowlist.Impact
Allows bypassing
image.domains/image.remotePatternsrestrictions to make server-side requests to unauthorized hosts. This includes the risk of server-side request forgery (SSRF) against internal network services and cloud metadata endpoints.Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:LReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Astro has memory exhaustion DoS due to missing request body size limit in Server Actions
CVE-2026-27729 / GHSA-jm64-8m5q-4qh8
More information
Details
Summary
Astro server actions have no default request body size limit, which can lead to memory exhaustion DoS. A single large POST to a valid action endpoint can crash the server process on memory-constrained deployments.
Details
On-demand rendered sites built with Astro can define server actions, which automatically parse incoming request bodies (JSON or FormData). The body is buffered entirely into memory with no size limit — a single oversized request is sufficient to exhaust the process heap and crash the server.
Astro's Node adapter (
mode: 'standalone') creates an HTTP server with no body size protection. In containerized environments, the crashed process is automatically restarted, and repeated requests cause a persistent crash-restart loop.Action names are discoverable from HTML form attributes on any public page, so no authentication is required.
PoC
Details
Setup
Create a new Astro project with the following files:
package.json:{ "name": "poc-dos", "private": true, "scripts": { "build": "astro build", "start:128mb": "node --max-old-space-size=128 dist/server/entry.mjs" }, "dependencies": { "astro": "5.17.2", "@​astrojs/node": "9.5.3" } }astro.config.mjs:src/actions/index.ts:src/pages/index.astro:crash-test.mjs:Reproduction
The server process crashes with
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory. The payload is buffered entirely into memory before any validation, exceeding the 128 MB heap limit.Impact
Allows unauthenticated denial of service against SSR standalone deployments using server actions. A single oversized request crashes the server process, and repeated requests cause a persistent crash-restart loop in containerized environments.
Severity
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:HReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Astro: Cache Poisoning due to incorrect error handling when if-match header is malformed
CVE-2026-41322 / GHSA-c57f-mm3j-27q9
More information
Details
Summary
Requesting a static JS/CSS resource from the
_astropath with an incorrect or malformedif-matchheader returns a500error with a one-year cache lifetime instead of412in some cases. As a result, all subsequent requests to that file — regardless of theif-matchheader — will be served a 5xx error instead of the file until the cache expires.Sending an incorrect or malformed
if-matchheader should always return a412error without any cache headers, which is not the current behavior.Affected Versions
astro@5.14.1@astrojs/node@9.4.4Proof of Concept
Run the following command:
If a 5xx error is not returned, inspect the resources via the browser's web inspector and select another CSS/JS file to request until a 5xx error is returned. The behavior generally defaults to a 5xx response. Note that all static files are immutable, so the cache must be purged or disabled to reproduce reliably.
A response similar to the following is expected from CloudFront:
The above is not the real server output but the AWS error response triggered when the pods return a 5xx. Below is the output of the same
curlcommand issued directly against a pod in Kubernetes:This demonstrates that the pod itself returns a
5xxerror instead of412. In addition, the response includes aCache-Control: public, max-age=31536000, immutableheader.Because the testing setup configures
if-matchas part of the cache key, the exploit no longer affects the production application. Prior to that change, the CDN Point of Presence would become cache-poisoned, and any client visiting the affected pages without cached files through the same PoP would receive broken pages. This was reproduced by creating test URLs and visiting them in a browser only after triggering the exploit. The exploited resources returned5xxerrors instead of the original CSS/JS content, breaking the application.Details
The findings were analyzed with an LLM, which identified the following file as the likely source: serve-static.ts
LLM analysis:
Impact
Cache Poisoning — An attacker can force edge servers to cache an error page instead of the actual content, rendering one or more assets unavailable to legitimate users until the cache expires.
Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:LReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Release Notes
withastro/astro (@astrojs/node)
v10.0.5Compare Source
Patch Changes
940afd5Thanks @matthewp! - Fixes static asset error responses incorrectly including immutable cache headers. Conditional request failures (e.g.If-Matchmismatch) now return the correct status code without far-future cache directives.v10.0.4Compare Source
Patch Changes
#16002
846f27fThanks @buley! - Fixes file descriptor leaks from read streams that were not destroyed on client disconnect or read errors#15941
f41584aThanks @ematipico! - Fixes an infinite loop inresolveClientDir()when the server entry point is bundled with esbuild or similar tools. The function now throws a descriptive error instead of hanging indefinitely when the expected server directory segment is not found in the file path.v10.0.3Compare Source
Patch Changes
#15735
9685e2dThanks @fa-sharp! - Fixes an EventEmitter memory leak when serving static pages from Node.js middleware.When using the middleware handler, requests that were being passed on to Express / Fastify (e.g. static files / pre-rendered pages / etc.) weren't cleaning up socket listeners before calling
next(), causing a memory leak warning. This fix makes sure to run the cleanup before callingnext().v10.0.2Compare Source
Patch Changes
6f8f0bcThanks @ematipico! - Updates the AstropeerDependencies#astroto be6.0.0.v10.0.1Compare Source
Patch Changes
bb2b8f5Thanks @ematipico! - Fixes an issue where the adapter would cause a series of warnings during the build.v10.0.0Compare Source
Major Changes
#15654
a32aee6Thanks @florian-lefebvre! - Removes theexperimentalErrorPageHostoptionThis option allowed fetching a prerendered error page from a different host than the server is currently running on.
However, there can be security implications with prefetching from other hosts, and often more customization was required to do this safely. This has now been removed as a built-in option so that you can implement your own secure solution as needed and appropriate for your project via middleware.
What should I do?
If you were previously using this feature, you must remove the option from your adapter configuration as it no longer exists:
// astro.config.mjs import { defineConfig } from 'astro/config' import node from '@​astrojs/node' export default defineConfig({ adapter: node({ mode: 'standalone', - experimentalErrorPageHost: 'http://localhost:4321' }) })You can replicate the previous behavior by checking the response status in a middleware and fetching the prerendered page yourself:
Minor Changes
#15258
d339a18Thanks @ematipico! - Stabilizes the adapter featureexperimentalStatiHeaders. If you were using this feature in any of the supported adapters, you'll need to change the name of the flag:export default defineConfig({ adapter: netlify({ - experimentalStaticHeaders: true + staticHeaders: true }) })#15759
39ff2a5Thanks @matthewp! - Adds a newbodySizeLimitoption to the@astrojs/nodeadapterYou can now configure a maximum allowed request body size for your Node.js standalone server. The default limit is 1 GB. Set the value in bytes, or pass
0to disable the limit entirely:#15006
f361730Thanks @florian-lefebvre! - Adds new session driver object shapeFor greater flexibility and improved consistency with other Astro code, session drivers are now specified as an object:
Specifying the session driver as a string has been deprecated, but will continue to work until this feature is removed completely in a future major version. The object shape is the current recommended and documented way to configure a session driver.
#14946
95c40f7Thanks @ematipico! - Removes theexperimental.cspflag and replaces it with a new configuration optionsecurity.csp- (v6 upgrade guidance)Patch Changes
#15473
d653b86Thanks @matthewp! - Improves error page loading to read from disk first before falling back to configured host#15562
e14a51dThanks @florian-lefebvre! - Updates to new Adapter API introduced in v6#15585
98ea30cThanks @matthewp! - Add a default body size limit for server actions to prevent oversized requests from exhausting memory.#15777
02e24d9Thanks @matthewp! - Fixes CSRF origin check mismatch by passing the actual server listening port tocreateRequest, ensuring the constructed URL origin includes the correct port (e.g.,http://localhost:4321instead ofhttp://localhost). Also restrictsX-Forwarded-Prototo only be trusted whenallowedDomainsis configured.#15714
9a2c949Thanks @ematipico! - Fixes an issue where static headers weren't correctly applied when the website usesbase.#15763
1567e8cThanks @matthewp! - Normalizes static file paths before evaluating dotfile access rules for improved consistency#15164
54dc11dThanks @HiDeoo! - Fixes an issue where the Node.js adapter could fail to serve a 404 page matching a pre-rendered dynamic route pattern.#15745
20b05c0Thanks @matthewp! - Hardens static file handler path resolution to ensure resolved paths stay within the client directory#15495
5b99e90Thanks @leekeh! - Refactors to usemiddlewareModeadapter feature (set toclassic)#15657
cb625b6Thanks @qzio! - Adds a newsecurity.actionBodySizeLimitoption to configure the maximum size of Astro Actions request bodies.This lets you increase the default 1 MB limit when your actions need to accept larger payloads. For example, actions that handle file uploads or large JSON payloads can now opt in to a higher limit.
If you do not set this option, Astro continues to enforce the 1 MB default to help prevent abuse.
Updated dependencies [
4ebc1e3,4e7f3e8,a164c77,cf6ea6b,a18d727,240c317,745e632]:v9.5.5Compare Source
Patch Changes
c2cd371]:v9.5.4Compare Source
Patch Changes
#15564
522f880Thanks @matthewp! - Add a default body size limit for server actions to prevent oversized requests from exhausting memory.#15572
ef851bfThanks @matthewp! - Upgrade astro package supportastro@5.17.3 includes a fix to prevent Action payloads from exhausting memory. @astrojs/node now depends on this version of Astro as a minimum requirement.
v9.5.3Compare Source
Patch Changes
c13b536Thanks @matthewp! - Improves error page loading to read from disk first before falling back to configured hostv9.5.2Compare Source
Patch Changes
#15196
a8317c1Thanks @ematipico! - Fixes an issue where some prerendered pages weren't correctly rendered when using the Node.js adapter in middleware mode.#15169
b803d8bThanks @rururux! - fix: fix image 500 error when moving dist directory in standalone Nodev9.5.1Compare Source
Patch Changes
9e9c528,0f75f6b]:Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.