CVE-2025-68458
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.
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
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 Low
CVSS: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 Low
CVSS: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:
http://127.0.0.1:[email protected]:9100/secret.js
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 Low
CVSS: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 Low
CVSS: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 Low
CVSS: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 Low
CVSS: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:
http://127.0.0.1:[email protected]:9100/secret.js
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 Low
CVSS: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 Low
CVSS: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
| Package | Affected | Fixed |
|---|---|---|
webpacknpm |
5.49.0 to 5.104.0 | 5.104.1 |
webpackTuxCare: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 |
webpackTuxCare: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 |
webpackTuxCare: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 |
webpackTuxCare: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 |
webpackTuxCare: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 |
webpackTuxCare: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 |
webpackTuxCare: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-webpackDebian: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 less5.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-webpackDebian: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 less5.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
| Package | Affected | Fixed |
|---|---|---|
node-webpackDebian: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 |
webpacknpm |
5.49.0 up to 5.104.1 | 5.104.1 |
node-webpackUbuntu:18.04:LTS |
All versions, plus listed versions 3.5.6-1build33.5.6-1build43.5.6-2 |
None known |
node-webpackUbuntu:20.04:LTS |
All versions, plus listed versions 4.7.0-34.30.0-74.30.0-9 |
None known |
node-webpackUbuntu:22.04:LTS |
All versions, plus listed versions 4.43.0-6build44.43.0-7 |
None known |
node-webpackUbuntu:24.04:LTS |
All versions, plus listed versions 5.76.1+dfsg1+~cs17.16.16-1 |
None known |
node-webpackUbuntu: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-webpackUbuntu: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-webpackUbuntu: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
| Recorded | Changed | Sources |
|---|---|---|
| affected, facts | ||
| first indexed | CVE 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
github.com/webpack/webpack/security/advisories/GHSA-8fgc-7cc6-rx7x
nvd.nist.gov/vuln/detail/CVE-2025-68458
github.com/advisories/GHSA-8fgc-7cc6-rx7x
github.com/CVEProject/cvelistV5/tree/main/cves/2025/68xxx/CVE-2025-68458.json
security-tracker.debian.org/tracker/CVE-2025-68458
github.com/webpack/webpack
ubuntu.com/security/CVE-2025-68458
cve.org/CVERecord?id=CVE-2025-68458
Left out here: the rest of 2 source descriptions. The JSON record has them.