Repository navigation
chore(deps): update dependency ip-address to v10.5.1 [security] - #709
Merged
Merged
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #709 +/- ##
==========================================
Coverage 100.00% 100.00%
==========================================
Files 109 109
Lines 18485 18485
Branches 969 1581 +612
==========================================
Hits 18485 18485
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
wschurman
approved these changes
Sep 29, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
10.4.0→10.5.1ip-address: no classifier recognizes the NAT64 local-use range 64:ff9b:1::/48, allowing SSRF and trust-boundary bypass
CVE-2026-101910 / GHSA-2vr4-cq9g-pvrc
More information
Details
Summary
No classifier on
Address6recognizes the NAT64 local-use range64:ff9b:1::/48(RFC 8215).isPrivate(),isLoopback(),isLinkLocal()and their siblings all returnfalsefor every address in it, so an internal IPv4 destination written through a local-use NAT64 prefix (64:ff9b:1:7f00:0:100::for127.0.0.1,64:ff9b:1:a9fe:a9:fe00::for169.254.169.254) reads as an ordinary global address.getType()names the range'NAT64 (local-use)', so the library knows what the address is and classifies it as nothing.An application that builds a network trust-boundary decision on these checks (for example a filter intended to block Server-Side Request Forgery, or SSRF) will classify an internal target as external and allow the request. SSRF is an attack in which a user-supplied address coaxes the server into making a request to an internal destination the user could not otherwise reach, such as a loopback service or a cloud metadata endpoint.
Details
The fix for GHSA-22jq-vg5j-6vgg (10.2.1) classifies IPv4-mapped (
::ffff:0:0/96) and NAT64 well-known (64:ff9b::/96) addresses by their embedded IPv4 address:embeddedIPv4()insrc/ipv6.tsdecodes the trailing 32 bits and every special-use classifier delegates to the resultingAddress4. Those are the only two rangesembeddedIPv4()handles.The local-use range differs in kind from the well-known prefix, which is why extending the decoder does not fix it. RFC 8215 reserves
64:ff9b:1::/48so an operator can carve their own NAT64 prefix out of it, of any length RFC 6052 allows (/48,/56,/64, or/96). Where the IPv4 address sits depends on that choice:127.0.0.1is64:ff9b:1:7f00:0:100::under a/48prefix and64:ff9b:1::7f00:1under a/96prefix, and each of those decodes to a different address under the other prefix length. There is no single embedded IPv4 address for the library to classify by.What is well-defined is the range as a whole. The IANA IPv6 Special-Purpose Address Registry lists
64:ff9b:1::/48as not globally reachable, and Python'sipaddressmodule reportsis_privateasTrueandis_globalasFalsefor every address in it.isPrivate()covered ULA (fc00::/7) plus the decoded mapped and well-known cases, and nothing in the local-use range.Affected versions
>= 10.2.0, <= 10.5.0. Theis*classification API was extended toAddress6in 10.2.0; releases before it do not expose the method and are not affected through this vector.Impact
Every address in
64:ff9b:1::/48parses successfully,isValid()istrue, and no classifier catches it. Which internal target is reached depends on the NAT64 prefix deployed on the server's network; the well-known prefix column is the patched control from GHSA-22jq-vg5j-6vgg./48prefix)127.0.0.164:ff9b::7f00:164:ff9b:1:7f00:0:100::10.0.0.164:ff9b::a00:164:ff9b:1:a00:0:100::169.254.169.25464:ff9b::a9fe:a9fe64:ff9b:1:a9fe:a9:fe00::192.168.1.164:ff9b::c0a8:10164:ff9b:1:c0a8:1:100::Reachability
Reaching an internal host through one of these addresses requires that the server's network run a NAT64 translator on a prefix inside
64:ff9b:1::/48and that the attacker guess or know the prefix length. That is the same precondition the well-known prefix carries (a translator on64:ff9b::/96), with the additional constraint that the prefix is operator-chosen rather than fixed. The severity reflects that precondition.Proof of concept
npm i ip-address@10.5.0, then:On affected versions:
Remediation
Upgrade to the patched release. In the fix,
isPrivate()returnstruefor every address in64:ff9b:1::/48, alongside ULA and the decoded mapped and well-known cases. The range is reported private as a whole rather than by a decoded IPv4 address, for the reason given above;toAddress4Nat64(prefix)remains the way to decode an address under a known deployment prefix.isLoopback()andisLinkLocal()are unchanged for this range, since without the prefix length the library cannot know which IPv4 address is embedded.If you cannot upgrade immediately, test the range directly:
A note on SSRF defense
These methods are address classifiers, not a complete SSRF defense. Regardless of this fix, a robust SSRF guard must resolve the hostname and validate the resolved IP against the socket it connects to, and account for DNS rebinding and redirects. Treat these checks as one layer, not the only one.
Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:N/VA:N/SC:H/SI:N/SA:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Release Notes
beaugunderson/ip-address (ip-address)
v10.5.1Compare Source
v10.5.0Compare Source
What's Changed
Full Changelog: beaugunderson/ip-address@v10.4.0...v10.5.0
Configuration
📅 Schedule: (UTC)
🚦 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.
This PR was generated by Mend Renovate. View the repository job log.