mcpField
I
import-guardian

import-guardian

本地服务
github.com/Baneado98安全018 周前更新

关于 import-guardian

import-guardian 在安装前检查生成代码中的 npm 导入,识别不存在或可疑的新包。它面向开发者和 AI 编码工作流,依据注册表及下载信息标记可能由模型虚构或被抢注的包名。

主要功能

  1. 01从 JavaScript 和 TypeScript 导入中提取 npm 包
  2. 02检查包是否存在及其新旧程度
  3. 03标记新发布或相似包名以供审核
  4. 04建议相近的成熟包名
  5. 05检查明确列出的包名
  6. 06可审计多个生态的锁定文件

适用场景

  1. 01运行 `npm install` 前检查生成代码的导入
  2. 02核实 AI 编码 Agent 提出的包名
  3. 03检查依赖锁定文件中的供应链风险

MCP 相关

MCP 服务提供 `scan_code_imports`、`check_packages` 和 `verify_package`;README 也列出高级版 `audit_lockfile` 工具。README 描述了托管分析服务和轻量 npm 包。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"baneado98-import-guardian": {
"command": "npx",
"args": [
"-y",
"import-guardian-mcp"
]
}
}
}
启动命令npx -y import-guardian-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmimport-guardian-mcp0.3.0

工具

4

收录的工具列表 · 更新于 2 周前

参数类型必填说明
proboolean否强制使用高级无限/批量扫描(在服务器端付费运行)。代码超过免费片段上限时自动启用。需要 IMPORT_GUARDIAN_KEY;未提供时会返回解锁说明。
codestring是要扫描的 JS/TS 源代码(AI Agent 刚生成的代码)。

详细介绍

import-guardian 🪝

在运行 npm install 之前,捕获生成代码中由 AI 幻觉(占位抢注)产生的 npm 导入。

大模型刚刚写了一些代码。它可能会 import 一个不存在的包——这是模型自信地凭空捏造的名称。攻击者会注册这些名称并植入恶意软件。这就是占位抢注,而在 2026 年,这已成为增长最快的供应链攻击之一:据观察,代码生成器引用了 205,000+ 个独一无二的不存在的包名;现实中也已经出现了真正由模型幻觉生成的包(react-codeshift、下载量超过 30k 的假冒 huggingface-cli)。

import-guardian 会读取生成的代码,提取其中导入的所有 npm 包,并告诉你哪些是真实存在的——这样 Agent 就不会安装模型凭空捏造的包名。

它是 guardian 系列工具的一员:npm-guardian 会审查你_已选定_的包,检查其中的 CVE 和恶意行为;license-guardian 会在你发布之前审查依赖项的_许可证_(识别 GPL/AGPL/BUSL 陷阱);lockfile-guardian 会审查解析后的 package-lock.json,检查完整性篡改和有风险的安装脚本。import-guardian 比它们都更早一步,在代码及其依赖名称生成时就开始工作。

它能捕获哪些问题

👻 幻觉包导入npm 上不存在的包——模型凭空捏造了名称。返回 BLOCK,并提供最接近的真实包作为“你是不是想找”。
🪤 新近抢注确实存在但发布仅数日、没有源码仓库、下载量接近零,或与热门库仅有 1–2 处编辑差异的包。返回 REVIEW。
🧩 感知导入路径将 import x from "@scope/pkg/sub" 解析为 @scope/pkg,将 lodash/fp 解析为 lodash;跳过 Node 内置模块(fs、node:path)和本地路径。使用普通正则表达式,无需 AST,除 MCP SDK 外零运行时依赖。

判定结果:🟢 CLEAN · 🟠 REVIEW · 🔴 BLOCK。

将它用作 MCP 服务(免费)

{
  "mcpServers": {
    "import-guardian": { "command": "npx", "args": ["-y", "import-guardian-mcp"] }
  }
}

工具:

  • scan_code_imports — 提供一段生成的 JS/TS 代码;它会提取并检查所有 npm 导入。请在刚生成代码后、运行安装命令之前执行此检查。
  • check_packages — 验证明确列出的包名。
  • verify_package — 深入检查单个包名(是否存在、发布时间、版本、仓库、每周下载量、与热门包的编辑距离)。
  • audit_lockfile 🔒 (高级版) — 深度审计工具。提供来自 npm(package-lock.json)、yarn(yarn.lock)、pnpm(pnpm-lock.yaml)、PyPI(requirements.txt / poetry.lock / Pipfile.lock)或 Go(go.mod / go.sum)的锁文件,它会解析整个传递依赖树,并审计每个包是否存在依赖混淆、传递依赖中的错别字抢注 / 同形字克隆、维护者接管特征、不存在的锁定项,以及安装脚本风险。详见下文。

