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

CVE-2026-21887: Server-Side Request Forgery in OpenCTI Data Ingestion Component

Amit Schendel
Amit Schendel
Senior Security Researcher

Jun 22, 2026·7 min read·68 visits

Executive Summary (TL;DR)

A semi-blind Server-Side Request Forgery (SSRF) in OpenCTI allows authenticated low-privileged users to probe internal network services and query cloud metadata endpoints by supplying absolute URLs to the platform's feed ingestion engine.

A technical analysis of CVE-2026-21887, a Server-Side Request Forgery (SSRF) vulnerability in OpenCTI. The flaw occurs in the platform's data ingestion mechanism, which processes user-supplied feed URLs via Axios under a default configuration. Authenticated users with low privileges can exploit this to pivot into internal infrastructure, target metadata services, and scan private networks.

Vulnerability Overview

The OpenCTI platform relies on an ingestion engine to import external cyber threat intelligence knowledge. This ingestion framework supports various data schemas and delivery methods, such as TAXII streams, RSS updates, and structured CSV documents. Analysts use these feeds to synchronize indicators of compromise and observables directly into their central repository.

Because threat intelligence feeds are hosted on external infrastructures, the platform exposes an input surface allowing authorized users to register remote server URLs. Once registered, the backend scheduling engine periodically issues HTTP requests to pull the feeds. This mechanism creates an attack surface if input validation is missing, as the backend server acts as a proxy for any outbound HTTP communication initiated by users.

CVE-2026-21887 represents a classic Server-Side Request Forgery vulnerability where the platform fails to restrict or validate the target destination before sending the request. The application relies on the Axios library under its default settings to execute HTTP requests. This architecture allows low-privileged, authenticated users to abuse the system's role and manipulate outbound requests to target internal interfaces and local services.

Root Cause Analysis

The primary technical defect resides in the execution flow of the data ingestion scheduler. When processing ingestion configurations, the backend retrieves the user-configured URL string directly from the database and passes it to an Axios client instance. Axios is a promise-based HTTP client designed for Node.js applications that handles absolute and relative URLs dynamically.

