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-69198

CVE-2026-69198: Server-Side Request Forgery Bypass via CIDR Suffix in ip-address Library

Amit Schendel
Amit Schendel
Senior Security Researcher

Aug 4, 2026·6 min read·86 visits

Executive Summary (TL;DR)

A design flaw in the `ip-address` library's classification logic allows attackers to bypass SSRF filters. Adding a `/0` suffix short-circuits internal checks, making local/private IPs look public.

An input validation vulnerability in the npm package `ip-address` allows unauthenticated remote attackers to bypass Server-Side Request Forgery (SSRF) protections by appending a `/0` CIDR suffix to IP address strings. This causes the library's classification helper functions to incorrectly identify internal addresses as public, external addresses, while normalization helpers resolve the address back to its internal form during network connection establishment.

Vulnerability Overview

The npm library ip-address is a widely utilized package for parsing, validating, and manipulating IPv4 and IPv6 addresses within Node.js applications. A critical utility of such a library is providing trust-boundary checks, enabling developers to classify IP addresses into categories such as private, loopback, or link-local. These classifications are frequently used to enforce Server-Side Request Forgery (SSRF) defenses, blocking connections to internal networks.

The vulnerability designated as CVE-2026-69198 (GHSA-4xrf-jv44-h6hh) arises from a fundamental confusion between network containment semantics and host address classification. When parsing user-supplied IP addresses containing trailing CIDR suffixes, the library evaluates these addresses against reference internal ranges. Because of an incorrect short-circuit guard in the comparison logic, appending a /0 suffix causes the library to treat local and private addresses as external, while other methods still return the normalized, unmasked local address.

This flaw results in a complete bypass of security boundaries in applications that rely on isPrivate(), isLoopback(), or similar classification functions to restrict outgoing connections. Because the connection logic subsequently normalizes the address back to the actual local target, the application executes requests to internal hosts under the assumption that they are safe external targets.

Root Cause Analysis

The underlying flaw is located in the isInSubnet method, defined within the common codebase (src/common.ts). This method was designed to serve two distinct functions: validating whether a network range is fully enclosed by another subnet, and checking if an individual IP address matches a predefined classification range (such as RFC 1918 or Loopback blocks).

To determine containment, the library evaluates if the subnet mask of the current parsed IP is narrower than the reference range mask. It does so using the guard clause if (this.subnetMask < address.subnetMask) { return false; }. If an attacker inputs an IP address with a /0 prefix, such as 127.0.0.1/0, the parsed object is instantiated with a subnetMask property of 0.

When the application invokes a helper classifier like isLoopback(), the library compares the input instance to the static loopback subnet (e.g., 127.0.0.0/8 for IPv4). Inside isInSubnet, the evaluation is mapped as this.subnetMask < address.subnetMask, which evaluates to 0 < 8. Because this comparison is true, the method immediately returns false. This short-circuit bypasses the actual bitwise comparison of the IP address, leading the library to report that 127.0.0.1/0 is not a loopback address.

Code Analysis

A side-by-side analysis of the vulnerable and patched code reveals how the boundary checks were separated. In the vulnerable version of src/common.ts, the implementation of isInSubnet conflated host classification and network containment.

// Vulnerable Implementation in src/common.ts
export function isInSubnet(this: Address4 | Address6, address: Address4 | Address6) {
  // If the input address has a smaller mask (wider subnet) than the reference range,
  // it immediately returns false. This is incorrect for host classification.
  if (this.subnetMask < address.subnetMask) {
    return false;
  }
 
  if (this.mask(address.subnetMask) === address.mask()) {
    return true;
  }
 
  return false;
}

The patch merged in version 10.2.2 resolves this issue by introducing isHostInSubnet. This function evaluates only the host bits against the reference mask, intentionally ignoring the parsed address's own subnet mask property.

// Patched Implementation in src/common.ts
export function isInSubnet(this: Address4 | Address6, address: Address4 | Address6) {
  if (this.subnetMask < address.subnetMask) {
    return false;
  }
 
  return isHostInSubnet.call(this, address);
}
 