深度锁文件审计(高级版)🔒

scan_code_imports 会检查你能看到的少数导入。audit_lockfile 会检查你看不到的数百个依赖——也就是锁文件中完全解析后的依赖关系图——并找出大模型仅凭源码无法推断的供应链攻击:

🎯 依赖混淆锁文件从私有 / 内部注册表解析出的包,其名称在公共索引上尚未被占用——攻击者可以在公共索引上发布同名包并进行替换。这是影响最大的供应链漏洞,没有解析后的锁文件和实时公共注册表交叉检查就无法检测。在 PyPI 上情况更严重:pip install --extra-index-url 会合并你的私有索引和公共 PyPI,并安装两者中版本最高的包(2021 年影响 Microsoft / Apple / Tesla 的攻击就是如此)。返回 critical。
🪞 传递依赖拼写仿冒同形 / Unicode 易混淆克隆(rеact 中的 e 是西里尔字母)、字母换位(axois→axios),以及特定注册表中的仿冒包(PyPI 上的 python3-dateutil 与 python-dateutil,根据 PEP 503 进行规范化),覆盖整棵依赖树——并与各生态系统中包含高流量包的大型语料库进行匹配。
🕳️ 维护者账号接管受入侵维护者的特征:休眠包突然重新发布、由单一维护者维护的项目,或短时间内密集重新发布——这是 event-stream、ua-parser-js、node-ipc 以及 PyPI 的 ctx 劫持事件中出现的模式。
💉 安装脚本版本差异检测最敏锐的注入信号:某个包的最新版本新增了 postinstall/preinstall/install/prepare 钩子,而前一版本没有。原本干净的依赖突然获得安装时执行代码的能力,正是 event-stream 和 ua-parser-js 攻击中采用的方式——通过比较实时注册表上两个版本的元数据即可捕获。返回 critical,并告知你可固定的最后一个安全版本。
🔬 安装脚本载荷分析不只检查是否存在钩子,还会分析钩子的行为:下载包的 tarball,在内存中解压 gzip 并 untar(无依赖),将生命周期命令解析到入口文件,并对实际代码进行静态分析,查找恶意软件行为——网络外传、凭据 / 环境变量窃取、子进程执行、下载并运行、混淆。抗混淆 AST / 令牌分析器会解码 \x/\u/八进制转义,并合并拆分的字符串拼接,因此即使危险调用藏在 require("child-pro"+"cess") 或 global["ev"+"al"](…) 中也能捕获。载荷藏在买方的 Agent 从不获取的二进制工件中——这就是访问权限与计算能力构成的护城河。
🐍 PyPI sdist setup.py 载荷分析这是 PyPI 对 npm tarball 扫描的对应方案,也是 PyPI 风险最高的入口:源代码分发包会在 pip install 时、执行你的任何代码之前运行 setup.py——任意 Python 代码。我们会下载 sdist(设有反 DoS 大小上限),在内存中解压,并对 setup.py / setup.cfg / pyproject.toml 进行静态分析,查找窃取器 / 加载器模式——os.environ 外传、os.system/subprocess 执行、.pypirc/AWS/SSH 凭据窃取、urllib/requests 外连、exec/eval/__import__ 混淆、下载并运行,以及非标准构建后端。Python AST 反混淆器会解码 \x/\u/八进制转义,并合并拆分字符串与隐式相邻字符串,因此 getattr(__import__("o"+"s"),"sys"+"tem")(…) 仍能被解析。可从买方的 Agent 从不获取的工件中捕获 ctx / jeIlyfish / colourama 这一类攻击。只有出现恶意软件的组合特征(外传 / 下载并执行 / 打包加载器)时才会触发 BLOCK,因此仅调用编译器的合法 C/Cython 构建只会被报告为信息提示,不会误报并阻止。
🦠 已知恶意软件 / 已知漏洞(实时交叉查询 OSV)每个已解析的包都会以其确切固定版本与实时 OSV.dev 安全公告数据库交叉查询(该数据库收录了 OpenSSF Malicious Packages 源中的 MAL-*,以及 GitHub/PyPI/Go/crates/Maven/Packagist 的安全公告)。如果锁文件固定的版本已被记录为恶意软件(例如 [email protected]、[email protected]),这就是 critical / BLOCK——可能是最强的信号。映射关系是特定于版本的:[email protected] 是恶意软件,3.3.4 则是安全的,只有查询实时数据库才能区分两者。这与上述静态扫描的护城河属于不同类型——买方的模型不包含安全公告语料库,也无法解析版本与安全公告之间的对应关系。查询会进行批量处理、缓存(TTL)并发数设上限,且当 OSV 无法访问时会按安全处理(绝不会将安全包误报为问题包)。
🏗️ 本地构建后端跟进一跳(PyPI)当 pyproject.toml 声明了一个包含在 sdist 内部的非标准构建后端(backend-path = ["."])时,每次构建 / 安装都会将包自身的代码作为 PEP 517 后端运行。我们会在 sdist 中将该模块解析到对应文件并分析其实际源码(并跟进 setup.py 的本地导入一跳),而不只是标记后端名称——从而弥补载荷藏在 setup.py 之外一层间接调用中的检测缺口。
🔀 Go replace 劫持go.mod 中指向外部主机的 replace … => host/path,并通过 Go 模块代理进行实时验证。如果替换目标无法解析(例如私有主机 / 攻击者主机),那么构建实际编译的代码就不是你审核过的模块,也不是 go.sum 能为之背书的内容。
💣 安装脚本与来源风险已解析依赖树中会运行安装脚本的包、新近固定的版本、缺失仓库的包,以及实际下载量几乎为零的包(通过 npm / pypistats / crates.io 验证)。
七大生态系统。 同一个已解析依赖图引擎可用于 npm / yarn / pnpm、PyPI(requirements.txt、poetry.lock、Pipfile.lock)、Go 模块(go.mod、go.sum)、Rust / Cargo(Cargo.lock、Cargo.toml)、Java(Maven pom.xml、Gradle build.gradle / .kts / gradle.lockfile)和 PHP / Composer(composer.json、composer.lock),并分别与对应的公开索引交叉核验(npm registry、PyPI、Go 模块代理、crates.io、Maven Central、Packagist)。在 crates.io 上,匹配器了解 -/_ 的等价关系(rustdecimal 与 rust_decimal);在 Maven 上,Central 未被认领的内部 groupId:artifactId 是依赖混淆目标;在 Composer 上,未在 Packagist 注册、但私有仓库与公共索引合并时的内部 vendor/package 是混淆目标;Packagist 上被标记为 abandoned 的包则会被标记为接管风险。大型锁文件会受到限制:始终先实时检查直接依赖和私有来源的包,然后再检查数量不超过上限的传递依赖,因此单次调用不会触发数万次请求。
POST /pro/audit   { "lockfile": "<contents of package-lock.json>", "filename": "package-lock.json" }

