klodr/eslint-plugin-security-mcp

GitHub: klodr/eslint-plugin-security-mcp

一款 ESLint 插件,通过静态分析检测 MCP 服务器源代码中隐藏的 Base64 编码文本和不可见 Unicode 字符等 prompt 注入向量。

Stars: 1 | Forks: 0

# eslint-plugin-security-mcp [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/d732042a82192901.svg)](https://github.com/klodr/eslint-plugin-security-mcp/actions/workflows/ci.yml) [![CodeQL](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/563f17b86e192906.svg)](https://github.com/klodr/eslint-plugin-security-mcp/actions/workflows/codeql.yml) [![使用 Vitest 测试](https://img.shields.io/badge/tested%20with-vitest-yellow?logo=vitest&labelColor=black)](https://vitest.dev) [![codecov](https://codecov.io/gh/klodr/eslint-plugin-security-mcp/branch/main/graph/badge.svg)](https://codecov.io/gh/klodr/eslint-plugin-security-mcp) [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/klodr/eslint-plugin-security-mcp/badge)](https://scorecard.dev/viewer/?uri=github.com/klodr/eslint-plugin-security-mcp) [![Socket Security](https://socket.dev/api/badge/npm/package/eslint-plugin-security-mcp)](https://socket.dev/npm/package/eslint-plugin-security-mcp) [![CodeRabbit Pull Request Reviews](https://img.shields.io/coderabbit/prs/github/klodr/eslint-plugin-security-mcp?labelColor=171717&color=FF570A&link=https%3A%2F%2Fcoderabbit.ai&label=CodeRabbit+Reviews)](https://coderabbit.ai) [![npm version](https://img.shields.io/npm/v/eslint-plugin-security-mcp.svg)](https://www.npmjs.com/package/eslint-plugin-security-mcp) [![npm downloads](https://img.shields.io/npm/dm/eslint-plugin-security-mcp.svg)](https://www.npmjs.com/package/eslint-plugin-security-mcp) [![Node.js Version](https://img.shields.io/node/v/eslint-plugin-security-mcp.svg)](https://nodejs.org) [![欢迎 PR](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/klodr/eslint-plugin-security-mcp/pulls) [![License: Apache-2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE) 用于检测隐藏在 [Model Context Protocol](https://modelcontextprotocol.io) 服务器代码中的 prompt-injection 向量的 ESLint 规则。 ## 威胁模型 MCP 服务器暴露给 LLM 客户端的字符串(工具描述、参数 docstrings、错误消息、资源内容、prompt)是一个 prompt-injection 攻击面。攻击者如果通过恶意依赖、受损的提交或从不受信任的来源复制粘贴,将编码后的指令混入该攻击面,就可以在解码时劫持客户端 LLM。 此插件通过静态分析 MCP 服务器的源代码,捕获两种最常见的编码伎俩: - **Base64 编码文本**,解码后为可打印的 ASCII 字符(一个带有往返验证、纯文本评分和已知注入短语(如 *"ignore previous instructions"*)关键字列表的手工检测器)。 - **不可见的 Unicode 字符** —— 零宽空格、BOM 以及 LLM 能读取但人类看不到的 Unicode 标签字符 (U+E0000–U+E007F)。 它**不是**密钥扫描器。对于密钥(API 密钥、token、看起来像高熵数据块的 SRI 哈希),请使用 [gitleaks](https://github.com/gitleaks/gitleaks)。 这两种工具是互补的:gitleaks 捕获高熵数据块,而此插件捕获低熵的编码文本。 ## 安装说明 ``` npm install --save-dev eslint-plugin-security-mcp ``` 要求 ESLint 10.3.0+ 和 Node 22.22.2+。 ## 用法 (flat config) ``` // eslint.config.js import mcpSecurity from 'eslint-plugin-security-mcp'; export default [ // ... your other config blocks { plugins: { 'security-mcp': mcpSecurity }, rules: { 'security-mcp/no-encoded-prompt-injection': 'error', }, }, ]; ``` ## 规则 ### `no-encoded-prompt-injection` 报告包含以下内容的字符串字面量和模板字面量片段: 1. **不可见的 Unicode 字符** —— 总是作为 `error` 报告。 2. **解码为可打印文本的 Base64 字符串** —— 作为 `error` 报告。 当解码后的文本与已知的 prompt-injection 短语匹配时,消息将使用 `HIGH RISK` 前缀进行升级。 遵循 SRI 约定(`sha256-…`、`sha384-…`、`sha512-…`)的哈希被明确排除。 #### 允许特定情况 如果你有一个合法的 base64 固定数据(测试向量、小型内嵌资产),可以按行选择退出: ``` // eslint-disable-next-line security-mcp/no-encoded-prompt-injection const fixture = 'aGVsbG8gd29ybGQgdGhpcyBpcyBhIGZpeHR1cmU='; ``` 特别是对于测试文件,你还可以通过 `eslint.config.js` 在文件或目录级别禁用该规则。 #### 局限性 - 仅检测在静态分析时作为字面量存在的字符串。运行时拼接(`String.fromCharCode(...)`,跨多个 `${}` 插值的模板组装)不会被检测到 —— 这是设计使然;静态分析无法追踪任意的运行时构造。 - 除非你配置 `eslint-plugin-jsonc` 或类似插件,否则不会对 JSON 文件进行 lint。 - 标识符中的不可见字符仅当它们出现在字符串字面量内部时才会被捕获。 ## 它如何补充其他工具 | 工具 | 捕获 | 遗漏 | | --------------- | ------------------------------------- | --------------------------------------- | | **此插件** | Base64 文本,不可见的 Unicode | 高熵密钥,运行时注入 | | **gitleaks** | API 密钥,token,SRI 形式的数据块 | 低熵编码文本 | | **CodeQL** | 污点流,数据流漏洞 | 编码层伎俩 | | **OSV-Scanner** | 依赖项中已知的 CVE | 源代码级别的威胁 | 针对 MCP 仓库推荐的分层防御方案: ``` IDE (eslint extension) → real-time feedback Pre-commit (husky + lint-staged) → eslint on staged files CI → eslint full scan + gitleaks + OSV-Scanner + ... ``` ## 参与贡献 参见 [CONTRIBUTING.md](.github/CONTRIBUTING.md)。所有贡献均通过 [DCO](https://developercertificate.org/) 签署,并在 Apache-2.0 下授权。 ## 许可证 版权所有 2026 klodr 根据 Apache 许可证 2.0 版("许可证")授权; 除非遵守许可证,否则你不得使用此文件。 你可以在以下地址获取许可证的副本: ``` http://www.apache.org/licenses/LICENSE-2.0 ``` 除非适用法律要求或书面同意,否则根据许可证分发的软件 均按“原样”分发, 不附带任何明示或暗示的担保或条件。 详见 [LICENSE](./LICENSE) 文件。
标签:AI安全, Chat Copilot, CISA项目, CodeQL, ESLint插件, JavaScript安全, MCP, MITM代理, Node.js安全, npm包, SAST, TypeScript安全, URL发现, Vitest, 大语言模型安全, 安全专业人员, 安全检测, 安全评估工具, 提示注入, 数据可视化, 机密管理, 模型上下文协议, 漏洞防御, 盲注攻击, 自定义脚本, 错误基检测, 集群管理, 静态代码分析