export function isHostInSubnet(this: Address4 | Address6, address: Address4 | Address6) {
  // Directly performs the mask comparison without evaluating the input's subnet mask
  return this.mask(address.subnetMask) === address.mask();
}

Additionally, the library's classifiers in src/ipv4.ts and src/ipv6.ts were refactored to consume isHostInSubnet instead of isInSubnet. This ensures that classification results remain consistent and are not influenced by the user-defined CIDR suffix.

Exploitation Methodology

An attacker targeting an SSRF protection filter can exploit this vulnerability by submitting a crafted IP string with a /0 suffix. The typical attack flow starts with the target application accepting user-supplied network input to perform an outbound request, validating the destination IP using the library's built-in checks prior to execution.

const { Address4 } = require('ip-address');
const axios = require('axios');
 
// Vulnerable application handler
async function fetchExternalResource(userInput) {
  const parsed = new Address4(userInput);
 
  // The filter attempts to block internal loopback/private destinations
  if (parsed.isPrivate() || parsed.isLoopback()) {
    throw new Error("Forbidden address");
  }
 
  // Normalization ignores the CIDR block, resolving the string to '127.0.0.1'
  const safeUrl = `http://${parsed.correctForm()}/endpoint`;
  return await axios.get(safeUrl);
}

If the attacker inputs 127.0.0.1/0, the security checks return false, allowing the execution to proceed. When the HTTP client establishes the connection, it connects directly to 127.0.0.1. The application makes the connection internally, bypassing the SSRF defense entirely.

Impact Assessment

The impact of CVE-2026-69198 is severe for applications that rely on the library to maintain trust boundaries. By bypassing the private and loopback filters, an unauthenticated attacker can force the backend application server to interact with arbitrary internal network services.

This enables attackers to access restricted internal endpoints, cloud metadata services (e.g., AWS IMDSv1/v2 at 169.254.169.254), internal databases, and administration consoles. In microservice architectures, this bypass allows complete lateral movement, potentially leading to unauthorized data exposure, configuration modification, or remote code execution via vulnerable internal APIs.

While the CVSS base score is 6.9, the impact on subsequent systems is high (SC:H). This indicates that although the host library itself does not suffer direct data modification or service interruption, the backend infrastructure exposed by the SSRF bypass faces severe confidentiality threats.

Remediation and Mitigation

The primary remediation path is upgrading the ip-address dependency to version 10.2.2 or later. This version correctly implements host classification and prevents CIDR suffixes from affecting loopback or private range checks.

For legacy deployments where immediate package upgrades are not feasible, developers must implement strict input sanitization. All user-supplied IP strings should be stripped of CIDR suffixes prior to parsing. This can be achieved using a regular expression to validate the absence of the / character, or by manually truncating the string at the first occurrence of the forward slash.

// Temporary Workaround: Strip CIDR suffix before parsing
function sanitizeIpInput(input) {
  const parts = input.split('/');
  return parts[0]; // Retains only the host portion
}

Additionally, security teams should audit internal codebases for direct calls to isInSubnet. If custom code calls isInSubnet directly to validate host containment against a private range, it must be migrated to isHostInSubnet to prevent similar bypass techniques.

Fix Analysis (1)

Technical Appendix

CVSS Score
6.9/ 10
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:N/VA:N/SC:H/SI:N/SA:N

Affected Systems

Node.js applications using `ip-address` version >= 10.1.1 and < 10.2.2 for input validation and SSRF defenses

Affected Versions Detail

Product
Affected Versions
Fixed Version
ip-address
beaugunderson
>= 10.1.1, < 10.2.210.2.2
AttributeDetail
CWE IDCWE-20, CWE-918
Attack VectorNetwork (AV:N)
CVSS Score6.9 (Medium)
Exploit StatusProof of Concept available
KEV StatusNot Listed
ImpactServer-Side Request Forgery Bypass

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1005Data from Local System
Collection
CWE-20
Improper Input Validation

The product receives input that is intended to be parsed or validated but lacks correct, comprehensive, or isolated validation checks, leading to a bypass of security controls.

