Show HN:Noisegate – 面向不可信AI代理的差分隐私网关

Hacker News Top 工具

摘要

Noisegate 是一个开源的差分隐私网关,允许不可信的AI代理查询敏感数据集,并提供针对记录泄露的数学保证。它具备内置的攻防测试、经过验证的噪声机制,并作为Claude Desktop的MCP服务器运行。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/07/30 19:51

yashmahajan10/llm-differential-privacy-gateway

来源: https://github.com/yashmahajan10/llm-differential-privacy-gateway

Noisegate: 一个为不可信AI智能体设计的差分隐私网关

CI (https://github.com/yashmahajan10/llm-differential-privacy-gateway/actions/workflows/ci.yml) Python 3.13+ License: Apache-2.0

让AI智能体查询敏感数据,同时提供数学保证——即使智能体出错、被操纵或具有对抗性,也无法泄露任何个体的记录。

一段录制的Claude Desktop会话(回复已裁剪;图表卡片为会话自身生成)。一个AI智能体按诊断将20名患者分组,±12的噪声淹没了每个分桶。在被告知无法关闭噪声后,它消耗了三个答案的预算,直到网关返回拒绝而非更安静的答案。在32561行的普查数据上,一个过窄的切片在信任边界处被拒,而完整的教育程度细分则在大规模下顺利返回。拒绝和拒答是实时网关的真实执行,可通过 python scripts/render_demo_gif.py 复现。从在Claude Desktop中使用开始尝试。

概览

  • 有效的攻击,而非空谈。 三种经典隐私攻击(差分攻击、成员推断攻击、通过重识别进行个体锁定)均针对系统自身引擎运行。每个攻击都展示了关闭隐私时成功、开启隐私时失败,并在CI中进行回归测试,以确保防御机制不会悄然失效。
  • 独立验证的数学。 手工实现的噪声机制与行业参考实现OpenDP (https://opendp.org/) 在全部35项噪声尺度检查中一致(误差小于1e-9),而50万样本的分布检验通过,且阳性对照证明检验确实能发现失败。
  • 更优会计带来3倍效用。 混合zCDP组合允许308次查询,而朴素预算会计则在100次时停止:同样的隐私保证,三倍的问题量。
  • 专为AI智能体构建。 作为MCP服务器运行于Claude Desktop。连接智能体被设计为不可信,所有隐私属性在它之下强制执行。
  • 小而确定的信任边界。 LLM提出查询;一个单调但经过充分测试的验证层负责处置。模型输出的任何内容都无法扩大自身的权限。
  • 技术栈: Python · DuckDB · FastAPI · Streamlit · MCP SDK · Docker · GitHub Actions,配合CI中250+的测试套件。五分钟评估:观看GIF,然后浏览攻击画廊。深度审查:DESIGN.md

你对敏感数据集用普通英文提问。LLM将每个问题编译成一个小型、受限的查询;差分隐私引擎在追踪的隐私预算下执行该查询,并返回故意加的答案及置信区间。名称恰当:与音频噪声门 (https://en.wikipedia.org/wiki/Noise_gate) 类似,该网关将所有低于设定阈值的信号压制在噪声基底之下——任何个体的贡献都被淹没,而群体规模的信号几乎无损通过。无论问什么或如何巧妙措辞,都无法从答案中重构出任何个体记录。

有趣的部分并非LLM能编写查询,而是隐私保证不依赖于LLM的可信度。模型只是一个方便提议查询的工具;它不强制执行任何东西。每一个隐私属性都在下游由那些即使人类手动输入查询也会同样动作的组件强制执行。这是你在生产系统中对任何不可信输入都应应用的信任边界纪律,此处应用于AI智能体。


头条:攻击画廊

任何人都可以声称隐私。本仓库包含了那些会打破这种声称的利用方式,并针对自身引擎运行,在CI中固定结果。理解网关保证的最快方式是观察它如何击败三种会破坏朴素“查询数据库“系统的经典攻击。

攻击1——差分攻击

差分攻击通过询问两个仅相差目标一人的聚合问题来隔离该人。

查询A:"部门X中所有人的总收入。" → $7,240,000 查询B:"部门X中除Alice外所有人的总收入。" → $7,135,000 攻击者计算:A − B = $105,000 ← 泄漏了Alice确切的薪水。

两个查询都是“仅聚合“。都没有命名任何特定行。但合在一起就暴露了个体。

画廊 (attacks/differencing.py) 显示了该攻击在禁用隐私时成功:目标个体的私有值被精确恢复。(上述薪水示例仅为说明;在真实的UCI Adult数据上,“Alice“是其群体中最大资本收益的唯一拥有者。)

然后它显示了同一攻击在开启DP后被击败:每个答案上的校准噪声使得减法变得无用,而预算会计为两个查询释放的信息共同收费,而非视为独立。

攻击2——成员推断攻击

成员推断攻击判断某个特定个体是否存在于数据集中。对于许多数据集(医学研究、违约者名单),这一事实本身就很敏感。只有查询权限的攻击者试图判断:“这个具体的人是否在数据中?”

画廊在一系列隐私预算(ε——决定答案精度与隐私权衡的旋钮)上运行该攻击,并绘制结果图:

成员推断成功率 vs ε,叠加效用曲线

在一个COUNT查询上,最优(Neyman-Pearson)攻击者针对真实引擎在不同ε下判断单个人是否在数据中。经验成功率(蓝色,95% Wilson区间)紧贴分析Laplace曲线,并保持在最坏情况DP上限(虚线)以下;随着ε缩小,成功率从确定性(关闭DP)向0.5抛硬币水平崩溃。绿色效用曲线(右轴)展示了同一ε范围下聚合查询的相对误差,在攻击被击败的地方几乎不受影响。

python -m attacks.membership 生成(每ε 10,000次试验)。

随着ε缩小(更强的隐私),攻击者的成功率向抛硬币水平崩溃。效用叠加显示了你所付出的代价:击败单个人攻击的相同噪声,几乎不影响群体规模的聚合。隐私并非免费,这张图精确展示了你在交易什么。

扫描范围覆盖ε = 8到0.5以涵盖全范围;捆绑部署中每查询收费 ε = 0.05,位于此图左边界之外,在那里单查询攻击已与随机猜中无异。

攻击3——通过重识别进行个体锁定

Latanya Sweeney在2002年证明,邮政编码+出生日期+性别可以唯一识别约87%的美国人。你不需要名字就能在数据集中找到某人;几个无害属性就足够了。

画廊的第三次攻击 (attacks/patients_alice.py) 在20个合成患者上复现了这种结构:性别和年龄单独就将群体缩小到唯一一人——Alice,唯一超过64岁的女性。关闭隐私时,减去两个完全普通的人口统计直方图就能精确恢复Alice的诊断。不需要异常值;仅仅是可重识别就足够了,这使得它成为画廊中最强的攻击。

开启隐私时,三道独立防御结束了它:过滤守卫直接拒绝了明显的狭窄查询(不消耗预算);校准噪声淹没了两个查询的减法(信噪比≈0.13,因此“恢复“的诊断基本上是随机抽取);预算则在其起作用之前(需要约256次重复,只能承担10次)就拒绝了平均升级攻击。

这就是本页顶部演示GIF以及Claude Desktop演练中实时重放的攻击。结果在 tests/test_attack_patients.py 中进行回归测试。

这些针对系统自身引擎运行的实验是核心证据,证明保证是真实且被理解的,而非从库中导入并盲目信任。

与OpenDP交叉验证

这些攻击验证了我们自己的数学保证。为防止自洽但错误的实现,该机制还与作为独立参考的OpenDP (https://opendp.org/) 进行了交叉验证(attacks/crosscheck_opendp.py,opendp 0.15.1)。

简而言之:手工实现的机制与行业参考在九位小数位一致,而故意校准错误的版本则无法通过相同的测试,因此一致性是有意义的。

细节如下:

  • 尺度一致。 对于COUNT、每个已发布数值列的截断SUM以及直方图,在五个ε值下(35项比较):我们的灵敏度 Δf = max(|L|, |U|) 与OpenDP的截断求和稳定性界完全相等,并且我们的噪声尺度 Δf/ε 与OpenDP认证为ε-DP的最小尺度在每种情况下相差不超过1e-9。
  • 分布一致。 生产采样器产生的50万噪声样本与OpenDP在同一尺度下的Laplace测量进行双样本KS检验(D = 0.0014,p = 0.70,α = 0.001)。阳性对照证明了检验的功效:同一采样器但尺度故意错误5%,被拒绝时p ≈ 4×10−22

OpenDP是参考,而非实现:它仅存在于开发依赖中,运行系统不导入它。尺度一致性在 tests/test_crosscheck_opendp.py 中进行回归测试(本地无OpenDP时跳过;CI安装它并设置 REQUIRE_OPENDP=1 以确保检查不会在那里静默跳过)。

复现它

这些攻击在进程中针对真实DP引擎运行。无需API密钥或服务器,因为它们构建手写AST而非通过LLM编译器:

bash python -m attacks.patients_alice # 攻击3:重识别Alice并恢复她的诊断 # 关闭DP;观察守卫+噪声+预算 # 如何击败同一攻击(无需数据获取) python scripts/fetch_data.py # 获取UCI Adult数据到data/(git忽略;~4 MB) python -m attacks.differencing # 攻击1:关闭DP时精确恢复Alice,然后观察 # 噪声+预算如何击败同一减法 python -m attacks.membership # 攻击2:扫描ε并重新生成上图 python -m attacks.crosscheck_opendp # 与OpenDP交叉验证(需要开发依赖: # pip install -e ".[dev]")

这些结果本身在 tests/test_attack_differencing.pytests/test_attack_membership.pytests/test_attack_patients.py 中进行回归测试,因此任何悄悄削弱保证的变更都会导致CI失败,而非仅仅生成更漂亮的图表。


工作原理

三个阶段。只有第一阶段不可信,这种不对称是整个设计的核心。

自然语言问题 │ ▼ ┌───────────────────┐ │ LLM编译器 │ 生成受限查询AST(非自由SQL), │ (不可信) │ 通过结构化/强制schema的输出。 └───────────────────┘ │ 查询AST ▼ ┌───────────────────┐ │ 验证/ │ 策略检查:仅允许的列、仅聚合、 │ 防护层 │ 声明值范围、分组基数上限。 │ (可信) │ 无效→修复循环或拒绝。 └───────────────────┘ │ 验证后的AST ▼ ┌───────────────────┐ │ 隐私引擎 │ 截断至声明范围(约束灵敏度), │ (可信) │ 添加校准Laplace噪声,递减预算。 └───────────────────┘ │ ▼ 带噪答案 + 置信区间 + 剩余预算

最重要的设计选择是标有不可信的框。验证层之上的所有内容均被视为敌意。之下的所有内容都是强制执行保证的可信计算基。

LLM编译成受限AST而非任意SQL,因为这种约束限制了查询灵敏度,而有限的灵敏度使噪声校准变得可靠。自由形式SQL会重新打开本项目所关闭的攻击面。

完整架构、威胁模型、灵敏度和噪声数学以及预算会计设计,请参见 DESIGN.md


隐私模型,如实陈述

简明版:每个答案都加了噪声,为每个身份保留精确的累积披露记录,当账本可能超过其声明的保证时,网关拒绝回答。本节的其余部分详细阐述账本的数学。这对隐私工程师很重要,其他人可以略读。

每个答案由纯ε-Laplace机制产生,带有校准噪声和声明的置信区间。跨查询的累积隐私损失由混合会计师追踪,它维护两个同时有效的界限:ε的纯和,以及零集中差分隐私(zCDP)总量,其中每个ε-DP释放成本为ρ = ε²/2,且ρ跨查询累加。仅当两者都耗尽时才拒绝后续查询。轻度使用保持保守的纯ε容量;大量使用则受益于zCDP的√k组合,在相同总预算下,当每查询ε很小时,可回答数倍于之前的查询。

默认 ε_q = 0.05 时,针对同一 (ε = 5, δ = 10−6) 预算,纯ε求和会计在100次查询后拒绝;混合会计在308次之后才拒绝,同样的保证,三倍的问题量。增益随每查询ε的减小而增长,超过盈亏平衡点后干净地退化:混合会计回退到纯ε容量而非低于它。

python benchmarks/composition_comparison.py 重新生成此图、盈亏平衡点和δ灵敏度视图。

代价同样需要明确说明:头条保证是 (ε, δ)-差分隐私,它严格弱于纯ε-DP。最多以概率δ,ε界限可能会被允许失败。δ不是额外噪声;它是失败质量。因此它是从数据集推导而非硬编码:δ = min(10−6, 1/(30·n)),对于任何服务的数据集至少低于1/n的30倍(与2020年美国人口普查生产系统选择的相同比例边距),对于捆绑的Adult数据集(n = 32,561)给出10−6。一个用户的纯ε账本从未超过预算,也保留完整的纯ε-DP保证。DESIGN.md 第3节和5.4节给出了完整的数学、盈亏平衡点和权衡。


快速入门——三种方式

1. 无需API密钥,无需设置——运行攻击。 以上画廊在进程中针对真实引擎执行;python -m attacks.patients_alice 无需任何数据获取。

2. 无需API密钥——连接AI智能体。 网关作为MCP服务器运行于Claude Desktop;演练见下方

3. 完整的自然语言UI(本地单租户演示) ——仅需要API密钥用于不可信的NL→查询编译器:

``bash
export ANTHROPIC_API_KEY=… # 仅由不可信的NL→查询编译器使用
docker compose up # 启动引擎、API和UI

打开 http://localhost:8501

``

这个HTTP + Streamlit界面是本地单租户演示。身份来自一个可伪造的 X-Identity 头,这是占位符而非认证边界,因此它适用于单个可信操作员在自己的机器上,而非公共多租户部署。相同的可信验证器、引擎和持久化预算位于其下,因此它对噪声、截断和预算纪律的展示是真实的;只有身份绑定是占位符(参见这些界面是什么、不是什么)。

对于本地(非Docker)设置、运行测试和配置旋钮(预算大小、时期、身份),请参见 SETUP.md

在Claude Desktop中使用(MCP)

网关也作为MCP stdio服务器运行,因此任何支持MCP的智能体可以直接询问聚合问题。智能体成为不可信的查询作者,相同的可信验证器、引擎和预算在其下运行。查询界面仅暴露结构化工

相似文章

Show HN:为你的AI代理扫描危险能力

Hacker News Top

MakerChecker是一个用于AI代理的开源安全层,它强制执行默认拒绝权限、人工审批,并提供加密签名的审计追踪。该工具会扫描代理代码中的危险能力,并防止代理自我批准操作。

可证明安全的智能体护栏

arXiv cs.AI

本文提出了一种新的AI智能体安全范式,采用带有神经符号隔离的可执行证明约束动作(ePCA)框架,实证评估中实现了零攻击成功率。