<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://vulnerability.circl.lu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Sun, 04 Oct 2026 11:41:28 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-73845</title>
      <link>https://vulnerability.circl.lu/vuln/fkie_cve-2026-73845</link>
      <description>&lt;p&gt;CKAN MCP Server is a tool for querying CKAN open data portals. Prior to 0.4.112, the ckan_get_mqa_quality and ckan_get_mqa_quality_details tools in src/tools/quality.ts use isValidMqaServer to validate the server_url parameter with a prefix-only regular expression for dati.gov.it, allowing suffix-host and URL-userinfo values to target an attacker-controlled host and return a spoofed response. This issue is fixed in version 0.4.112.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;CKAN MCP Server is a tool for querying CKAN open data portals. Prior to 0.4.112, the ckan_get_mqa_quality and ckan_get_mqa_quality_details tools in src/tools/quality.ts use isValidMqaServer to validate the server_url parameter with a prefix-only regular expression for dati.gov.it, allowing suffix-host and URL-userinfo values to target an attacker-controlled host and return a spoofed response. This issue is fixed in version 0.4.112.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/fkie_cve-2026-73845</guid>
    </item>
    <item>
      <title>GHSA-83x6-42hr-jc76 — CKAN MCP Server: MQA server allowlist bypass via unanchored regex (`isValidMqaServer`)</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-83x6-42hr-jc76</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: @aborruso/ckan-mcp-server&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;The `ckan_get_mqa_quality` and `ckan_get_mqa_quality_details` tools restrict their `server_url` argument to `dati.gov.it` via a regular expression. The regex is anchored only at the start and places no boundary after the host, so any URL whose host merely **begins with** `dati.gov.it` — or that uses `dati.gov.it` as URL *userinfo* before an `@` — passes validation while actually targeting an attacker-controlled host.&lt;/p&gt;
&lt;p&gt;## Affected code&lt;/p&gt;
&lt;p&gt;```js
// src/tools/quality.ts
const ALLOWED_SERVER_PATTERNS = [
  /^https?:\/\/(www\.)?dati\.gov\.it/i        // &amp;lt;-- no end anchor / host boundary
];
export function isValidMqaServer(serverUrl: string): boolean {
  return ALLOWED_SERVER_PATTERNS.some(pattern =&amp;gt; pattern.test(serverUrl));
}
```&lt;/p&gt;
&lt;p&gt;All of the following return `true`:&lt;/p&gt;
&lt;p&gt;| URL | Real host |
|-----|-----------|
| `https://dati.gov.it.attacker.com/x` | `dati.gov.it.attacker.com` (attacker) |
| `http://dati.gov.it.evil.example/api` | `dati.gov.it.evil.example` (attacker) |
| `https://dati.gov.it@attacker.com/x` | `attacker.com` (userinfo trick) |&lt;/p&gt;
&lt;p&gt;After passing this check, `server_url` flows into `getMqaQuality`/`getMqaQualityDetails`, which call `makeCkanRequest(serverUrl, &amp;#34;package_show&amp;#34;, { id })`. The server therefore issues a request to the attacker-controlled host and returns its (parsed) response to the caller.&lt;/p&gt;
&lt;p&gt;## Impact&lt;/p&gt;
&lt;p&gt;- The intended &amp;#34;dati.gov.it only&amp;#34; trust boundary for the MQA tools is defeated; they can be driven against arbitrary external hosts.
- The attacker ho…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: @aborruso/ckan-mcp-server&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;The `ckan_get_mqa_quality` and `ckan_get_mqa_quality_details` tools restrict their `server_url` argument to `dati.gov.it` via a regular expression. The regex is anchored only at the start and places no boundary after the host, so any URL whose host merely **begins with** `dati.gov.it` — or that uses `dati.gov.it` as URL *userinfo* before an `@` — passes validation while actually targeting an attacker-controlled host.&lt;/p&gt;
&lt;p&gt;## Affected code&lt;/p&gt;
&lt;p&gt;```js
// src/tools/quality.ts
const ALLOWED_SERVER_PATTERNS = [
  /^https?:\/\/(www\.)?dati\.gov\.it/i        // &amp;lt;-- no end anchor / host boundary
];
export function isValidMqaServer(serverUrl: string): boolean {
  return ALLOWED_SERVER_PATTERNS.some(pattern =&amp;gt; pattern.test(serverUrl));
}
```&lt;/p&gt;
&lt;p&gt;All of the following return `true`:&lt;/p&gt;
&lt;p&gt;| URL | Real host |
|-----|-----------|
| `https://dati.gov.it.attacker.com/x` | `dati.gov.it.attacker.com` (attacker) |
| `http://dati.gov.it.evil.example/api` | `dati.gov.it.evil.example` (attacker) |
| `https://dati.gov.it@attacker.com/x` | `attacker.com` (userinfo trick) |&lt;/p&gt;
&lt;p&gt;After passing this check, `server_url` flows into `getMqaQuality`/`getMqaQualityDetails`, which call `makeCkanRequest(serverUrl, &amp;#34;package_show&amp;#34;, { id })`. The server therefore issues a request to the attacker-controlled host and returns its (parsed) response to the caller.&lt;/p&gt;
&lt;p&gt;## Impact&lt;/p&gt;
&lt;p&gt;- The intended &amp;#34;dati.gov.it only&amp;#34; trust boundary for the MQA tools is defeated; they can be driven against arbitrary external hosts.
- The attacker ho…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-83x6-42hr-jc76</guid>
    </item>
  </channel>
</rss>