Axios contains a design pattern where any parameter containing an absolute URI scheme (such as http:// or https://) overrides any configured baseURL. In OpenCTI's implementation, even if the Axios instance is constructed with restrictions, passing the user-defined absolute URL forces Axios to discard local constraints and target the supplied address directly. The application does not deploy a custom connection agent or an IP filter to screen resolving addresses.

This behavior is problematic when deploying applications within private cloud environments or isolated networks. Because the Node.js runtime executes with the host's networking permissions, Axios resolves and routes requests to loopback adapters, internal gateways, and cloud metadata services. The system does not implement a validation pass or custom DNS resolution checking before establishing the TCP connection socket.

Code Analysis & Patch Walkthrough

Prior to version 6.8.16, the data ingestion component implemented direct, unvalidated connections. The following simplified snippet illustrates the vulnerable implementation pattern inside the ingestion module:

// Vulnerable Implementation
async function fetchThreatFeed(userSuppliedUrl) {
  const config = {
    timeout: 10000,
    headers: { 'Accept': 'application/xml, application/json' }
  };
  // Axios resolves the absolute URL directly without validating the destination host
  const response = await axios.get(userSuppliedUrl, config);
  return response.data;
}

To remediate this issue, the maintainers integrated strict URL parsing and address verification. The patched version validates that the target host does not resolve to an IP address within private or loopback ranges before initiating the TCP handshake. The following code illustrates the safe implementation introduced in the patch:

// Patched Implementation with Safe Lookup Validation
const dns = require('dns');
const ipRangeCheck = require('ip-range-check');
 
const PRIVATE_RANGES = ['127.0.0.0/8', '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', '169.254.0.0/16'];
 
async function validateUrl(targetUrl) {
  const parsedUrl = new URL(targetUrl);
  const hostname = parsedUrl.hostname;
 
  return new Promise((resolve, reject) => {
    dns.lookup(hostname, (err, address) => {
      if (err) return reject(new Error('DNS resolution failed'));
      if (ipRangeCheck(address, PRIVATE_RANGES)) {
        return reject(new Error('Forbidden target: IP is within a private network range'));
      }
      resolve(address);
    });
  });
}

Although this validation pass reduces the attack surface, developers must ensure that the validation is not vulnerable to DNS rebinding. If the application resolves the DNS record once during validation, and then resolves it again during the actual HTTP request, an attacker can configure a malicious nameserver to return a public IP first and then a private IP. Implementing a pinned IP connection agent or using the validated IP directly in the Axios request is necessary to prevent DNS rebinding variants.

Exploitation Methodology & Threat Vectors

An attacker must obtain standard credentials with permissions to define or modify ingestion feeds to exploit this flaw. Once logged in, the attacker initiates a request to register a new threat feed, passing a target loopback or cloud metadata address as the source URI. For instance, to target the internal Redis or Elasticsearch instances within the container network, the attacker enters http://elasticsearch:9200/_cat/indices or http://127.0.0.1:6379/.

The diagram below outlines the communication flow during an exploitation attempt:

Because the ingestion worker expects a highly specific XML or JSON structure, querying generic internal services causes the parser to fail. The application logs the connection details or the parsing failure, exposing the internal service's presence and state to the attacker. This error channel enables port scanning and asset discovery across the private network, transforming the OpenCTI server into an internal network reconnaissance tool.

Impact & Post-Exploitation Assessment

The impact of CVE-2026-21887 is significant due to the role OpenCTI plays in security operations environments. By acting as a trusted node within a corporate network, the OpenCTI server often has direct network routes to critical assets like log management platforms, directories, and internal development tools. An attacker leverages this trusted path to bypass traditional perimeter firewalls and access unauthenticated internal APIs.

In cloud environments, the SSRF can lead to a full infrastructure takeover if the host can reach the Instance Metadata Service. On AWS, querying http://169.254.169.254/latest/meta-data/iam/security-credentials/ reveals the temporary access keys assigned to the server's IAM role. If the IAM role possesses write permissions over AWS resources, the attacker gains control over external infrastructure assets.

The CVSS v3.1 score is calculated at 7.7. The changed scope (S:C) reflects that the vulnerability allows the attacker to pivot from the application layer to the host's physical or virtual network, breaching the isolation boundaries of the platform. Since the attacker must be authenticated to access the ingestion configuration, the privilege requirement is set to Low, which moderates the score.

Remediation & Defense-in-Depth

The primary remediation path requires upgrading all OpenCTI components and associated client libraries, such as pycti, to version 6.8.16 or higher. The update replaces default HTTP clients with secure instances that restrict network resolution to public IP addresses. Organizations must verify that all worker nodes and backend API servers run the patched container images.

When patching is not immediately feasible, system administrators should deploy egress firewall policies on the OpenCTI host. In a Docker or Kubernetes environment, configure network policies to explicitly deny outgoing traffic to private subnets (RFC 1918) and the link-local address 169.254.169.254. This ensures that even if the application processes an arbitrary absolute URL, the underlying network layer blocks the connection.

Additionally, cloud engineers should configure metadata services to enforce version 2 tokens and restrict token hop limits. On AWS, setting the IMDSv2 Hop Limit to 1 prevents containerized workloads on a bridge network from accessing host metadata. This mitigation prevents credential extraction even if an application-layer SSRF vulnerability exists.

Official Patches

CiteumFix commit for SSRF in ingestion engine

Fix Analysis (1)

Technical Appendix

CVSS Score
7.7/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N
EPSS Probability
0.21%
Top 89% most exploited

Affected Systems

OpenCTI Platform Backendpycti Python Package

Affected Versions Detail

Product
Affected Versions
Fixed Version
OpenCTI
Citeum
< 6.8.166.8.16
pycti
Citeum
< 6.8.166.8.16
AttributeDetail
CWE IDCWE-918
Attack VectorNetwork
CVSS v3.1 Score7.7
EPSS Score0.00212 (0.21%)
ImpactSemi-Blind Server-Side Request Forgery
Exploit StatusNo Public Exploit Available
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1005Data from Local System
Collection
CWE-918
Server-Side Request Forgery (SSRF)

The web application fetches a remote resource without validating the user-supplied URL, allowing requests to be sent to arbitrary destinations, including internal systems.

Vulnerability Timeline

Vulnerability published and advisory GHSA-ffm6-vvph-g5f5 released
2026-03-12
OpenCTI version 6.8.16 released containing the security patch
2026-03-12
NVD catalogs CVE-2026-21887 with high severity (7.7)
2026-03-12

References & Sources

  • [1]GitHub Security Advisory GHSA-ffm6-vvph-g5f5
  • [2]NVD - CVE-2026-21887
  • [3]CVE.org - CVE-2026-21887
  • [4]PyPI Advisory PYSEC-2026-118
  • [5]OpenCTI Platform Repository
  • [6]OpenCTI Fix Commit 177a74f

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

•2 days ago•CVE-2026-58197
8.8

CVE-2026-58197: Host Escape and Lateral Movement via Insecure Container Network Defaults in ToolHive

A high-severity access control vulnerability in ToolHive CLI before v0.30.1 and ToolHive Studio before v0.38.0 allows local containerized MCP servers to bypass network isolation. This enables malicious workloads to establish TCP/IP connections to administrative and control plane endpoints exposed on the host loopback interface.

Amit Schendel
Amit Schendel
9 views•8 min read
•2 days ago•CVE-2026-63405
5.9

CVE-2026-63405: Insufficient Verification of Data Authenticity in AnyCable Pusher REST API

AnyCable is a real-time communication server. Prior to version 1.6.15, its Pusher-compatible REST API suffered from an authentication bypass vulnerability because it failed to verify that the request body matched the signature-validated body_md5 parameter. This allows attackers to perform replay attacks with modified body contents.

Amit Schendel
Amit Schendel
9 views•5 min read
•2 days ago•CVE-2026-64847
6.8

CVE-2026-64847: Indefinite Denial of Service via Undrained Stderr in AnyIO Process Pool Workers

A denial-of-service vulnerability exists in AnyIO prior to version 4.14.2. Standard error streams of process-pool workers are connected to an operating system pipe that is never drained by the parent process. This allows a worker to fill the pipe buffer and deadlock indefinitely.

Amit Schendel
Amit Schendel
11 views•6 min read
•2 days ago•CVE-2026-63349
7.0

CVE-2026-63349: Privilege Dropping Bypass and Denial of Service in AnyIO Subprocess Module

CVE-2026-63349 is a critical privilege-dropping bypass vulnerability in the AnyIO asynchronous framework (versions 4.14.0 and 4.14.1) on POSIX platforms. Due to a variable assignment typo, supplementary groups specified by the developer are not correctly propagated to the execution backend, resulting in subprocesses retaining the parent process's elevated supplementary group permissions.

Alon Barad
Alon Barad
18 views•5 min read
•2 days ago•CVE-2026-63406
5.9

CVE-2026-63406: Information Disclosure via Insecure Telemetry and Hardcoded Credentials in AnyCable-Go

CVE-2026-63406 is an information disclosure vulnerability in AnyCable-go prior to version 1.6.15. The built-in telemetry client is enabled by default with a hardcoded public authentication token ('secret'). This client digests highly sensitive configuration parameters and command-line arguments, including JWT secrets and RPC secrets, into a stable SHA-256 fingerprint. This fingerprint is sent over public networks, exposing those administrative secrets to offline dictionary and brute-force attacks if intercepted.

Alon Barad
Alon Barad
7 views•5 min read
•2 days ago•CVE-2026-84992
6.1

CVE-2026-84992: Cross-Site Scripting (XSS) via Fenced Code Block Parsing in md-editor-v3

CVE-2026-84992 is a Cross-Site Scripting (XSS) vulnerability affecting md-editor-v3 before version 6.5.4. It occurs because the fenced-code block language parser directly interpolates unescaped language metadata into unquoted HTML attributes inside the custom rendering callback. This bypasses the built-in XSSPlugin which runs during the parsing phase, before rendering.

Amit Schendel
Amit Schendel
11 views•6 min read