恶意MCP服务器示例

一个教育示例,展示Model Context Protocol (MCP)服务器中的安全风险,特别是通过stdio传输执行系统命令的能力。

  • by alejandro-ao
  • Python
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 alejandro-ao/demo-malicous-mcp-server

使用说明

恶意MCP服务器示例

概述

这个教育示例展示了模型上下文协议(MCP)服务器中的一个关键安全风险:在用户或AI助手不知情的情况下执行系统命令的能力。该示例旨在强调这有多危险,特别是对于使用 标准输入输出 运输。

什么是MCP?

模型上下文协议(MCP)是一种开放协议,将AI应用程序(如IDE、聊天机器人或代理)连接到外部工具和数据源。MCP服务器暴露 工具 (可执行功能), 资源 (数据),以及 鼓励 (模板)到AI客户端。该协议旨在实现可组合性、安全性和用户控制,但不正确的服务器实现可能会带来严重的风险。

了解更多: 模型上下文协议.io

为什么这很危险?

  • 工具执行由模型控制: AI模型可以自动发现和调用工具。如果工具执行系统命令(例如。, rm -rf /),它可以在没有明确用户知识的情况下这样做,除非客户端强制执行确认对话框。
  • 标准运输风险: 使用stdio时,MCP服务器作为子进程在用户的计算机上运行。服务器公开的任何工具都可以在本地执行任意代码,这可能会危及系统。
  • 缺乏可见性: 如果服务器是恶意的或设计不当的,用户和AI助手都不会意识到正在运行危险的命令。

MCP是如何工作的?

MCP使用客户端-服务器架构:

  • 主持人: 人工智能应用程序(例如,VS Code、Claude Desktop)
  • 客户: 连接到一个MCP服务器
  • 服务器: 显示工具/资源/提示

服务器在初始化过程中声明其功能。列出了工具,可以由客户端或模型调用。对于stdio服务器,客户端将服务器作为子进程启动,并通过stdin/stdout交换JSON-RPC消息。

危险分子

  • 任意代码执行: 恶意或有缺陷的服务器可能会暴露运行危险命令的工具。
  • 无用户确认: 如果客户端不强制执行确认对话框,则可以在未经用户同意的情况下执行工具。
  • 会话劫持: 如果会话ID是可预测的或未绑定到用户身份,攻击者可能会劫持会话或注入恶意有效载荷。
  • 令牌传递(适用于HTTP服务器): 接受不适用于服务器的令牌可能会导致权限升级和混淆的代理攻击。

最佳实践

对于MCP服务器作者:

  • 除非绝对必要,否则切勿公开执行系统命令的工具。
  • 始终验证工具输入并净化输出。
  • 使用写入stderr的日志库(stdio服务器从不使用stdout)。
  • 实施适当的访问控制和速率限制。

对于MCP客户端作者:

  • 在执行任何工具之前,始终显示确认对话框,尤其是那些运行系统命令的工具。
  • 清楚地显示正在调用哪个服务器和工具。
  • 记录所有工具执行情况以供审计。
  • 在传递给AI模型之前验证工具结果。

对于用户:

  • 仅连接到受信任的MCP服务器。
  • 启用服务器之前,请查看可用工具列表。
  • 请谨慎使用stdio服务器,因为它们在本地运行并可以直接访问您的系统。

教育目的

此存储库仅用于教育和演示目的。做 不 在生产环境中使用此代码,或在不了解风险的情况下将其连接到真正的人工智能助手。

参考文献


警告: MCP服务器可能非常强大。在连接到任何AI应用程序之前,请务必查看服务器代码和工具定义。