Every CVE Search/ Get API key

CVE-2025-68458

webpack buildHttp: allowedUris allow-list bypass via URL userinfo (@) leading to build-time SSRF behavior

3.7 LowFix available

Webpack is a module bundler. From version 5.49.0 to before 5.104.1, when experiments.buildHttp is enabled, webpack’s HTTP(S) resolver (HttpUriPlugin) can be bypassed to fetch resources from hosts outside allowedUris by using crafted URLs that include userinfo (username:password@host). If allowedUris enforcement relies on a raw string prefix check (e.g., uri.startsWith(allowed)), a URL that looks allow-listed can pass validation while the actual network request is sent to a different authority/host after URL parsing. This is a policy/allow-list bypass that enables build-time SSRF behavior (outbound requests from the build machine to internal-only endpoints, depending on network access) and untrusted content inclusion (the fetched response is treated as module source and bundled). This issue has been patched in version 5.104.1.

Attack profile

How easy it is to exploit

Attack vector
Network
Complexity
High
Privileges needed
Low
User interaction
Required

What an attacker can affect

Confidentiality
Low
Integrity
Low
Availability
None

Exploit likelihood

0.23%Up 0.2 points since Feb 6, 2026
90%50%10%1%

What each source reports

CVE List Score used 3.7

webpack buildHttp: allowedUris allow-list bypass via URL userinfo (@) leading to build-time SSRF behavior

Webpack is a module bundler. From version 5.49.0 to before 5.104.1, when experiments.buildHttp is enabled, webpack’s HTTP(S) resolver (HttpUriPlugin) can be bypassed to fetch resources from hosts outside allowedUris by using crafted URLs that include userinfo (username:password@host). If allowedUris enforcement relies on a raw string prefix check (e.g., uri.startsWith(allowed)), a URL that looks allow-listed can pass validation while the actual network request is sent to a different authority/host after URL parsing. This is a policy/allow-list bypass that enables build-time SSRF behavior (outbound requests from the build machine to internal-only endpoints, depending on network access) and untrusted content inclusion (the fetched response is treated as module source and bundled). This issue has been patched in version 5.104.1.

Record
CVE-2025-68458
CVSS 3.1
3.7 LowCVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:N
Weakness
CWE-918
Updated
2026-11-02
EUVDEUVD-2025-206877 3.7

Webpack is a module bundler. From version 5.49.0 to before 5.104.1, when experiments.buildHttp is enabled, webpack’s HTTP(S) resolver (HttpUriPlugin) can be bypassed to fetch resources from hosts outside allowedUris by using crafted URLs that include userinfo (username:password@host). If allowedUris enforcement relies on a raw string prefix check (e.g., uri.startsWith(allowed)), a URL that looks allow-listed can pass validation while the actual network request is sent to a different authority/host after URL parsing. This is a policy/allow-list bypass that enables build-time SSRF behavior (outbound requests from the build machine to internal-only endpoints, depending on network access) and untrusted content inclusion (the fetched response is treated as module source and bundled). This issue has been patched in version 5.104.1.

Record
EUVD-2025-206877
CVSS 3.1
3.7 LowCVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:N
Updated
2026-11-02
GitHub AdvisoriesGHSA-8fgc-7cc6-rx7x 3.7

webpack buildHttp: allowedUris allow-list bypass via URL userinfo (@) leading to build-time SSRF behavior

Summary

When experiments.buildHttp is enabled, webpack’s HTTP(S) resolver (HttpUriPlugin) can be bypassed to fetch resources from hosts outside allowedUris by using crafted URLs that include userinfo (username:password@host). If allowedUris enforcement relies on a raw string prefix check (e.g., uri.startsWith(allowed)), a URL that looks allow-listed can pass validation while the actual network request is sent to a different authority/host after URL parsing. This is a policy/allow-list bypass that enables build-time SSRF behavior (outbound requests from the build machine to internal-only endpoints, depending on network access) and untrusted content inclusion (the fetched response is treated as module source and bundled). In my reproduction, the internal response was also persisted in the buildHttp cache.