通过 x402(Base 上的 USDC)或预付费 Stripe 密钥按次付费。免费接口 POST /audit 会返回判定结果和按严重程度统计的问题数量,但不会透露哪些包受到影响以及原因——这些内容包含在付费报告中。此深度引擎仅在服务端运行,绝不会随 npm 包一同发布。

示例
scan_code_imports({ code: 'import shift from "react-codeshift";\nimport React from "react";' })

🟠 REVIEW — 1 referenced package(s) look risky.
🟠 react-codeshift  (risk 57/100)
    • No source repository linked.
    • Only 1 published version.
    • Only 3 downloads in the last week despite being 158 days old.
🟢 react  (ok) — established package.

免费 HTTP API

POST /scan        { "code": "import x from 'reqeusts'\nimport y from 'lodash'" }
GET  /verify?name=express

托管于 https://import-guardian.vercel.app · 试试 /verify?name=express 和 /verify?name=reqeusts。

按次付费(x402)

/pro/* 路由受 x402 保护。你的 Agent 会自动为每次调用支付 $0.02 USDC,无需注册,也无需 API 密钥。款项通过链上结算(Base 上的 USDC)。服务端不持有私钥;它只声明一个公开收款地址。

POST /pro/scan    { "code": "…" }   # 402 → pay → result, no rate limit

工作原理(及其局限)

  • 包是否存在及其新鲜度数据直接来自 npm 实时 registry(registry.npmjs.org)和下载统计 API——这些都是事实,而非猜测,这正是其核心优势:Agent 无法仅凭自身可靠地判断它生成的名称是否真实可信。
  • “你是否想查”会基于一份精选的高影响力包列表,使用 Levenshtein 距离来匹配攻击者冒充的包。
  • 它不会执行或安装任何内容(只读),并且会有意倾向于标记为 REVIEW,而不是默默放行一个新出现的仿冒包。它是一道防护措施,而非保证——请搭配 npm-guardian,对你决定保留的包进行行为和 CVE 审计。

许可证

MIT。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。