一个被官方盖章"死亡"的AI工具,每周仍有2.1万次下载。更荒诞的是,它承诺的"只读保护"像一扇上锁的玻璃门——看起来安全,一推就碎。
这是Anthropic的PostgreSQL MCP服务器(Model Context Protocol,模型上下文协议),AI agent连接数据库的官方参考实现。今年5月归档,7月正式弃用,npm和Docker Hub上的弃用标记像墓碑一样醒目。但数字不会撒谎:截至评测时,它每周仍从npm拉取约21,000次,Docker Hub约1,000次。
这些下载者里,有多少知道他们装的是个有SQL注入漏洞、且永远不会修复的软件?
「只读」是个谎言
服务器的核心卖点是只读访问。AI agent可以查看表结构、运行SELECT查询,但无法修改数据。Anthropic在代码里确实做了防护:每个查询都被包裹在BEGIN TRANSACTION READ ONLY和ROLLBACK之间。
问题出在Node.js的postgres客户端。它允许在单次client.query()调用中提交多条用分号分隔的SQL语句。攻击者可以在SELECT后面追加一个分号,再跟一条COMMIT——或者更直接的,用堆叠查询(stacked query)把事务模式改成READ WRITE。
换句话说,那个"只读"标签是安慰剂。它让开发者误以为风险可控,实际上大门敞开。
讽刺的是,同期被归档的SQLite MCP服务器至少诚实——它干脆没有安全护栏,用户知道自己暴露在危险中。PostgreSQL服务器则提供了"虚假的确定性",这种设计比裸奔更危险。
极简主义的代价
这个服务器精简到近乎吝啬。它只暴露1个工具和1种资源类型:query工具(执行SQL)和schema资源(查看表结构)。对比SQLite服务器的6个工具、社区替代方案的8个以上,这是评测过的最简数据库MCP实现。
配置同样极简。Claude Desktop用户只需一行npx命令:
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres", "postgresql://localhost/mydb"]
}
}
}
Docker版本同样简单,把localhost换成host.docker.internal就能在macOS上跑。没有配置标志,没有环境变量,连接字符串里的凭据就是全部安全边界。
这种极简主义在Demo场景里很迷人:一行命令,agent立刻能查你的数据库。但生产环境?没有schema白名单,没有表级权限,没有操作审计。连接字符串能访问什么,agent就能碰什么——包括那些你以为被"只读"保护挡住的写操作。
归档之后,无人收尸
5月归档,7月弃用,没有CVE编号,没有安全补丁。parent仓库modelcontextprotocol/servers有81,600星,但这个子项目像被踢出群聊的成员,静静躺在存档区。
npm的弃用标记在install时只会显示一行小字警告。Docker Hub的标记更隐蔽。大多数开发者不会注意到,或者注意到了也以为只是"不再更新"而非"有已知漏洞"。
社区替代方案已经涌现。一些实现了真正的查询白名单,用AST解析而非字符串匹配;一些支持行级安全策略(RLS)集成;还有的直接放弃通用SQL接口,只暴露预定义的只读视图。但它们都需要更多配置,不像官方工具那样"一行命令开箱即用"。
便利性和安全性之间的张力,在这里被拉到极致。
MCP生态的缩影
PostgreSQL服务器和SQLite服务器像一对镜像:前者有护栏但护栏是假的,后者没护栏但至少不骗人。它们共同指向同一个问题——MCP作为AI agent与外部系统交互的协议,其参考实现的安全成熟度远低于市场预期。
81,600星的parent仓库是Anthropic在AI基础设施领域影响力的证明。但star数不等于代码质量,官方标签不等于生产就绪。当开发者把"Anthropic官方"等同于"可以信任"时,风险就已经产生了。
那个每周2.1万的下载数字还在跳动。它可能是CI管道的缓存,可能是教程文章的复制粘贴,也可能是某个工程师今天刚接手的"快速原型"。他们中的大多数不会读到这篇评测,不会知道那个看似无害的只读承诺背后藏着什么。
如果你正在使用这个服务器,或者曾在某个项目里用过——你当时有没有验证过那个"只读"限制?还是像大多数人一样,看了文档就信了?
热门跟贴