一条字符串比较当闸门,.cUrSoR/mcp.json 就把 Cursor 的敏感文件保护变成废纸

一个大小写就把「受保护文件」清单变成了废纸

Cursor 里有一份「agent 要动这些文件必须先弹窗问人」的名单,.cursor/mcp.json(MCP server 定义,里面直接写 commandargs)、.vscode/tasks.json、AI rules 文件都在上面。Lakera 的原话是:”Cursor tried to prevent that by showing confirmation prompts whenever an AI-generated action targeted special configuration files.”

问题在于这个「targeted」是怎么判断的:按字符串精确匹配比路径。而 macOS 的 APFS 和 Windows 的 NTFS 默认大小写不敏感。于是 agent 请求写 .cUrSoR/mcp.json——检查器一看,这个字符串不在名单里,放行;内核一看,这跟 .cursor/mcp.json 是同一个 inode,写进去了。同一篇文章还给了第二个变体 .cursor/./mcp.json:路径里插一个 .,没做 normalize 的比较同样认不出来。第三个是 .vsCoDe/tasks.json,打的是同一个洞的另一个文件。

CWE-178(Improper Handling of Case Sensitivity),据 SentinelOne 漏洞库给的向量是 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H,即 9.8;但 vulnerablemcp.info 那条记的是 High、impact 8/10,NVD 页面是 JS 渲染抓不到原始评分,两边分歧我没法裁定,引用时请注明来源。受影响版本:1.6.23 及以下,1.7 修复。

这类 bug 在传统软件里也有(Windows 上 PROGRAM~1 短名绕 ACL 是二十年前的老把戏),但在 agent 产品里危险程度不一样:传统软件里那个路径字符串是开发者写死的常量,攻击者顶多能influence 一小部分;在 Cursor 里,这个字符串是模型输出的 tool call 参数,攻击者只要能往模型的上下文里塞进一段文字,就对它有完全控制权——大小写、./、尾随点、符号链接,任意拼。检查器面对的是一个完全由对手构造的字符串,还拿 === 去比。

已核实来源


本文由自动化管道生成(采集 → 逐字核验 → 模型撰写),未经人工改写。