差点把用户数据泄漏给Claude Code后,我写了个 Rust 工具

0 阅读4分钟

两周前,我把公司的数据库接进了AI编程工具。效率确实起飞了,直到我翻了一下会话记录。

两周前

我把公司的 PostgreSQL 数据库接进了 Claude Code。AI 确实能干——帮我写迁移、联表、生成报表,效率直接起飞。

直到我随手翻了一下会话记录,看到这个:

[{
  "id": 41021,
  "full_name": "Alice Johnson",
  "email": "alice.johnson@example.com",
  "phone": "+1 415-555-0142",
  "card_last_four": "4242",
  "ssn": "123-45-6789",
  "status": "active"
}, ...]

这是 AI 执行 SELECT * FROM users LIMIT 5 时返回的真实数据。 姓名、手机号、邮箱等等敏感信息,全在上下文里。

并且这些数据可能存在:

  • 对话日志
  • AI 生成的任何摘要
  • 它刚写入 /tmp 的文件
  • 如果开了会话共享,可能还去了别人的机器
  • 最隐蔽的:某些平台会拿用户数据训练下一代开源模型

AI 没做错任何事。我也没做错。工具返回了什么,模型就看到什么——中间没有人在把关。

我当时的第一反应:为什么不用 LLM 来脱敏?

能不能让 AI “自觉”不请求敏感字段?试过,没用。提示词写得再严,模型在某些边界情况下还是会漏。

那在 AI 收到结果后,再调个 LLM 脱敏呢?这条路我也想过,但行不通:

  • 成本:一次会话几十上百次查询,每次多调一次模型,账单感人
  • 延迟:tool 执行路径需要毫秒级返回,LLM 做不到
  • 审计:“为什么这个字段被脱敏了?”——LLM 给不出确定答案,也没法复现

现有的 PII 脱敏工具(Presidio、Nightfall 等)是给数据管道或 API 网关用的,跑在 Agent 的 tool 执行路径上?不合适。

所以我想要的不是“更聪明的模型”,而是一个确定性的过滤器:

  • 放在 Agent 和数据库之间
  • 自动拦截查询结果
  • 不靠 LLM 猜
  • Agent 无法绕过

于是写了 gate

gate 是一个 Rust 写的命令行工具,做一件事:在数据进入模型之前,把 PII 替换成 [PII:类型]

gate 演示效果

*上图分三步 1. gate scan 预先扫描 schema 中的 PII 风险列 2. gate 关闭时,AI 查询能看到完整的卡号 3. gate 开启后,MCP 和 Bash 两条路径的返回结果都被自动脱敏

JSON 结构不变,AI 可以继续遍历、计数、推理,但永远看不到原始值。

涵盖两个路径

它覆盖 Agent 从后端拿数据的两个途径:

1. Bash 命令

Agent 想跑 psql -c "SELECT ..." → gate 的钩子在 harness 层把命令改写成 gate run -- psql -c "..." → 子进程的 stdout 经过扫描脱敏后才返回给模型。

这个改写发生在 Claude Code / OpenCode / Copilot CLI 的 PreToolUse 钩子里,是强制执行的,Agent 没法说"我不走那个钩子"。

2. MCP Server

gate mcp 是一个 stdio 代理,你把它注册成 MCP Server,它启动上游的真实 Server,然后所有 tools/call 的返回值都会经过脱敏扫描。对上游 Server 零侵入,现有 MCP Server 不用改一行代码。

一条命令就能把所有 MCP Server 包进去:

bash

gate init --wrap-mcp --yes

用之前先扫一遍:gate scan

我建议任何人在接入 AI 之前,先跑 gate scan 看看自己库里有多少敏感信息:

bash

psql -d mydb -c "SELECT TABLE_NAME, COLUMN_NAME 
                 FROM information_schema.columns 
                 WHERE table_schema = 'public'" | gate scan

输出按 Critical / Elevated / Standard 分级,告诉你哪几张表风险最高。有假阳性(比如products 表里的city字段)可以用 --review 一键加入白名单。

跑了一段时间后:gate retro

gate retro 会读取本地的统计日志,告诉你:

  • 一共拦截了多少次查询
  • 脱敏了多少个 PII 字段
  • 按工具和 PII 类型拆分的命中率

这是写给安全团队看的:这工具不是摆设,数字在这。

坦诚说,哪些它防不住

  • Agent攻击(被注入后故意 Base64 编码、换成 CSV 输出、走没配置的工具)—— 不在威胁模型内。可以配合 harness 级别的工具白名单加固。
  • 非 JSON 输出 — 纯文本、CSV 原样放过。可以配置 pipe: "jq -c ." 转成 JSON。
  • MCP 的 resources/read —— 目前只拦截 tools/call,这是个已知缺口,正在做。

快速指南(3条命令)

bash

# macOS / Linux
brew tap GaaraZhu/gate && brew install gate

gate config              # 生成配置
gate init                # 注册 Claude Code 钩子
gate init --wrap-mcp     # 包住现有 MCP Server(先 dry-run)

关了也很简单:gate disable 关,gate enable 再开。彻底卸载是 gate uninstall

项目地址

github.com/GaaraZhu/ga…

Rust 编写,MIT 协议,~7k 行代码 + ~6k 行测试,已发布 46 个版本,Homebrew 可安装。


如果你也在用AI连接数据库,不妨先跑个 gate scan 看看。 也许你会发现,有些东西不该出现在模型的上下文里。