CVE-2026-110802
Altair: DOM-based XSS via attacker-controlled script URLs in the iframe sandbox
Altair is a GraphQL client for all platforms. From 7.2.4 until 8.5.8, packages/altair-iframe-sandbox/src/main.ts reads plugin_sandbox_opts from the iframe-sandbox query string and passes attacker-controlled scriptUrls to injectScript() in packages/altair-core/src/utils/inject.ts, which creates script elements in the page. The intended parent iframe flow places the page in an iframe with sandbox allow-scripts and without allow-same-origin, but direct navigation to a crafted iframe-sandbox URL omits that isolation and executes the supplied script in the origin serving Altair. Exploitation requires a victim to open the crafted URL, and the resulting script can access script-readable storage and make same-origin requests according to the deployment's authentication and cookie controls. This issue is fixed in version 8.5.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
- Low
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used 6.1
Altair: DOM-based XSS via attacker-controlled script URLs in the iframe sandbox
Altair is a GraphQL client for all platforms. From 7.2.4 until 8.5.8, packages/altair-iframe-sandbox/src/main.ts reads plugin_sandbox_opts from the iframe-sandbox query string and passes attacker-controlled scriptUrls to injectScript() in packages/altair-core/src/utils/inject.ts, which creates script elements in the page. The intended parent iframe flow places the page in an iframe with sandbox allow-scripts and without allow-same-origin, but direct navigation to a crafted iframe-sandbox URL omits that isolation and executes the supplied script in the origin serving Altair. Exploitation requires a victim to open the crafted URL, and the resulting script can access script-readable storage and make same-origin requests according to the deployment's authentication and cookie controls. This issue is fixed in version 8.5.8.
- Record
CVE-2026-110802- CVSS 3.1
- 6.1 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N - Weakness
- CWE-79, CWE-829
- Updated
- 2026-11-10
EUVDEUVD-2026-117794 6.1
Altair is a GraphQL client for all platforms. From 7.2.4 until 8.5.8, packages/altair-iframe-sandbox/src/main.ts reads plugin_sandbox_opts from the iframe-sandbox query string and passes attacker-controlled scriptUrls to injectScript() in packages/altair-core/src/utils/inject.ts, which creates script elements in the page. The intended parent iframe flow places the page in an iframe with sandbox allow-scripts and without allow-same-origin, but direct navigation to a crafted iframe-sandbox URL omits that isolation and executes the supplied script in the origin serving Altair. Exploitation requires a victim to open the crafted URL, and the resulting script can access script-readable storage and make same-origin requests according to the deployment's authentication and cookie controls. This issue is fixed in version 8.5.8.
- Record
EUVD-2026-117794- CVSS 3.1
- 6.1 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N - Updated
- 2026-11-10
GitHub AdvisoriesGHSA-752m-7p75-49gf 6.1
Altair: DOM-based XSS via attacker-controlled script URLs in the iframe sandbox
Summary
Altair 8.5.7 accepts plugin configuration directly from the iframe-sandbox query string.
When plugin_sandbox_opts contains type: "scripts" and an attacker-controlled URL in scriptUrls, the sandbox page creates a classic <script src="..."> element and loads the supplied script.
In the intended plugin flow, this page runs inside an <iframe sandbox="allow-scripts"> without allow-same-origin, giving plugin code an opaque origin. However, if a victim opens the crafted sandbox URL directly, that iframe isolation is absent and the attacker-controlled script executes in the origin serving Altair, resulting in DOM-based cross-site scripting (XSS) / arbitrary JavaScript execution in the Altair hosting origin.
Exploitation requires the victim to open a crafted URL.
Details
The sandbox reads its configuration directly from window.location.search.
In packages/altair-iframe-sandbox/src/main.ts:
const searchParams = new URLSearchParams(window.location.search);
const sandboxType = searchParams.get('sandbox_type');
switch (sandboxType) {
case 'plugin':
handlePluginSandbox();
break;
}
handlePluginSandbox() then parses plugin_sandbox_opts:
const searchParams = new URLSearchParams(window.location.search);
const pluginSandboxOptsStr = searchParams.get('plugin_sandbox_opts');
const pluginSandboxOpts = pluginSandboxOptsStr
? (JSON.parse(pluginSandboxOptsStr) as PluginParentWorkerOptions)
: undefined;
The relevant validation only checks the plugin type:
if (pluginSandboxOpts.type !== 'scripts') {
throw new Error('Invalid plugin option type provided!');
}
Values from scriptUrls are then passed to injectScript():
if (pluginSandboxOpts.scriptUrls) {
for (const script of pluginSandboxOpts.scriptUrls) {
await injectScript(script);
}
}
The sink in packages/altair-core/src/utils/inject.ts is:
const script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
head.appendChild(script);
The intended parent flow relies on browser iframe sandboxing:
// NOTE: Don't add allow-same-origin to the sandbox attribute!
iframe.sandbox.add('allow-scripts');
Direct navigation to the sandbox URL does not have this parent iframe sandbox, so the injected script runs in the normal hosting origin.
The official middleware also clears CSP for paths identified as iframe-sandbox. This is not the root cause, but reduces the chance that a deployment-level CSP will block attacker-controlled external scripts when the default middleware behavior is used.
PoC
The following PoC is intentionally benign and demonstrates JavaScript execution in the Altair hosting origin.
- Create a local Altair deployment
mkdir altair-local-test
cd altair-local-test
npm init -y
npm i express@5.2.1 altair-express-middleware@8.5.7 graphql@17.0.2 graphql-http@1.23.0
Create server.js:
const express = require("express");
const { altairExpress } = require("altair-express-middleware");
const { createHandler } = require("graphql-http/lib/use/express");
const { buildSchema } = require("graphql");
const app = express();
const schema = buildSchema(`
type Query {
hello: String
}
`);
const root = {
hello: () => "world",
};
app.all(
"/api/graphql",
createHandler({
schema,
rootValue: root,
})
);
app.use(
"/graphql",
altairExpress({
endpointURL: "/api/graphql",
initialQuery: "{ hello }",
})
);
app.listen(4000, () => {
console.log("Altair UI: http://localhost:4000/graphql/");
console.log("Sandbox: http://localhost:4000/graphql/iframe-sandbox/");
});
Run:
node server.js
- Host a benign script
Host the following as poc.js on a domain you control:
document.body.textContent = "";
const h1 = document.createElement("h1");
h1.textContent = "Altair iframe-sandbox PoC";
const p = document.createElement("p");
p.textContent = "Script executed in: " +…
- Record
GHSA-752m-7p75-49gf- CVSS 3.1
- 6.1 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N - Weakness
- CWE-79, CWE-829
- Updated
- 2026-11-10
NVD 6.1
Altair is a GraphQL client for all platforms. From 7.2.4 until 8.5.8, packages/altair-iframe-sandbox/src/main.ts reads plugin_sandbox_opts from the iframe-sandbox query string and passes attacker-controlled scriptUrls to injectScript() in packages/altair-core/src/utils/inject.ts, which creates script elements in the page. The intended parent iframe flow places the page in an iframe with sandbox allow-scripts and without allow-same-origin, but direct navigation to a crafted iframe-sandbox URL omits that isolation and executes the supplied script in the origin serving Altair. Exploitation requires a victim to open the crafted URL, and the resulting script can access script-readable storage and make same-origin requests according to the deployment's authentication and cookie controls. This issue is fixed in version 8.5.8.
- Record
CVE-2026-110802- CVSS 3.1
- 6.1 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N - Weakness
- CWE-79, CWE-829
- Updated
- 2026-11-10
OSV 6.1
Altair: DOM-based XSS via attacker-controlled script URLs in the iframe sandbox
Altair is a GraphQL client for all platforms. From 7.2.4 until 8.5.8, packages/altair-iframe-sandbox/src/main.ts reads plugin_sandbox_opts from the iframe-sandbox query string and passes attacker-controlled scriptUrls to injectScript() in packages/altair-core/src/utils/inject.ts, which creates script elements in the page. The intended parent iframe flow places the page in an iframe with sandbox allow-scripts and without allow-same-origin, but direct navigation to a crafted iframe-sandbox URL omits that isolation and executes the supplied script in the origin serving Altair. Exploitation requires a victim to open the crafted URL, and the resulting script can access script-readable storage and make same-origin requests according to the deployment's authentication and cookie controls. This issue is fixed in version 8.5.8.
- Record
CVE-2026-110802- CVSS 3.1
- 6.1 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N - Weakness
- CWE-79, CWE-829
- Updated
- 2026-11-07
OSVGHSA-752m-7p75-49gf 6.1
Altair: DOM-based XSS via attacker-controlled script URLs in the iframe sandbox
Summary
Altair 8.5.7 accepts plugin configuration directly from the iframe-sandbox query string.
When plugin_sandbox_opts contains type: "scripts" and an attacker-controlled URL in scriptUrls, the sandbox page creates a classic <script src="..."> element and loads the supplied script.
In the intended plugin flow, this page runs inside an <iframe sandbox="allow-scripts"> without allow-same-origin, giving plugin code an opaque origin. However, if a victim opens the crafted sandbox URL directly, that iframe isolation is absent and the attacker-controlled script executes in the origin serving Altair, resulting in DOM-based cross-site scripting (XSS) / arbitrary JavaScript execution in the Altair hosting origin.
Exploitation requires the victim to open a crafted URL.
Details
The sandbox reads its configuration directly from window.location.search.
In packages/altair-iframe-sandbox/src/main.ts:
const searchParams = new URLSearchParams(window.location.search);
const sandboxType = searchParams.get('sandbox_type');
switch (sandboxType) {
case 'plugin':
handlePluginSandbox();
break;
}
handlePluginSandbox() then parses plugin_sandbox_opts:
const searchParams = new URLSearchParams(window.location.search);
const pluginSandboxOptsStr = searchParams.get('plugin_sandbox_opts');
const pluginSandboxOpts = pluginSandboxOptsStr
? (JSON.parse(pluginSandboxOptsStr) as PluginParentWorkerOptions)
: undefined;
The relevant validation only checks the plugin type:
if (pluginSandboxOpts.type !== 'scripts') {
throw new Error('Invalid plugin option type provided!');
}
Values from scriptUrls are then passed to injectScript():
if (pluginSandboxOpts.scriptUrls) {
for (const script of pluginSandboxOpts.scriptUrls) {
await injectScript(script);
}
}
The sink in packages/altair-core/src/utils/inject.ts is:
const script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
head.appendChild(script);
The intended parent flow relies on browser iframe sandboxing:
// NOTE: Don't add allow-same-origin to the sandbox attribute!
iframe.sandbox.add('allow-scripts');
Direct navigation to the sandbox URL does not have this parent iframe sandbox, so the injected script runs in the normal hosting origin.
The official middleware also clears CSP for paths identified as iframe-sandbox. This is not the root cause, but reduces the chance that a deployment-level CSP will block attacker-controlled external scripts when the default middleware behavior is used.
PoC
The following PoC is intentionally benign and demonstrates JavaScript execution in the Altair hosting origin.
- Create a local Altair deployment
mkdir altair-local-test
cd altair-local-test
npm init -y
npm i express@5.2.1 altair-express-middleware@8.5.7 graphql@17.0.2 graphql-http@1.23.0
Create server.js:
const express = require("express");
const { altairExpress } = require("altair-express-middleware");
const { createHandler } = require("graphql-http/lib/use/express");
const { buildSchema } = require("graphql");
const app = express();
const schema = buildSchema(`
type Query {
hello: String
}
`);
const root = {
hello: () => "world",
};
app.all(
"/api/graphql",
createHandler({
schema,
rootValue: root,
})
);
app.use(
"/graphql",
altairExpress({
endpointURL: "/api/graphql",
initialQuery: "{ hello }",
})
);
app.listen(4000, () => {
console.log("Altair UI: http://localhost:4000/graphql/");
console.log("Sandbox: http://localhost:4000/graphql/iframe-sandbox/");
});
Run:
node server.js
- Host a benign script
Host the following as poc.js on a domain you control:
document.body.textContent = "";
const h1 = document.createElement("h1");
h1.textContent = "Altair iframe-sandbox PoC";
const p = document.createElement("p");
p.textContent = "Script executed in: " +…
- Record
GHSA-752m-7p75-49gf- CVSS 3.1
- 6.1 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N - Weakness
- CWE-79, CWE-829
- Updated
- 2026-11-10
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
altair-staticnpm | 7.2.4 up to 8.5.8 | 8.5.8 |
altair-express-middlewarenpm | 7.2.4 up to 8.5.8 | 8.5.8 |
altair-koa-middlewarenpm | 7.2.4 up to 8.5.8 | 8.5.8 |
altair-fastify-pluginnpm | 7.2.4 up to 8.5.8 | 8.5.8 |
History
| Recorded | Changed | Sources |
|---|---|---|
| published | EUVD | |
| published | EUVD | |
| affected, references | OSV | |
| affected, facts, references | GitHub Advisories, NVD | |
| references | CVE List, EUVD, OSV | |
| aliases, references | NVD, OSV | |
| aliases, products, published | EUVD | |
| first indexed | CVE List |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-110802 is a medium vulnerability (CVSS 6.1) in Altair-graphql Altair, published November 5, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.22%, the 12th percentile. Fixed in altair-static 8.5.8.
References
github.com/altair-graphql/altair/security/advisories/GHSA-752m-7p75-49gf
github.com/altair-graphql/altair/commit/53a19183ce11ca147bb990c355e14ecb1dd7cd3e
github.com/altair-graphql/altair/commit/bdf422bdaaaf3186170ba7f22e22c259072133d9
github.com/altair-graphql/altair/releases/tag/v8.5.8
nvd.nist.gov/vuln/detail/CVE-2026-110802
github.com/advisories/GHSA-752m-7p75-49gf
github.com/CVEProject/cvelistV5/tree/main/cves/2026/110xxx/CVE-2026-110802.json
github.com/altair-graphql/altair
Left out here: the rest of 2 source descriptions. The JSON record has them.