Repository navigation
Release v3.1.0 - #187
Release v3.1.0#187
Conversation
|
Important Review skippedBot user detected. To trigger a single review, invoke the ⚙️ Run configuration
You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
No medium, high, or critical vulnerabilities in the v3.1.0 release diff.
Reviewed the rebuilt client (address parsing, resource encoding, NAT64 well-known-prefix checks, and dns.lookup host validation) and traced attacker-controlled handles and URIs through to fetch. Private literals, IPv4-mapped forms, 64:ff9b::/96 embeddings, and hosts-file loopback names stay blocked, and the new query encoding does not let the resource value change the request host or path.
No earlier security-review threads were open on this PR.
Sent by Cursor Automation: Find vulnerabilities
There was a problem hiding this comment.
One high-severity SSRF gap remains in the NAT64 blocklist shipped in this release build. The well-known prefix 64:ff9b::/96 is blocked, but the local-use prefix 64:ff9b:1::/48 is still fetched, including redirects to link-local metadata. No other medium-or-higher issues in the diff.
Sent by Cursor Automation: PR review - Find vulnerabilities
| const isWellKnownNat64 = ipv6[0] === 100 && ipv6[1] === 65435 && ipv6.slice(2, 6).every((group) => group === 0); | ||
| if (isMapped || isCompatible || isWellKnownNat64) { |
There was a problem hiding this comment.
High — SSRF via the local-use NAT64 prefix 64:ff9b:1::/48
isWellKnownNat64 is true only for 64:ff9b::/96 (hextets 2–5 all zero) and then reads the last 32 bits as IPv4. Addresses in 64:ff9b:1::/48 fail that test, and 0x0064 is not unique-local, link-local, or multicast, so isPrivateAddress returns false. lookup and redirect handling still call fetch.
RFC 6052 §3.1 forbids the well-known prefix from representing non-global IPv4. RFC 8215 reserves 64:ff9b:1::/48 for local translation (IANA: not globally reachable) and lists checksum-neutral prefixes inside it, including 64:ff9b:1:fffe::/96, whose last 32 bits are the IPv4 target. A /48 embedding does not put the IPv4 address in those last 32 bits at all.
Confirmed on this build with allow_private_addresses: false:
lookup('test@[64:ff9b:1:fffe::a9fe:a9fe]')requestshttps://[64:ff9b:1:fffe::a9fe:a9fe]/...(169.254.169.254)lookup('test@[64:ff9b:1:a00:0:100::]')requests that host (RFC 6052 /48 embedding of10.0.0.1)- a
302tohttp://[64:ff9b:1:fffe::a9fe:a9fe]/latest/meta-data/is followed
Impact: on a network that translates 64:ff9b:1::/48, a caller-supplied handle or a WebFinger redirect reaches private IPv4, including link-local cloud metadata. The same predicate is in webfinger.js, webfinger.cjs, and webfinger.min.js. Block the whole 64:ff9b:1::/48 prefix.


🚀 Automated Prepare Release v3.1.0
This PR contains the version bump for release v3.1.0.
✅ Release Steps Completed
✏️ Edit Release Notes
You can edit the release notes for this version in the file in this PR to curate the changelog before merging.
📋 Pending Steps (on PR merge)
🔗 Release Links
🚀 Generated with automated release workflow