Vulnerability Timeline

Official patch fix committed
2026-07-25
Library version 10.2.2 released
2026-07-25
GitHub Security Advisory GHSA-4xrf-jv44-h6hh published
2026-08-03
NVD details published for CVE-2026-69198
2026-08-03

References & Sources

  • [1]GitHub Security Advisory GHSA-4xrf-jv44-h6hh
  • [2]Fix Commit 488fe9bc7c35363b4b090494fc38c266d217740d
  • [3]GitHub Release v10.2.2

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

•about 1 hour ago•CVE-2026-107723
8.1

CVE-2026-107723: Silent Claim-Validator Bypass in NearForm fast-jwt via Array Payload Type Confusion

A high-severity type-confusion vulnerability exists in NearForm fast-jwt prior to version 6.3.0. The vulnerability allows attackers to bypass crucial claim validation steps (such as expiration, issuer, audience, and subject validations) by presenting a validly signed JSON Web Token structured as a JSON array instead of a JSON object. This occurs because the library's decoder fails to reject JSON arrays during type evaluation.

Alon Barad
Alon Barad
5 views•6 min read
•about 2 hours ago•CVE-2026-107721
5.9

CVE-2026-107721: Time Validation Bypass in NearForm fast-jwt due to Loose Temporal Option Validation

NearForm fast-jwt prior to version 6.3.0 is vulnerable to an input validation flaw where configuring verifier properties (such as clockTolerance, clockTimestamp, and cacheTTL) with non-finite values like Infinity or NaN allows attackers to bypass temporal claim validations, including expiration (exp) and activation (nbf) boundaries. This validation bypass can result in unauthorized session persistence and cache poisoning.

Amit Schendel
Amit Schendel
5 views•6 min read
•about 3 hours ago•CVE-2026-107722
9.8

CVE-2026-107722: Algorithm Confusion via Non-Whitespace Prefix Bypass in fast-jwt

A critical cryptographic vulnerability in fast-jwt versions 6.2.x prior to 6.3.0 allows unauthenticated remote attackers to execute an asymmetric-to-symmetric algorithm confusion attack due to incomplete validation of leading non-whitespace prefixes.

Amit Schendel
Amit Schendel
4 views•5 min read
•about 4 hours ago•CVE-2026-107720
7.4

CVE-2026-107720: Signature Verification Bypass in NearForm fast-jwt

CVE-2026-107720 is a critical signature verification bypass vulnerability in NearForm's fast-jwt Node.js library. Under specific configurations where the token verifier is initialized with a falsy cryptographic key (such as an empty string or null) and a non-empty algorithms allowlist, the library erroneously skips signature validation. This allows unauthenticated remote attackers to submit fabricated, unsigned JSON Web Tokens and bypass the authorization boundary of the application entirely.

Amit Schendel
Amit Schendel
7 views•7 min read
•about 5 hours ago•CVE-2026-107715
6.8

CVE-2026-107715: Information Disclosure and Credential Leakage in Ruby Mechanize via Cross-Origin Redirections

Ruby Mechanize prior to version 2.14.1 contains an information disclosure vulnerability. When executing cross-origin HTTP redirects, global headers configured on the Mechanize agent (such as Authorization or Session Cookies) are dynamically re-applied to the subsequent request, bypassing the internal header-stripping logic. An attacker who controls a redirection endpoint can capture sensitive bearer tokens or cookies.

Alon Barad
Alon Barad
7 views•7 min read
•about 6 hours ago•CVE-2026-107399
6.8

CVE-2026-107399: Information Disclosure via HTML Meta-Refresh in Ruby Mechanize

An origin trust boundary failure in the Ruby mechanize library (prior to v2.14.1) allows unauthenticated remote web servers to harvest sensitive global request headers, such as Authorization Bearer tokens and cookies, by utilizing HTML-level meta-refresh redirection tags. Standard HTTP-level redirect boundaries were not applied to document-level redirects, creating a vector for cross-origin credential leakage during automated crawls.

Amit Schendel
Amit Schendel
5 views•5 min read