CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-101913

CVE-2026-101913: Link-Local Address Validation Bypass in ip-address Library Enables SSRF

Alon Barad
Alon Barad
Software Engineer

Sep 29, 2026·6 min read·22 visits

Executive Summary (TL;DR)

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.

Vulnerability Overview

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.

Root Cause Analysis

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.

Code Analysis

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.

Exploitation Methodology

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:

Security Impact Assessment

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).

Remediation and Hardening

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.1

If 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.

Technical Appendix

CVSS Score
6.3/ 10

Affected Systems

Applications utilizing the JavaScript/TypeScript 'ip-address' package for security validation.
AttributeDetail
CWE IDCWE-697, CWE-918
Attack VectorNetwork (Unauthenticated)
CVSS v4.06.3 (Medium)
EPSS StatusNot yet listed
ImpactBypass of SSRF network boundary controls
Exploit StatusNo active wild exploitation tracked
KEV StatusNot listed

References & Sources

  • [1]NVD Detail Page
  • [2]CVE.org Record
  • [3]GitHub Security Advisory
  • [4]Release Page (v10.5.1)

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•39 minutes ago•CVE-2026-126084
4.7

CVE-2026-126084: Unsigned Content-Type in Rails Active Storage GCS Direct Uploads

A vulnerability classified under CWE-345 (Insufficient Verification of Data Authenticity) exists in the Active Storage component of Ruby on Rails prior to versions 8.1.4.1 and 8.0.5.2. When Google Cloud Storage (GCS) is configured as the storage backend with the cache_control option enabled, Active Storage switches from GCS V2 signing to V4 signing for direct upload URLs. Because the V4 signing implementation only binds the Cache-Control and Host headers, the Content-Type and Content-MD5 headers remain unsigned. An attacker can modify the Content-Type header during a direct upload request to store HTML or SVG files with active JavaScript on the GCS bucket origin, enabling Service Worker registration and interception of subsequent signed URL responses within the bucket path.

Amit Schendel
Amit Schendel
1 views•9 min read
•about 2 hours ago•CVE-2026-126079
6.1

CVE-2026-126079: Cross-Site Scripting in Ruby on Rails Action View Text Helpers via HTML5 Serialization Desynchronization

A Cross-Site Scripting (XSS) vulnerability exists in Ruby on Rails Action View prior to versions 8.0.5.2 and 8.1.4.1. When applications use the default HTML5 sanitizer (Rails::HTML5::Sanitizer) with Nokogiri versions prior to 1.19.5, angle brackets (< and >) inside HTML attribute values are serialized unescaped. Action View text helpers—specifically highlight and simple_format—perform string-based manipulations on the sanitized HTML rather than operating on the DOM tree. An unescaped '>' character or a double newline ('\n\n') inside an attribute value causes these helpers to misidentify tag or paragraph boundaries, breaking out of the attribute context and emitting inert attribute contents as live HTML elements in the final html_safe output.

Amit Schendel
Amit Schendel
2 views•10 min read
•about 3 hours ago•CVE-2026-126070
6.1

CVE-2026-126070: Cross-Site Scripting in Ruby on Rails Action View strip_tags Helper

CVE-2026-126070 is a Cross-Site Scripting (XSS) vulnerability in the Action View component of Ruby on Rails. Prior to versions 8.0.5.2 and 8.1.4.1, the strip_tags helper returned sanitized output marked as html_safe without encoding single or double quotation marks. When applications render the output of strip_tags inside quoted HTML attributes in ERB templates, attackers can break out of the attribute context and inject arbitrary HTML attributes or JavaScript event handlers.

Amit Schendel
Amit Schendel
3 views•10 min read
•about 4 hours ago•CVE-2026-126078
6.1

CVE-2026-126078: Cross-Site Scripting in Ruby on Rails Action View highlight Helper

CVE-2026-126078 is a Cross-Site Scripting (XSS) vulnerability classified under CWE-79 affecting the Action View component of Ruby on Rails in versions prior to 8.0.5.2 and 8.1.4.1. The vulnerability resides in the ActionView::Helpers::TextHelper#highlight method when invoked with a custom :highlighter template that places capture group placeholders inside HTML attribute values. Because matched substrings are substituted without HTML escaping after initial sanitization preserves literal quotation marks, an attacker controlling the input text or target search phrase can break out of the surrounding attribute delimiter and inject arbitrary HTML attributes or JavaScript event handlers.

Amit Schendel
Amit Schendel
3 views•9 min read
•about 5 hours ago•CVE-2026-126077
6.8

CVE-2026-126077: Session Information Leak in Ruby on Rails Action Pack and Active Storage Proxy Mode

An information exposure vulnerability in Ruby on Rails Action Pack allows sensitive session cookies to be attached to public, cacheable responses served by Active Storage proxy controllers. When cookie secret rotation or a hybrid cookie serializer migration is enabled, reading a legacy-format cookie triggers an automatic cookie rewrite that ignores the session-skipping directive. If an intermediate shared cache or CDN caches the resulting response along with its Set-Cookie header, subsequent users requesting the same URL receive the leaked session token.

Amit Schendel
Amit Schendel
3 views•11 min read
•about 6 hours ago•CVE-2026-126072
5.9

CVE-2026-126072: Thread Deadlock and Denial of Service in Ruby on Rails ActionController::Live

CVE-2026-126072 (GHSA-rwvh-fw6r-pwvp) is a concurrency deadlock vulnerability in the Ruby on Rails Action Pack framework affecting applications that utilize ActionController::Live response streaming. The defect occurs due to improper synchronization within ActionController::Live::Buffer when handling full bounded queues during stream closure and connection abortion. An unauthenticated remote attacker can trigger this condition by stalling TCP socket reads on streaming endpoints—including Active Storage proxy mode—resulting in permanent worker thread exhaustion and application-wide denial of service.

Amit Schendel
Amit Schendel
3 views•10 min read