Reproduced on:

  • webpack version: 5.104.0
  • Node version: v18.19.1

Details

Root cause (high level): allowedUris validation can be performed on the raw URI string, while the actual request destination is determined later by parsing the URL (e.g., new URL(uri)), which interprets the authority as the part after @.

Example crafted URL:

If the allow-list is ["http://127.0.0.1:9000"], then:

  • Raw string check:
    crafted.startsWith("http://127.0.0.1:9000") → true
  • URL parsing (WHAT new URL() will contact):
    origin → http://127.0.0.1:9100 (host/port after @)

As a result, webpack fetches http://127.0.0.1:9100/secret.js even though allowedUris only included http://127.0.0.1:9000.

Evidence from reproduction:

  • Server logs showed the internal-only endpoint being fetched:
    • [internal] 200 /secret.js served (...) (observed multiple times)
  • Attacker-side build output showed:
    • the internal secret marker was present in the bundle
    • the internal secret marker was present in the buildHttp cache

<img width="1651" height="381" alt="image-2" src="https://github.com/user-attachments/assets/8fd81b35-0d4f-424b-b60e-0a2582a8b492" />

PoC

This PoC is intentionally constrained to 127.0.0.1 (localhost-only “internal service”) to demonstrate SSRF behavior safely.

1) Setup

mkdir split-userinfo-poc && cd split-userinfo-poc
npm init -y
npm i -D webpack webpack-cli

2) Create server.js

#!/usr/bin/env node
"use strict";

const http = require("http");

const ALLOWED_PORT = 9000;   // allowlisted-looking host
const INTERNAL_PORT = 9100;  // actual target if bypass succeeds

const secret = `INTERNAL_ONLY_SECRET_${Math.random().toString(16).slice(2)}`;
const internalPayload =
  `// internal-only\n` +
  `export const secret = ${JSON.stringify(secret)};\n` +
  `export default "ok";\n`;

function listen(port, handler) {
  return new Promise(resolve => {
    const s = http.createServer(handler);
    s.listen(port, "127.0.0.1", () => resolve(s));
  });
}

