Every CVESearch/Get API key

CVE-2026-110802

Altair: DOM-based XSS via attacker-controlled script URLs in the iframe sandbox

6.1 MediumFix available

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

0.22%Unchanged since Nov 6, 2026
90%50%10%1%

What each source reports

CVE List Score used6.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 MediumCVSS: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-1177946.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 MediumCVSS: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-49gf6.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.

  1. 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
  1. 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 MediumCVSS: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
NVD6.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 MediumCVSS: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
OSV6.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 MediumCVSS: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-49gf6.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.

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

Affected packages
PackageAffectedFixed
altair-static
npm
7.2.4 up to 8.5.8
8.5.8
altair-express-middleware
npm
7.2.4 up to 8.5.8
8.5.8
altair-koa-middleware
npm
7.2.4 up to 8.5.8
8.5.8
altair-fastify-plugin
npm
7.2.4 up to 8.5.8
8.5.8

History

History
RecordedChangedSources
publishedEUVD
publishedEUVD
affected, referencesOSV
affected, facts, referencesGitHub Advisories, NVD
referencesCVE List, EUVD, OSV
aliases, referencesNVD, OSV
aliases, products, publishedEUVD
first indexedCVE 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

This page doesn't list everything

Left out here: the rest of 2 source descriptions. The JSON record has them.

MoveEnter Open