Introduction
In the gateway-workflow-dispatcher-v2.js component, a critical security issue was lurking in the dependency tree. The application relied on ip-address version 10.1.0, a popular npm package for parsing and validating IP addresses. However, this version contained CVE-2026-69192—a high-severity vulnerability where inconsistent IP address parsing could lead to Server-Side Request Forgery (SSRF) attacks and trust-boundary bypass. When your application validates IP addresses to control access to internal resources, a parsing inconsistency can be devastating: attackers can craft malicious IP strings that pass validation checks but resolve to unauthorized destinations.
This vulnerability was particularly concerning because gateway-workflow-dispatcher-v2.js handles routing and dispatch logic, where IP-based access controls are often critical. A single parsing flaw could allow an attacker to bypass allowlists, access internal APIs, or exfiltrate sensitive data from services that should be unreachable.
The Vulnerability Explained
CVE-2026-69192 exploits inconsistencies in how the ip-address library (version 10.1.0) parses and normalizes IP addresses. The vulnerability manifests when different parsing methods within the library produce different results for the same input string. This creates a classic Time-of-Check-Time-of-Use (TOCTOU) scenario: the IP address that gets validated is not the same as the IP address that gets used.
Here's how the attack works in the context of gateway-workflow-dispatcher-v2.js:
- Validation Phase: The application uses ip-address 10.1.0 to validate that a user-supplied IP address is not in the internal network range (e.g., not 127.0.0.1 or 10.0.0.0/8)
- Parsing Inconsistency: Due to the bug in ip-address 10.1.0, certain crafted IP strings pass validation but are later normalized to a different address
- Exploitation: The attacker crafts an IP like
127.0.0.1.example.comor uses IPv6 encoding tricks that parse differently in validation vs. actual use - SSRF Attack: The application makes an outbound request to what it believes is an external IP, but the request actually targets an internal service
Real-World Attack Scenario:
Imagine gateway-workflow-dispatcher-v2.js exposes an endpoint that fetches data from user-specified URLs after validating that the target IP is external:
// Vulnerable code pattern (conceptual)
const Address = require('ip-address').Address6;
function isInternalIP(ipString) {
const addr = new Address(ipString);
return addr.isLoopback() || addr.isPrivate();
}
app.post('/fetch-external-resource', async (req, res) => {
const targetIP = req.body.target_ip;
if (isInternalIP(targetIP)) {
return res.status(403).json({ error: 'Internal IPs not allowed' });
}
// Make request to targetIP
const data = await fetch(`http://${targetIP}/api/data`);
res.json(data);
});
With ip-address 10.1.0, an attacker could exploit parsing inconsistencies:
- Input:
0x7f.0.0.1(hexadecimal notation for 127.0.0.1) - Validation: Might parse as external due to inconsistent hex handling
- Actual use: Resolves to 127.0.0.1, accessing localhost
- Result: SSRF attack against internal services
The vulnerability was flagged by Trivy scanner with the rule CVE-2026-69192, confirming its presence in package-lock.json:
"node_modules/ip-address": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
"integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q=="
}
The Fix
The fix for CVE-2026-69192 was straightforward but critical: upgrade the ip-address dependency from version 10.1.0 to 10.3.1. This patched version implements consistent parsing logic across all IP address formats and notations.
Before (package-lock.json):
"node_modules/ip-address": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
"integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q=="
}
After (package-lock.json):
"node_modules/ip-address": {
"version": "10.3.1",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.3.1.tgz",
"integrity": "sha512-1e9d3kb97NHJTIJDZW9rKqW2h6+dFa50Dy0fpPSMQp2ADje5gvKsXmdiK6dwY5t76TaTt5+P5N1Y/LoToIxP6g=="
}
Additionally, the fix added an explicit override in package.json to ensure the patched version is used throughout the entire dependency tree:
package.json changes:
"overrides": {
"basic-ftp": "5.3.1",
"js-yaml": "4.3.1",
"ip-address": "10.3.1" // New override added
}
This override is crucial because ip-address might be a transitive dependency (required by other packages). Without the override, npm might still install the vulnerable 10.1.0 version for those sub-dependencies. The override ensures that every package in the dependency tree uses the secure 10.3.1 version.
How the Fix Solves the Problem:
The ip-address 10.3.1 release includes several security improvements:
- Consistent parsing: All IP address notations (decimal, hex, octal, IPv6) now parse consistently across different methods
- Stricter validation: Ambiguous or malformed IP strings that previously passed validation now correctly fail
- Normalized comparison: Internal normalization ensures that validation and usage operate on the same canonical representation
With these changes, the attack scenarios described earlier no longer work. An attacker attempting to use 0x7f.0.0.1 or similar tricks will find that the library consistently identifies it as 127.0.0.1 in both validation and usage contexts.
Prevention & Best Practices
To prevent SSRF vulnerabilities and dependency-related security issues in your Node.js applications:
1. Implement Defense in Depth for IP Validation
Don't rely solely on IP parsing libraries. Layer your defenses:
// Good: Multiple validation layers
function isSafeDestination(url) {
const parsed = new URL(url);
const hostname = parsed.hostname;
// Layer 1: Reject private IP ranges
if (isPrivateIP(hostname)) return false;
// Layer 2: Allowlist of permitted domains
if (!ALLOWED_DOMAINS.includes(parsed.hostname)) return false;
// Layer 3: DNS resolution check (resolve and validate again)
const resolvedIP = dns.resolve(hostname);
if (isPrivateIP(resolvedIP)) return false;
return true;
}
2. Use Dependency Scanning in CI/CD
Integrate tools like Trivy, Snyk, or npm audit into your continuous integration pipeline:
# Run before every deployment
npm audit --production
trivy fs --severity HIGH,CRITICAL .
3. Keep Dependencies Updated
Implement a regular dependency update schedule:
// Use exact versions for security-critical packages
{
"dependencies": {
"ip-address": "10.3.1" // Exact version, not ^10.3.1
}
}
4. Implement Network-Level Controls
Even with perfect application-level validation, add network segmentation:
- Use firewall rules to restrict outbound connections from application servers
- Implement egress filtering to block private IP ranges at the network level
- Use service meshes or proxies that enforce allowlists
5. Monitor for SSRF Attempts
Log and alert on suspicious patterns:
// Log all outbound requests with their origins
logger.info('Outbound request', {
destination: targetURL,
requestedBy: req.user.id,
sourceIP: req.ip,
timestamp: Date.now()
});
Security Standards References
- CWE-918: Server-Side Request Forgery (SSRF)
- OWASP Top 10 2021: A10:2021 – Server-Side Request Forgery (SSRF)
- OWASP SSRF Prevention Cheat Sheet: Comprehensive guide on preventing SSRF attacks
Key Takeaways
- CVE-2026-69192 in ip-address 10.1.0 allowed SSRF attacks through inconsistent IP parsing—always upgrade to 10.3.1 or later
- Package overrides in package.json are essential for ensuring transitive dependencies use patched versions throughout the entire dependency tree
- IP validation alone is insufficient if the parsing library has bugs; use defense in depth with multiple validation layers and network controls
- Gateway components like gateway-workflow-dispatcher-v2.js are high-value targets for SSRF attacks because they often handle routing and external requests
- Automated dependency scanning with tools like Trivy can detect vulnerable packages before they reach production
How Orbis AppSec Detected This
- Source: The ip-address library is used to parse and validate IP addresses from user-influenced input in gateway-workflow-dispatcher-v2.js
- Sink: Inconsistent parsing in ip-address 10.1.0 allows crafted IP strings to bypass validation checks, enabling SSRF attacks against internal services
- Missing control: The vulnerable version lacked consistent parsing logic across different IP notation formats (hex, octal, IPv6)
- CWE: CWE-918 (Server-Side Request Forgery)
- Fix: Upgraded ip-address from 10.1.0 to 10.3.1 and added package.json override to ensure the patched version is used throughout the dependency tree
Orbis AppSec automatically detected this vulnerability and opened a pull request with the fix. Try Orbis AppSec on your repositories to find and fix issues like this automatically.
Conclusion
CVE-2026-69192 demonstrates how a seemingly minor parsing inconsistency in a widely-used library can create serious security vulnerabilities. The upgrade from ip-address 10.1.0 to 10.3.1 in gateway-workflow-dispatcher-v2.js eliminates the SSRF risk by ensuring consistent IP address parsing across all contexts. This fix highlights the importance of maintaining up-to-date dependencies, implementing defense-in-depth strategies, and using automated tools to detect vulnerable packages before they can be exploited. Remember: in security, consistency matters—whether it's consistent parsing, consistent validation, or consistent monitoring of your dependency tree.