---
id: "MAL-2026-18487"
kind: "package"
aliases: ["MAL-2026-18487"]
title: "Malicious code in @ifasn/mdd-doc-mcp (npm)"
severity: "critical"
cvss: null
epss: null
exploited: false
status: "open"
category: "package"
products: [{"name": "@ifasn/mdd-doc-mcp", "fixed": [], "affected": "= 1.0.7; = 1.0.8; = 2.0.6", "ecosystem": "npm"}]
ecosystems: ["npm"]
tags: ["malicious", "package"]
not_affected_if: []
published_at: "2026-11-02T20:58:05+00:00"
first_seen_at: "2026-11-02T21:35:22+00:00"
updated_at: "2026-11-02T21:37:01+00:00"
sources: [{"source": "osv-malicious", "url": "https://osv.dev/vulnerability/MAL-2026-18487", "first_seen_at": "2026-11-02T21:35:22+00:00"}]
---

# Malicious code in @ifasn/mdd-doc-mcp (npm)

## Affected

- npm:@ifasn/mdd-doc-mcp affected = 1.0.7; = 1.0.8; = 2.0.6 fixed ?

## Timeline

- 2026-11-02T21:35:22+00:00 osv-malicious https://osv.dev/vulnerability/MAL-2026-18487

## From the sources

---
_-= Per source details. Do not edit below this line.=-_

## Source: amazon-inspector (1d8295dd6d1f932aa9f2b865822f1a6f213e00fc288b35cd4b7d8fa0f07a8641)
On load, index.js queries the Alibaba Cloud ECS instance metadata service at 100.100.100.200, performs the IMDSv2-style PUT to obtain a metadata token (X-aliyun-ecs-metadata-token), then reads a base64-concealed path that decodes to `ram/security-credentials/` — the IMDS endpoint that returns STS AccessKeyId/Secret/SecurityToken for the instance's RAM role — and writes the response to `output/meta_field_dump.txt`. The surrounding code frames the operation as benign `field map v2` diagnostics and leaves all other metadata field names (hostname, image-id, zone-id, instance-id, owner-account-id) in cleartext while encoding only the credentials path, which is a cover-story pattern. The package's declared purpose is a Markdown documentation MCP tool and has no legitimate need for cloud instance role credentials. Separately, package.json pins the dependency `node-health-utils` to a plain-HTTP tarball at the bare IP `http://121.199.24.94/dl/health-utils-1.0.0.tgz` — on `npm install` this fetches and installs whatever bytes that host returns, unpinned, with no integrity check and no TLS, and runs any lifecycle scripts contained in the fetched tarball. The combination gives the publisher both install-time code execution on every installer and, on cloud-hosted installs, theft of the instance's STS credentials.

---

_Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai_
