NIST deprecates RSA-2048 from 2030. Find every one of them before attackers do.
📦 npm
Not in CISA KEV

CVE-2026-126363 — @astrojs/solid-js

Fix: withastro/astro@290b196

CVE-2026-126363 is a Cross-site Scripting (XSS) vulnerability in @astrojs/solid-js. A fix is available for @astrojs/solid-js — see the affected versions and patch details below.

Astro: Reflected XSS via unescaped slot names in @astrojs/solid-js

Published
Updated
Affected
1 pkg
Patched
1 / 1
Exploits
None indexed
Exploitation data as of Nov 12, 2026 · OSV.dev, NVD, FIRST.org (EPSS)

Real-World Exposure

1 pkg affected

How broadly this vulnerability is actually deployed: weekly install volume shows current usage, and reverse-dependency count shows how many other packages break if it stays unpatched.

14other npm packages depend on this — each one inherits the vulnerability until it's patched upstream
@astrojs/solid-jsnpm
205Kdownloads / week

Description

Summary

The @astrojs/solid-js renderer wraps named slot content passed to Solid components in an <astro-slot> element, and writes the slot name into its name attribute without HTML escaping. A slot name containing " could end the attribute and inject arbitrary HTML into the page.

For example, a page that takes a slot name from the request:

---
import Tabs from '../components/Tabs.jsx';
const tab = Astro.url.searchParams.get('tab');
---
<Tabs client:load active={tab}><div slot={tab}>…</div></Tabs>

rendered with a Solid component that renders a slot by name:

export default function Tabs(props) {
	return <div>{props[props.active]}</div>;
}

would output a tab value such as x"><img src=x onerror=alert(1)> as live HTML.

Impact

Reflected cross-site scripting. An attacker who gets a user to open a crafted link can run JavaScript on the site's origin, but only in applications where all of the following are true:

  • The page passes request-controlled input (such as a query parameter) as a slot name.
  • The Solid component is hydrated with a client:* directive. For non-hydrated components the slot wrapper is removed from the output, together with its name attribute.
  • The Solid component renders the attacker-chosen slot, which in practice means accessing slot props by a dynamic name. Components that never render the slot only output Astro's already escaped fallback template.

This is the @astrojs/solid-js counterpart of GHSA-8hv8-536x-4wqp (CVE-2026-50146), which fixed the same issue in astro core.

Affected versions

@astrojs/solid-js >= 0.2.0, <= 7.1.1.

Patches

Fixed in @astrojs/solid-js 7.1.2. Slot names are now HTML-escaped in the server renderer.

Workarounds

Upgrade to @astrojs/solid-js 7.1.2 or later. Before upgrading, do not use request-controlled input as a slot name, or map it to a fixed set of known slot names before passing it to a component.

Credits

Reported by @manus-pi.

Affected Packages

1 total 1 fixed
EcosystemPackageVulnerable rangeFix
📦npm@astrojs/solid-js≥ 0.2.0&&< 7.1.27.1.2npm install @astrojs/solid-js@7.1.2

Detection & mitigation playbook

Open-source dependency
  1. Detect

    Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for @astrojs/solid-js, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.

  2. Fix

    Update @astrojs/solid-js to 7.1.2 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms CVE-2026-126363 is resolved across your whole dependency graph.

  3. Workarounds

    Escape or sanitise the affected output on the server side rather than relying on client-side filtering, and add a Content-Security-Policy that blocks inline script execution so injected markup cannot run even if it reaches the page.

Frequently Asked Questions

## Summary The `@astrojs/solid-js` renderer wraps named slot content passed to Solid components in an `<astro-slot>` element, and writes the slot name into its `name` attribute without HTML escaping. A slot name containing `"` could end the attribute and inject arbitrary HTML into the page. For example, a page that takes a slot name from the request: ```astro --- import Tabs from '../components/Tabs.jsx'; const tab = Astro.url.searchParams.get('tab'); --- <Tabs client:load active={tab}><div slot={tab}>…</div></Tabs> ``` rendered with a Solid component that renders a slot by name: ```jsx e
O3 Security · Impact-Aware SCA

Is CVE-2026-126363 in your dependencies?

Find it across npm, including transitive dependencies.