文章总结: 本文介绍了隐私攻击的工程实现与防御,重点涵盖成员推断攻击的三种方法(损失阈值法、熵法、参考模型法)及评估指标,训练数据提取攻击的前缀构造与置信度过滤,以及差分隐私的工程落地。建议采用差分隐私等防御措施降低隐私泄露风险。 综合评分: 85 文章分类: ai安全,数据安全
隐私攻击的工程实现与防御
原创
pandazhengzheng pandazhengzheng
安全分析与研究
2026年9月7日 22:00 广东
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
一、成员推断攻击(MIA)工程实现
MIA判断某个样本是否在模型训练集中,是隐私泄露的基础度量。工程实现有三种主流方法。
1.1 损失阈值法
最简单的MIA:训练集样本的损失通常低于非训练集样本(过拟合)。
import numpy as np
class LossThresholdMIA:
def __init__(self, model, threshold=None):
self.model = model
self.threshold = threshold
def calibrate(self, known_members, known_nonmembers):
"""用已知成员/非成员标定阈值"""
member_losses = [self._loss(x, y) for x, y in known_members]
nonmember_losses = [self._loss(x, y) for x, y in known_nonmembers]
# 选使分类准确率最高的阈值
all_losses = member_losses + nonmember_losses
best_t, best_acc = 0, 0
for t in sorted(all_losses):
acc = np.mean([l < t for l in member_losses]) + \
np.mean([l >= t for l in nonmember_losses])
if acc > best_acc:
best_t, best_acc = t, acc
self.threshold = best_t
def attack(self, x, y):
return self._loss(x, y) < self.threshold
def _loss(self, x, y):
return -np.log(self.model.predict_proba(x)[y] + 1e-8)
1.2 熵法
熵法比损失法更鲁棒:训练集样本的预测熵通常更低(模型更”确信”)。
class EntropyMIA:
def __init__(self, model, threshold=None, augment_times=10):
self.model = model
self.threshold = threshold
self.augment_times = augment_times
def compute_modified_entropy(self, x, y):
"""对输入做数据增强后取熵的均值(更鲁棒)"""
entropies = []
for _ in range(self.augment_times):
x_aug = self._augment(x)
probs = self.model.predict_proba(x_aug)
entropy = -np.sum(probs * np.log(probs + 1e-8))
entropies.append(entropy)
return np.mean(entropies)
def attack(self, x, y):
return self.compute_modified_entropy(x, y) < self.threshold
1.3 参考模型法(Reference-based MIA)
用与目标模型同架构、在独立数据上训练的参考模型做相对损失比较:
class ReferenceMIA:
def __init__(self, target_model, reference_models):
self.target = target_model
self.references = reference_models
def attack(self, x, y):
target_loss = self._loss(self.target, x, y)
ref_losses = [self._loss(ref, x, y) for ref in self.references]
ref_mean = np.mean(ref_losses)
# 训练集样本:target_loss显著低于reference
return target_loss < ref_mean - self.margin
def _loss(self, model, x, y):
return -np.log(model.predict_proba(x)[y] + 1e-8)
1.4 攻击效果评估
class MIAEvaluator:
def evaluate(self, attacker, members, nonmembers):
tp = sum(attacker.attack(x, y) for x, y in members)
fp = sum(attacker.attack(x, y) for x, y in nonmembers)
tn = len(nonmembers) - fp
fn = len(members) - tp
advantage = (tp / len(members)) + (tn / len(nonmembers)) - 1
return {
"accuracy": (tp + tn) / (len(members) + len(nonmembers)),
"advantage": advantage, # MIA优势,0为无泄露
"tpr": tp / len(members),
"fpr": fp / len(nonmembers),
}
二、训练数据提取攻击
对生成式LLM,攻击者构造前缀让模型生成训练数据中的具体内容(如PII)。
2.1 前缀构造策略
class DataExtractionAttacker:
def __init__(self, target_llm, max_tokens=100):
self.llm = target_llm
self.max_tokens = max_tokens
def extract_with_prefix(self, prefix, n_samples=10):
"""用给定前缀生成候选提取文本"""
candidates = []
for _ in range(n_samples):
output = self.llm.generate(
prompt=prefix, max_tokens=self.max_tokens, temperature=0.7
)
candidates.append(output)
return candidates
def extract_with_patterns(self, patterns):
"""用常见文档模式作为前缀(如"姓名:""邮箱:")"""
results = {}
for pattern in patterns:
candidates = self.extract_with_prefix(pattern)
results[pattern] = self._filter_sensitive(candidates)
return results
2.2 置信度过滤
模型对训练数据的生成通常置信度更高,用置信度过滤候选:
class ConfidenceFilter:
def __init__(self, llm, threshold=0.8):
self.llm = llm
self.threshold = threshold
def filter(self, candidates):
filtered = []
for text in candidates:
logprobs = self.llm.get_logprobs(text)
avg_logprob = np.mean(logprobs)
# 转为概率
avg_prob = np.exp(avg_logprob)
if avg_prob > self.threshold:
filtered.append({"text": text, "confidence": avg_prob})
return filtered
2.3 提取验证
判断提取出的内容是否真的是训练数据(而非模型”幻觉”):
class ExtractionVerifier:
def __init__(self, llm, canary_db=None):
self.llm = llm
self.canary_db = canary_db # 已知训练数据(如canary插入)
def verify(self, extracted_text):
# 1. 与已知canary比对
if self.canary_db and extracted_text in self.canary_db:
return {"verified": True, "method": "canary_match"}
# 2. 一致性检查:多次生成是否稳定复现
reproductions = [
self.llm.generate(prompt=extracted_text[:20], temperature=0)
for _ in range(5)
]
consistency = np.mean([
r.startswith(extracted_text[:50]) for r in reproductions
])
return {"verified": consistency > 0.8, "method": "consistency"}
三、差分隐私工程落地
DP提供形式化隐私保证:相邻数据集(差一个样本)的输出分布不可区分。
3.1 DP-SGD代码实现
import torch
`
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:安全分析与研究 pandazhengzheng pandazhengzheng《隐私攻击的工程实现与防御》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论