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

CVE-2026-61612: Server-Side Request Forgery Bypass via DNS Resolution in CKAN MCP Server

Alon Barad
Alon Barad
Software Engineer

Sep 22, 2026·7 min read·37 visits

Executive Summary (TL;DR)

A Server-Side Request Forgery (SSRF) vulnerability in @aborruso/ckan-mcp-server before v0.4.108 allows low-privilege remote attackers to query local or internal network endpoints, including AWS IMDS, by passing domains that resolve to restricted IPs, bypassing the string-only validation checks.

An input validation bypass in the CKAN MCP Server (NPM package @aborruso/ckan-mcp-server) prior to version 0.4.108 allows remote attackers to perform Server-Side Request Forgery (SSRF). The application's server URL validation mechanism checked hostnames only as literal strings without performing pre-connection DNS resolution. An attacker can bypass these checks using hostnames that resolve to loopback, private, or link-local IP addresses, including the AWS Instance Metadata Service (IMDS). This is the third documented bypass of this protection mechanism, succeeding previous incomplete mitigations in CVE-2026-33060 and CVE-2026-53509.

Vulnerability Overview

The CKAN MCP Server is designed as a Model Context Protocol (MCP) server used to query and integrate public data portals configured with the CKAN open-source data management system. Organizations run this server to expose API interaction endpoints for Large Language Model (LLM) agents and orchestration engines. To handle queries dynamically, the application requires the capability to issue outbound HTTP requests to targeted CKAN platforms utilizing parameters supplied by the client.

To restrict the outbound surface to public endpoints and prevent exploitation, the developers implemented an endpoint validation mechanism. This validation routine, known as validateServerUrl, is intended to enforce a boundary that blocks requests directed toward local, loopback, and private network addresses.

However, because the check was implemented strictly at the string level, it failed to account for domain names that resolve to local interfaces. This structural omission exposed a direct path for Server-Side Request Forgery (SSRF), designated as CWE-918. Attackers can exploit this path to target cloud metadata services and internal diagnostic interfaces that are inaccessible from the open internet.

Root Cause Analysis

The core technical flaw lies in the sequence of validation and connection within the network logic of src/utils/http.ts. The implementation of the validation function relied on processing string-based hostname literals extracted from user-supplied URLs.

The routine checked if the hostname matched forbidden string arrays (e.g., 'localhost') or private IPv4 address patterns via a basic dotted-decimal regular expression: /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/. If the input value did not match these specific configurations, the validation was bypassed and marked safe. The subsequent execution path then passed the unchecked string directly to standard client libraries like axios or Node's fetch API.

Because the verification process omitted programmatic DNS resolution, any hostname containing alphanumeric characters would pass the regular expression test. For example, the domain name 127.0.0.1.nip.io was parsed as a valid remote hostname because it is not literally equal to 'localhost' and fails to match the strict dotted-decimal format. During the HTTP client connection sequence, the system's underlying resolver mapped this host to the loopback IP (127.0.0.1), allowing an attacker to reach internal-only ports.

This vulnerability represents a Time-of-Check to Time-of-Use (TOCTOU) structural flaw. Because domain name checking occurred without querying actual target resolutions, DNS Rebinding and wildcard resolution techniques bypassed the logical security checks entirely.

Code Analysis of the Vulnerability and Fix

Prior to the release of version 0.4.108, the code lacked any dynamic DNS validation layer. The fixed version introduced a structural remediation by introducing safe lookup hooks inside the HTTP client configurations.

The remediation establishes a unified validator function isBlockedIp to check both IPv4 and IPv6 target strings:

export function isBlockedIp(ip: string): boolean {
  const v = ip.toLowerCase().trim();
  if (v.includes(':')) {
    if (v === '::1' || v === '::') return true;
    if (v.startsWith('fc') || v.startsWith('fd')) return true;
    if (v.startsWith('fe80')) return true;
    if (v.startsWith('::ffff:')) return true;
    return false;
  }
  const m = v.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
  if (!m) return false;
  const o1 = Number(m[1]);
  const o2 = Number(m[2]);
  return (
    o1 === 0 ||
    o1 === 10 ||
    o1 === 127 ||
    (o1 === 100 && o2 >= 64 && o2 <= 127) ||
    (o1 === 169 && o2 === 254) ||
    (o1 === 172 && o2 >= 16 && o2 <= 31) ||
    (o1 === 192 && o2 === 168) ||
    o1 === 255
  );
}

To safeguard connections established via HTTP libraries, the patch implements a custom dns lookup function createSsrfSafeLookup. This component resolves the host dynamically and validates each resolved address prior to allowing the TCP handshake to occur:

export function createSsrfSafeLookup(dnsModule: DnsLookupModule) {
  return function ssrfSafeLookup(hostname: string, options: any, callback: any): void {
    if (typeof options === 'function') {
      callback = options;
      options = {};
    }
    const family = options && typeof options === 'object' ? options.family : undefined;
    dnsModule.lookup(hostname, { all: true, family: family || 0 }, (err, addresses) => {
      if (err) {
        callback(err);
        return;
      }
      const list = Array.isArray(addresses) ? addresses : [addresses as ResolvedAddress];
      for (const a of list) {
        if (isBlockedIp(a.address)) {
          callback(new Error(
            `Access to private/internal IP addresses is not allowed ("${hostname}" resolves to ${a.address}).`
          ));
          return;
        }
      }
      if (options && options.all) {
        callback(null, list);
        return;
      }
      callback(null, list[0].address, list[0].family);
    });
  };
}

Additionally, direct fetch operations (such as SPARQL tooling queries) now execute assertHostnameResolvesSafe prior to initializing the HTTP protocol phase, forcing validation of the actual resolved IP addresses. The mitigation of TOCTOU DNS hazards is accomplished by pinning target addresses.

Exploitation Methodology

Exploiting this flaw requires an attacker to interact with the exposed MCP server tools. An attacker sends a formatted request containing a malicious URL parameter designed to exploit DNS resolution.

The primary attack vector uses a wildcard DNS service such as nip.io or lvh.me to point back to the local host or AWS infrastructure addresses. An attacker target configuration can resolve directly to 127.0.0.1 or the link-local metadata address 169.254.169.254:

  • http://local-test.127.0.0.1.nip.io resolves to 127.0.0.1
  • http://aws-metadata.169.254.169.254.nip.io resolves to 169.254.169.254

The exploit is executed by issuing a JSON-RPC request to the MCP server API to run a tool, such as ckan_status_show or ckan_package_search:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ckan_status_show",
    "arguments": {
      "server_url": "http://aws-metadata.169.254.169.254.nip.io"
    }
  }
}

The server receives the input parameter and evaluates the host against the regex check. Because the host string contains alphabetical characters (aws-metadata), the check succeeds.

Next, the client HTTP stack resolves the hostname and makes an HTTP connection to the AWS IMDS endpoint. The server reads the response from the link-local address and outputs the resulting session metadata or access tokens in the JSON-RPC response.

Impact Assessment

The impact of this vulnerability depends on the deployment architecture of the CKAN MCP Server. In cloud environments like AWS, GCP, or Azure, the server can access internal metadata endpoints.

On AWS, an attacker can extract credentials by calling the Instance Metadata Service (IMDS). If IMDSv1 is active or IMDSv2 hop limits allow access, the attacker can extract IAM credentials associated with the server's execution role.

If the server is deployed on-premise, this vulnerability allows attackers to bypass network perimeters. Attackers can scan local network services, communicate with databases, or access admin interfaces running on 127.0.0.1 or local subnets.

Remediation and Mitigation

The primary remediation for this vulnerability is upgrading @aborruso/ckan-mcp-server to version 0.4.108 or later. This update changes the connection pipeline to validate resolved IP addresses instead of hostname strings.

For systems that cannot be immediately updated, administrators can restrict outgoing network traffic using firewalls. Egress filtering rules should block the server from connecting to loopback (127.0.0.1/8), private networks (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), and local link addresses (169.254.0.0/16).

Administrators can also configure domain restrictions by setting the CKAN_ALLOWED_DOMAINS environment variable. This variable restricts the server's outgoing connections to a defined list of trusted domain names.

Technical Appendix

CVSS Score
5.7/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:N/A:N
EPSS Probability
0.22%
Top 87% most exploited

Affected Systems

Node.js applications running @aborruso/ckan-mcp-server version < 0.4.108
AttributeDetail
CWE IDCWE-918
Attack VectorNetwork (AV:N)
CVSS Severity Score5.7 (Medium)
EPSS Score0.00221 (Percentile: 12.95%)
Exploit Statuspoc
KEV StatusNot Listed
CWE-918
Server-Side Request Forgery (SSRF)

Vulnerability Timeline

Incomplete validation logic identified in the server hostname checks.
2026-06-18
Vulnerability reported by researcher to the project maintainer.
2026-06-22
Fix commit developed, validated with test coverage, and released in v0.4.108.
2026-06-22
Public advisory published under GHSA-798p-78g2-v556 and CVE-2026-61612 registered.
2026-09-21

References & Sources

  • [1]GitHub Security Advisory GHSA-798p-78g2-v556
  • [2]Fix Commit in Repository
  • [3]Release Tag v0.4.108
  • [4]GitHub Advisory Database Reference (CVE-2026-33060)
  • [5]GitHub Advisory Database Reference (CVE-2026-53509)

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 21 hours ago•CVE-2026-12411
8.4

