You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(security): resolve DNS to close SSRF bypass + mandatory HTTP allowlist (v0.4.108)
GHSA-798p-78g2-v556: validateServerUrl only checked the hostname string, so a
name resolving to an internal IP (lvh.me -> 127.0.0.1, *.nip.io -> cloud IMDS)
bypassed the guard. A string denylist cannot close this class.
- Extract isBlockedIp(), shared by literal and resolved-IP guards
- Node/axios: SSRF-safe lookup agent resolves, validates every resolved IP and
pins the connection (closes DNS-rebinding and redirect-to-internal); maxRedirects: 5
- sparql_query (fetch): pre-resolution check assertHostnameResolvesSafe (HTTPS-only)
- HTTP transport: refuse to start without CKAN_ALLOWED_DOMAINS unless
CKAN_HTTP_ALLOW_ALL=true (default-deny); stdio stays open; Worker unaffected
- 11 new tests; verified end-to-end against a real HTTP deployment
Reported by: EchoSkorJjj
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: LOG.md
+9Lines changed: 9 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,14 @@
1
1
# LOG
2
2
3
+
## 2026-06-22
4
+
5
+
### v0.4.108
6
+
7
+
- Security fix (GHSA-798p-78g2-v556): close DNS-name SSRF bypass — `validateServerUrl` only checked the hostname string, so a name resolving to an internal IP (e.g. `lvh.me` → `127.0.0.1`, `*.nip.io` → cloud IMDS) bypassed the guard. Added DNS resolution + validation of every resolved IP, with connection pinning via a custom `lookup` agent (closes DNS-rebinding and redirect-to-internal) on the Node/axios path; pre-resolution check on the fetch-based `sparql_query` (HTTPS-only). Extracted `isBlockedIp` shared by literal and resolved-IP guards. `maxRedirects: 5` on CKAN requests.
8
+
- Hardening: the network-exposed HTTP transport now refuses to start without `CKAN_ALLOWED_DOMAINS` (default-deny), unless explicitly opted out with `CKAN_HTTP_ALLOW_ALL=true` (logs a warning). stdio stays open. Cloudflare Worker unaffected (CF sandbox already blocks internal addresses).
9
+
- 11 new tests (isBlockedIp, SSRF-safe lookup, allowlist gate, DNS-bypass on sparql). Verified end-to-end against a real HTTP deployment.
Copy file name to clipboardExpand all lines: manifest.json
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,7 @@
1
1
{
2
2
"dxt_version": "0.1",
3
3
"name": "ckan-mcp-server",
4
-
"version": "0.4.107",
4
+
"version": "0.4.108",
5
5
"display_name": "CKAN MCP Server",
6
6
"description": "Explore open data portals based on CKAN (dati.gov.it, data.gov, open.canada.ca, ...)",
7
7
"long_description": "MCP server for interacting with CKAN-based open data portals. Provides tools for advanced dataset search with Solr syntax, DataStore queries for tabular data analysis, organization and group exploration, and complete metadata access.",
0 commit comments