Sep 29, 2026·6 min read·3 visits
A logic bug in the ip-address library (< 10.5.1) causes isLinkLocal() to fail to identify valid link-local IPv6 addresses outside the fe80::/64 subnet, enabling SSRF bypasses.
A validation bypass exists in the ip-address library prior to version 10.5.1. The Address6.isLinkLocal() method inaccurately restricted link-local classifications to the fe80::/64 subnet, failing to cover the complete RFC 4291 fe80::/10 allocation. This allows attackers to bypass SSRF filters relying on this library to safeguard local network boundaries.
The ip-address npm package is a widely utilized utility library in JavaScript and TypeScript environments for parsing, validating, and manipulating IPv4 and IPv6 network addresses. Applications frequently employ this library within input validation pipelines and security boundary checks to prevent Server-Side Request Forgery (SSRF) and to restrict outbound connections to designated safe ranges.
This vulnerability, tracked as CVE-2026-101913, stems from an incorrect classification logic in the library's link-local check. It is categorized under CWE-697 (Incorrect Comparison) and can lead directly to CWE-918 (Server-Side Request Forgery).
The attack surface exists anywhere user-controlled input is parsed by Address6 and filtered using the isLinkLocal() method before initiating outbound server requests. Because the library fails to identify certain valid link-local addresses, security filters are bypassed, exposing local physical or virtual networks to unauthorized access.
According to RFC 4291 §2.4, the prefix fe80::/10 is reserved globally for IPv6 link-local unicast communications. This allocation spans a broad range of addresses from fe80:: to febf::, requiring only the first 10 bits of the address structure to match the binary sequence 1111 1110 10. Operating systems, network cards, and routing frameworks natively recognize the entire /10 subnet as link-local.
In versions of the ip-address library prior to version 10.5.1, the validation logic in Address6.isLinkLocal() was restricted to a static, hardcoded comparison against a 64-bit binary literal string. This comparison enforced that bits 10 through 63 must be strictly set to zero, matching only the fe80::/64 prefix commonly utilized by Stateless Address Autoconfiguration (SLAAC).
This narrow evaluation introduced a logical discrepancy between the library's validation and the system's underlying routing engine. When an input address like fe81::1 or fe80:0:0:1::1 was parsed, isLinkLocal() returned false. However, the host operating system's networking stack resolved and routed the subsequent outbound packets to adjacent hosts on the local link, creating a complete security boundary bypass.
To understand the exact programmatic mistake, let us analyze the code transition in src/ipv6.ts that occurred in version 10.5.1. The old code utilized a strict string check that was highly brittle and did not scale to proper subnet masking.
Here is the comparison between the vulnerable and patched code paths:
// VULNERABLE CODE - ip-address <= 10.5.0
isLinkLocal(): boolean {
if (this.is4()) {
const embedded = this.embeddedIPv4();
if (embedded) {
return embedded.isLinkLocal();
}
}
// Zeroes are required, i.e. we can't check isHostInSubnet with 'fe80::/10'
if (
this.getBitsBase2(0, 64) ===
'1111111010000000000000000000000000000000000000000000000000000000'
) {
return true;
}
return false;
}// PATCHED CODE - ip-address >= 10.5.1
isLinkLocal(): boolean {
if (this.is4()) {
const embedded = this.embeddedIPv4();
if (embedded) {
return embedded.isLinkLocal();
}
}
// Delegation to the proper subnet validation engine using the correct /10 definition
return this.isHostInSubnet(LINK_LOCAL_SUBNET);
}In the patched version, the developer registered LINK_LOCAL_SUBNET as a static Address6 instance containing 'fe80::/10'. By delegating the evaluation to the existing isHostInSubnet() mechanism, the library correctly evaluates the first 10 bits and ignores any variations in the subsequent bits, resolving the logical error.
Exploiting this validation flaw requires minimal effort and is highly reliable since the vulnerability depends solely on logical comparison differences between the application and the network layer. The prerequisites are an unauthenticated input interface that executes HTTP requests or TCP connections and validates the destination using ip-address.
The exploit flow starts with the attacker generating a target address that resides within the fe80::/10 range but outside the fe80::/64 boundary. An example of such an address is fe80:0:0:1::1 or fe81::1. The attacker supplies this IP inside a payload to the vulnerable endpoint (e.g., http://[fe81::1]/status).
When the endpoint parses the input, the validation wrapper invokes isLinkLocal(), which returns false due to the logical limitation. The security check is bypassed, and the HTTP client executes the request. The underlying system socket routes the packet to the local interface, establishing a connection with adjacent administrative interfaces or services on the local link.
Here is a visual representation of the attack execution path:
The primary risk associated with this vulnerability is unauthenticated Server-Side Request Forgery (SSRF). Attackers can leverage the bypass to reach adjacent internal systems, local administrative interfaces, and local hypervisor metadata endpoints that are typically restricted from external network access.
While the scope of the attack is constrained to link-local adjacent assets, the information leakage can be severe if local systems trust adjacent nodes without authentication. This vulnerability allows port scanning of the local link, interaction with adjacent system services, and potential extraction of configuration data.
The vulnerability is assessed with a CVSS v4.0 base score of 6.3 (Medium). The score reflects a Network-based, Low complexity attack vector that requires no privileges or user interaction, but results in Low confidentiality impact on both the vulnerable system and subsequent systems (VC:L, SC:L).
The recommended remediation is to upgrade the ip-address dependency to version 10.5.1 or higher. This update replaces the flawed comparison logic with robust subnet-mask evaluations for the complete fe80::/10 range.
npm install ip-address@10.5.1If immediate package upgrade is impossible, developers can mitigate the flaw by implementing a manual prefix check. The application should reject any IPv6 address where the first 10 bits in binary translate to 1111111010 (corresponding to the fe80::/10 space).
Additionally, applications should adopt defensive-in-depth principles. This includes pinning the IP address resolved from DNS immediately, enforcing zero-trust egress rules at the network layer, and restricting local link-local routing rules for application host systems.
| Attribute | Detail |
|---|---|
| CWE ID | CWE-697, CWE-918 |
| Attack Vector | Network (Unauthenticated) |
| CVSS v4.0 | 6.3 (Medium) |
| EPSS Status | Not yet listed |
| Impact | Bypass of SSRF network boundary controls |
| Exploit Status | No active wild exploitation tracked |
| KEV Status | Not listed |
A high-severity Cross-Site Scripting (XSS) vulnerability in Angular server-side rendering (SSR) component allows unauthenticated attackers to execute arbitrary client-side JavaScript. The flaw is caused by a parsing discrepancy between the server-side DOM emulator, Domino, and standard client-side browser HTML5 parsers. When serializing ProcessingInstruction nodes inside raw-content fallback elements, Domino fails to escape matching ancestor closing tags, causing the client-side parser to transition out of raw-text mode prematurely and execute subsequent sibling elements as active HTML.
A validation bypass vulnerability exists in the npm package `ip-address` from version 10.2.0 to 10.5.1. The library's `Address6.isPrivate()` classifier fails to recognize the NAT64 local-use prefix range 64:ff9b:1::/48 as a restricted, private subnet. In networks implementing NAT64 routing configurations, an attacker can exploit this flaw to execute Server-Side Request Forgery (SSRF) and bypass local trust-boundary validations.
An interpretation conflict in the fast-uri library allows unauthenticated remote attackers to bypass Server-Side Request Forgery filters due to inconsistent handling of malformed bracket notation in hostnames.
An authority injection vulnerability exists in the serialization components of fast-uri (versions before 2.4.6, 3.1.7, and 4.1.4) where unvalidated port components can contain authority delimiters (such as '@'). This results in host demotion to userinfo, redirection of traffic to an arbitrary attacker-controlled host, and downstream Server-Side Request Forgery (SSRF) without causing parser errors in standard clients.
CVE-2026-87859 is a medium-severity log injection vulnerability in the Node.js morgan HTTP request logger middleware. Prior to version 1.12.1, the internal sanitization utility fails to escape double-quote characters within logged fields, enabling unauthenticated remote attackers to inject arbitrary text, close log fields early, and spoof critical metadata in downstream log parsers.
An uncontrolled resource consumption vulnerability exists in the multer middleware for Node.js (versions 2.2.0 through 2.3.0) when handling aborted multipart uploads using disk storage. Due to an asynchronous race condition in path resolution, files can become permanently orphaned on disk, leading to storage exhaustion and denial of service.