(async () => {
  // "Allowed" host (should NOT be contacted if bypass works as intended)
  await listen(ALLOWED_PORT, (req, res) => {
    console.log(`[allowed-host] ${req.method} ${req.url} (should NOT be hit in userinfo bypass)`);
    res.statusCode = 200;
    res.setHeader("Content-Type", "application/javascript; charset=utf-8");
    res.end(`export default "ALLOWED_HOST_WAS_HIT_UNEXPECTEDLY";\n`);
  });

  // Internal-only service (SSRF-like target)
  await listen(INTERNAL_PORT, (req, res) => {
    if (req.url === "/secret.js") {
      console.log(`[internal] 200 /secret.js served (secret=${secret})`);
      res.statusCode = 200;
      res.setHeader("Content-Type", "application/javascript; charset=utf-8");
      res.end(internalPayload);
      return;
    }
    console.log(`[internal] 404 ${req.method} ${req.url}`);
    res.statusCode = 404;
    res.end("not found");
  });

  console.log("\nServers up:");
  console.log(`- allowed-host (should NOT be contacted):…
Record
GHSA-8fgc-7cc6-rx7x
CVSS 3.1
3.7 LowCVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:N
Weakness
CWE-918
Updated
2026-11-02
NVD 3.7

Webpack is a module bundler. From version 5.49.0 to before 5.104.1, when experiments.buildHttp is enabled, webpack’s HTTP(S) resolver (HttpUriPlugin) can be bypassed to fetch resources from hosts outside allowedUris by using crafted URLs that include userinfo (username:password@host). If allowedUris enforcement relies on a raw string prefix check (e.g., uri.startsWith(allowed)), a URL that looks allow-listed can pass validation while the actual network request is sent to a different authority/host after URL parsing. This is a policy/allow-list bypass that enables build-time SSRF behavior (outbound requests from the build machine to internal-only endpoints, depending on network access) and untrusted content inclusion (the fetched response is treated as module source and bundled). This issue has been patched in version 5.104.1.

Record
CVE-2025-68458
CVSS 3.1
3.7 LowCVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:N
Weakness
CWE-918
Updated
2026-11-02
OSV 3.7

webpack buildHttp: allowedUris allow-list bypass via URL userinfo (@) leading to build-time SSRF behavior

Webpack is a module bundler. From version 5.49.0 to before 5.104.1, when experiments.buildHttp is enabled, webpack’s HTTP(S) resolver (HttpUriPlugin) can be bypassed to fetch resources from hosts outside allowedUris by using crafted URLs that include userinfo (username:password@host). If allowedUris enforcement relies on a raw string prefix check (e.g., uri.startsWith(allowed)), a URL that looks allow-listed can pass validation while the actual network request is sent to a different authority/host after URL parsing. This is a policy/allow-list bypass that enables build-time SSRF behavior (outbound requests from the build machine to internal-only endpoints, depending on network access) and untrusted content inclusion (the fetched response is treated as module source and bundled). This issue has been patched in version 5.104.1.

Record
CVE-2025-68458
CVSS 3.1
3.7 LowCVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:N
Weakness
CWE-918
Updated
2026-11-02
OSVDEBIAN-CVE-2025-68458 3.7

Webpack is a module bundler. From version 5.49.0 to before 5.104.1, when experiments.buildHttp is enabled, webpack’s HTTP(S) resolver (HttpUriPlugin) can be bypassed to fetch resources from hosts outside allowedUris by using crafted URLs that include userinfo (username:password@host). If allowedUris enforcement relies on a raw string prefix check (e.g., uri.startsWith(allowed)), a URL that looks allow-listed can pass validation while the actual network request is sent to a different authority/host after URL parsing. This is a policy/allow-list bypass that enables build-time SSRF behavior (outbound requests from the build machine to internal-only endpoints, depending on network access) and untrusted content inclusion (the fetched response is treated as module source and bundled). This issue has been patched in version 5.104.1.

Record
DEBIAN-CVE-2025-68458
CVSS 3.1
3.7 LowCVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:N
Updated
2026-11-02
Show 9 moreShow less
OSVGHSA-8fgc-7cc6-rx7x 3.7

webpack buildHttp: allowedUris allow-list bypass via URL userinfo (@) leading to build-time SSRF behavior

Summary

When experiments.buildHttp is enabled, webpack’s HTTP(S) resolver (HttpUriPlugin) can be bypassed to fetch resources from hosts outside allowedUris by using crafted URLs that include userinfo (username:password@host). If allowedUris enforcement relies on a raw string prefix check (e.g., uri.startsWith(allowed)), a URL that looks allow-listed can pass validation while the actual network request is sent to a different authority/host after URL parsing. This is a policy/allow-list bypass that enables build-time SSRF behavior (outbound requests from the build machine to internal-only endpoints, depending on network access) and untrusted content inclusion (the fetched response is treated as module source and bundled). In my reproduction, the internal response was also persisted in the buildHttp cache.

Reproduced on:

  • webpack version: 5.104.0
  • Node version: v18.19.1

Details

Root cause (high level): allowedUris validation can be performed on the raw URI string, while the actual request destination is determined later by parsing the URL (e.g., new URL(uri)), which interprets the authority as the part after @.

Example crafted URL:

If the allow-list is ["http://127.0.0.1:9000"], then:

  • Raw string check:
    crafted.startsWith("http://127.0.0.1:9000") → true
  • URL parsing (WHAT new URL() will contact):
    origin → http://127.0.0.1:9100 (host/port after @)

As a result, webpack fetches http://127.0.0.1:9100/secret.js even though allowedUris only included http://127.0.0.1:9000.

Evidence from reproduction:

  • Server logs showed the internal-only endpoint being fetched:
    • [internal] 200 /secret.js served (...) (observed multiple times)
  • Attacker-side build output showed:
    • the internal secret marker was present in the bundle
    • the internal secret marker was present in the buildHttp cache

<img width="1651" height="381" alt="image-2" src="https://github.com/user-attachments/assets/8fd81b35-0d4f-424b-b60e-0a2582a8b492" />

PoC

This PoC is intentionally constrained to 127.0.0.1 (localhost-only “internal service”) to demonstrate SSRF behavior safely.

1) Setup

mkdir split-userinfo-poc && cd split-userinfo-poc
npm init -y
npm i -D webpack webpack-cli

2) Create server.js

#!/usr/bin/env node
"use strict";

const http = require("http");

const ALLOWED_PORT = 9000;   // allowlisted-looking host
const INTERNAL_PORT = 9100;  // actual target if bypass succeeds

const secret = `INTERNAL_ONLY_SECRET_${Math.random().toString(16).slice(2)}`;
const internalPayload =
  `// internal-only\n` +
  `export const secret = ${JSON.stringify(secret)};\n` +
  `export default "ok";\n`;

function listen(port, handler) {
  return new Promise(resolve => {
    const s = http.createServer(handler);
    s.listen(port, "127.0.0.1", () => resolve(s));
  });
}

(async () => {
  // "Allowed" host (should NOT be contacted if bypass works as intended)
  await listen(ALLOWED_PORT, (req, res) => {
    console.log(`[allowed-host] ${req.method} ${req.url} (should NOT be hit in userinfo bypass)`);
    res.statusCode = 200;
    res.setHeader("Content-Type", "application/javascript; charset=utf-8");
    res.end(`export default "ALLOWED_HOST_WAS_HIT_UNEXPECTEDLY";\n`);
  });

  // Internal-only service (SSRF-like target)
  await listen(INTERNAL_PORT, (req, res) => {
    if (req.url === "/secret.js") {
      console.log(`[internal] 200 /secret.js served (secret=${secret})`);
      res.statusCode = 200;
      res.setHeader("Content-Type", "application/javascript; charset=utf-8");
      res.end(internalPayload);
      return;
    }
    console.log(`[internal] 404 ${req.method} ${req.url}`);
    res.statusCode = 404;
    res.end("not found");
  });

  console.log("\nServers up:");
  console.log(`- allowed-host (should NOT be contacted):…
Record
GHSA-8fgc-7cc6-rx7x
CVSS 3.1
3.7 LowCVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:N
Weakness
CWE-918
Updated
2026-11-02
OSVUBUNTU-CVE-2025-68458 3.7

Webpack is a module bundler. From version 5.49.0 to before 5.104.1, when experiments.buildHttp is enabled, webpack’s HTTP(S) resolver (HttpUriPlugin) can be bypassed to fetch resources from hosts outside allowedUris by using crafted URLs that include userinfo (username:password@host). If allowedUris enforcement relies on a raw string prefix check (e.g., uri.startsWith(allowed)), a URL that looks allow-listed can pass validation while the actual network request is sent to a different authority/host after URL parsing. This is a policy/allow-list bypass that enables build-time SSRF behavior (outbound requests from the build machine to internal-only endpoints, depending on network access) and untrusted content inclusion (the fetched response is treated as module source and bundled). This issue has been patched in version 5.104.1.

Record
UBUNTU-CVE-2025-68458
CVSS 3.1
3.7 LowCVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:N
Updated
2026-11-02
OSVCLSA-2026-1772496681 No score

TuxCare security update for webpack (2 CVEs)

TuxCare rebuilt webpack to address 2 CVEs. Fixed in 5.94.0-tuxcare.3.

Record
CLSA-2026-1772496681
Updated
2026-11-02
OSVCLSA-2026-1775521839 No score

TuxCare security update for webpack (3 CVEs)

TuxCare rebuilt webpack to address 3 CVEs. Fixed in 5.88.2-tuxcare.1.

Record
CLSA-2026-1775521839
Updated
2026-11-02
OSVCLSA-2026-1776645368 No score

TuxCare security update for webpack (2 CVEs)

TuxCare rebuilt webpack to address 2 CVEs. Fixed in 5.76.1-tuxcare.5.

Record
CLSA-2026-1776645368
Updated
2026-11-02
OSVCLSA-2026-1790866203 No score

TuxCare security update for webpack (3 CVEs)

TuxCare rebuilt webpack to address 3 CVEs. Fixed in 5.82.1-tuxcare.1.

Record
CLSA-2026-1790866203
Updated
2026-11-02
OSVCLSA-2026-1792446138 No score

TuxCare security update for webpack (2 CVEs)

TuxCare rebuilt webpack to address 2 CVEs. Fixed in 5.99.8-tuxcare.1.

Record
CLSA-2026-1792446138
Updated
2026-11-02
OSVCLSA-2026-1792490709 No score

TuxCare security update for webpack (2 CVEs)

TuxCare rebuilt webpack to address 2 CVEs. Fixed in 5.99.9-tuxcare.1.

Record
CLSA-2026-1792490709
Updated
2026-11-02
OSVCLSA-2026-1792491756 No score

TuxCare security update for webpack (2 CVEs)

TuxCare rebuilt webpack to address 2 CVEs. Fixed in 5.98.0-tuxcare.1.

Record
CLSA-2026-1792491756
Updated
2026-11-02

Affected products

Affected packages

Affected packages
PackageAffectedFixed
webpack
npm
5.49.0 to 5.104.0
5.104.1
webpack
TuxCare:npm
From an advisory covering 2 CVEs
5.94.0-tuxcare.0 up to 5.94.0-tuxcare.3, plus listed versions
5.94.05.94.0-tuxcare.15.94.0-tuxcare.2
5.94.0-tuxcare.3
webpack
TuxCare:npm
From an advisory covering 3 CVEs
5.88.2-tuxcare.0 up to 5.88.2-tuxcare.1, plus listed versions
5.88.2
5.88.2-tuxcare.1
webpack
TuxCare:npm
From an advisory covering 2 CVEs
5.76.1-tuxcare.0 up to 5.76.1-tuxcare.5, plus listed versions
5.76.15.76.1-tuxcare.15.76.1-tuxcare.25.76.1-tuxcare.35.76.1-tuxcare.4
5.76.1-tuxcare.5
webpack
TuxCare:npm
From an advisory covering 3 CVEs
5.82.1-tuxcare.0 up to 5.82.1-tuxcare.1, plus listed versions
5.82.1
5.82.1-tuxcare.1
webpack
TuxCare:npm
From an advisory covering 2 CVEs
5.99.8-tuxcare.0 up to 5.99.8-tuxcare.1, plus listed versions
5.99.8
5.99.8-tuxcare.1
webpack
TuxCare:npm
From an advisory covering 2 CVEs
5.99.9-tuxcare.0 up to 5.99.9-tuxcare.1, plus listed versions
5.99.9
5.99.9-tuxcare.1
webpack
TuxCare:npm
From an advisory covering 2 CVEs
5.98.0-tuxcare.0 up to 5.98.0-tuxcare.1, plus listed versions
5.98.0
5.98.0-tuxcare.1
node-webpack
Debian:12
All versions, plus listed versions
5.105.4+dfsg1+~cs15.13.23-15.105.4+dfsg1+~cs15.13.23-25.105.4+dfsg1+~cs15.13.23-35.106.2+dfsg1+~cs15.15.23-15.106.2+dfsg1+~cs15.15.23-2
Show 20 moreShow less
5.106.2+dfsg1+~cs15.15.23-35.107.2+dfsg1+~cs15.16.25-15.107.2+dfsg1+~cs15.16.25-1.15.107.2+dfsg1+~cs15.16.25-25.108.0+dfsg1+~cs14.7.20-15.108.0+dfsg1+~cs14.7.20-25.108.0+dfsg1+~cs14.7.20-35.75.0+dfsg+~cs17.16.14-15.75.0+dfsg+~cs17.16.14-1+deb12u15.76.1+dfsg1+~cs17.16.16-15.76.1+dfsg2+~cs10.8.15-25.76.1+dfsg2+~cs10.8.15-35.94.0+dfsg1+~cs11.18.26-15.94.0+dfsg1+~cs11.18.26-25.95.0+dfsg1+~cs11.18.26-15.96.1+dfsg1+~cs11.18.26-15.97.1+dfsg1+~cs11.18.27-15.97.1+dfsg1+~cs11.18.27-25.97.1+dfsg1+~cs11.18.27-35.97.1+dfsg1+~cs11.18.27-4
None known
node-webpack
Debian:13
All versions, plus listed versions
5.105.4+dfsg1+~cs15.13.23-15.105.4+dfsg1+~cs15.13.23-25.105.4+dfsg1+~cs15.13.23-35.106.2+dfsg1+~cs15.15.23-15.106.2+dfsg1+~cs15.15.23-2
Show 9 moreShow less
5.106.2+dfsg1+~cs15.15.23-35.107.2+dfsg1+~cs15.16.25-15.107.2+dfsg1+~cs15.16.25-1.15.107.2+dfsg1+~cs15.16.25-25.108.0+dfsg1+~cs14.7.20-15.108.0+dfsg1+~cs14.7.20-25.108.0+dfsg1+~cs14.7.20-35.97.1+dfsg1+~cs11.18.27-35.97.1+dfsg1+~cs11.18.27-4
None known
Show 9 moreShow less
Affected packages
PackageAffectedFixed
node-webpack
Debian:14
before 5.105.4+dfsg1+~cs15.13.23-2, plus listed versions
5.105.4+dfsg1+~cs15.13.23-15.97.1+dfsg1+~cs11.18.27-35.97.1+dfsg1+~cs11.18.27-4
5.105.4+dfsg1+~cs15.13.23-2
webpack
npm
5.49.0 up to 5.104.1
5.104.1
node-webpack
Ubuntu:18.04:LTS
All versions, plus listed versions
3.5.6-1build33.5.6-1build43.5.6-2
None known
node-webpack
Ubuntu:20.04:LTS
All versions, plus listed versions
4.7.0-34.30.0-74.30.0-9
None known
node-webpack
Ubuntu:22.04:LTS
All versions, plus listed versions
4.43.0-6build44.43.0-7
None known
node-webpack
Ubuntu:24.04:LTS
All versions, plus listed versions
5.76.1+dfsg1+~cs17.16.16-1
None known
node-webpack
Ubuntu:25.10
All versions, plus listed versions
5.97.1+dfsg1+~cs11.18.27-25.97.1+dfsg1+~cs11.18.27-3
None known
node-webpack
Ubuntu:26.10
All versions, plus listed versions
5.105.4+dfsg1+~cs15.13.23-25.108.0+dfsg1+~cs14.7.20-2
None known
node-webpack
Ubuntu:26.04:LTS
All versions, plus listed versions
5.97.1+dfsg1+~cs11.18.27-35.97.1+dfsg1+~cs11.18.27-45.105.4+dfsg1+~cs15.13.23-2
None known

History

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

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

In short

CVE-2025-68458 is a low vulnerability (CVSS 3.7) in Webpack, published February 5, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.23%, the 13th percentile. Fixed in webpack 5.104.1.

References

This page doesn't list everything

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

MoveEnter Open