CVE-2026-12411: Cross-Guest Volume Hijack via DevLXD Device PATCH in Canonical LXD

CVE-2026-12411 is a broken access control vulnerability in the DevLXD interface of Canonical LXD versions 6.6 through 6.8. The flaw resides in the devLXDInstancePatchHandler component, which fails to verify storage volume ownership when an instance attaches a new disk device via the /dev/lxd guest socket. When the security.devlxd.management.volumes configuration option is enabled, an untrusted guest or DevLXD identity can issue a crafted HTTP PATCH request referencing another tenant's custom storage volume. The LXD host daemon subsequently mounts the target volume into the requesting guest, permitting unauthorized cross-tenant read and write operations.

Amit Schendel
Amit Schendel
7 views•10 min read
•about 22 hours ago•CVE-2026-105769
9.3

CVE-2026-105769: Azure Entra ID Token Exfiltration in Kaniko via Unanchored ACR Hostname Regex

CVE-2026-105769 (GHSA-5q7h-w9jf-cx97, GO-2026-6225) is an origin validation error and credential exfiltration vulnerability affecting Kaniko prior to version 1.25.20. The flaw stems from an unanchored regular expression in the integrated Azure Container Registry (ACR) credential helper (github.com/chrismellard/docker-credential-acr-env). When Kaniko processes a Dockerfile containing an image reference hosted on a lookalike domain containing an ACR suffix as a substring (e.g., x.azurecr.io.attacker.com), the credential helper acquires a Microsoft Entra ID access token for Azure Resource Manager and transmits it via HTTP POST to the attacker-controlled host.

Amit Schendel
Amit Schendel
10 views•11 min read
•about 23 hours ago•CVE-2026-62300
6.5

CVE-2026-62300: Uncontrolled Resource Consumption in filecoin-pin Daemon

CVE-2026-62300 is an uncontrolled resource consumption vulnerability (CWE-400) affecting the daemon mode of filecoin-pin in versions up to and including 1.1.0. The daemon implements the IPFS Pinning Service API to store content on Filecoin's Proof of Data Possession (PDP) service. Due to the absence of rate limits, concurrency caps, execution timeouts, and Directed Acyclic Graph (DAG) traversal limits, an authenticated user—or an unauthenticated user when authentication is disabled—can exhaust system resources via crafted POST /pins requests.

Amit Schendel
Amit Schendel
8 views•11 min read
•about 24 hours ago•CVE-2026-61536
7.5

CVE-2026-61536: Remote Code Execution via Unsafe Reflection in masci/banks CompletionExtension

CVE-2026-61536 is a high-severity Remote Code Execution (RCE) vulnerability in the masci/banks Python library prior to version 2.4.3. The flaw exists within the CompletionExtension component, which parses JSON-serialized Tool definitions directly from rendered Jinja template bodies inside {% completion %} blocks. When handling tool calls returned by an LLM, the library dynamically resolves the target callable using importlib.import_module() and getattr() based on an unvalidated import_path string. An attacker who can supply or modify prompt templates can inject a malicious Tool JSON object pointing to arbitrary Python functions (such as os.system), bypassing the Jinja SandboxedEnvironment introduced in version 2.4.2 and achieving arbitrary code execution when the LLM invokes the tool.

Alon Barad
Alon Barad
9 views•10 min read
•2 days ago•CVE-2026-93363
4.3

CVE-2026-93363: Improper Access Control in Payload CMS Storage Upload Route

Payload CMS contains a missing authorization vulnerability (CWE-862) in its client-side upload instructions endpoint and the `@payloadcms/storage-vercel-blob` storage adapter. Two distinct logic defects allow authenticated users lacking collection-level `create` or `update` permissions to generate signed upload tokens and upload arbitrary files directly to external cloud storage.

Alon Barad
Alon Barad
7 views•9 min read
•2 days ago•CVE-2026-55098
6.5

CVE-2026-55098: Cross-Database Authorization Bypass via DuckDB Table-Valued I/O Functions in Basekick-Labs Arc

CVE-2026-55098 (GHSA-93cm-2v4m-c56c) is an authorization bypass and sensitive information disclosure vulnerability in Basekick-Labs Arc prior to version 26.06.2. The flaw stems from an incomplete remediation of CVE-2026-47735, which failed to restrict the full suite of DuckDB table-valued filesystem I/O functions and quoted-identifier invocations. Because Arc's query parser ignores function calls during table reference extraction, authenticated users with minimal or empty permissions can invoke functions like parquet_scan(), glob(), and read_blob() to read, enumerate, and extract telemetry data across all tenant databases residing within the shared local storage root.

Alon Barad
Alon Barad
7 views•10 min read