模型窃取
模型窃取 (Model Extraction) 通过大量查询、蒸馏或探测复制服务行为、参数特征或专有数据。攻击者以合法调用为掩护,把服务当作黑盒,用输入输出对训练一个能力近似的替代模型,或探测训练数据中的敏感内容。
这类攻击有明确的学术源头。Tramèr 等人 2016 年在 Stealing Machine Learning Models via Prediction APIs 中证明:仅凭预测 API 的输入输出,就能训练出在部分任务上接近原模型的替代模型;Shokri 等人 2017 年在 Membership Inference Attacks against Machine Learning Models 中提出成员推断攻击,用影子模型判断某条数据是否在训练集中,从而泄露训练数据信息。替代模型的训练又可借助知识蒸馏,Hinton 等人 2015 年在 Distilling the Knowledge in a Neural Network 中给出了用温度软化 logits 迁移「暗知识」的方法。对商业 LLM 而言,这三者叠加意味着:攻击者既能复制能力,也能推断数据,还能大幅降低蒸馏所需的查询量。
快速开始¶
设置身份绑定的速率与预算限制:速率限制按 token/租户而非全局,使单一身份无法发起海量查询;预算限制按时间窗或累计 token 数封顶,阻断蒸馏所需的数据量积累。
检测异常采样和系统性探测:监控查询分布的多样性、输入边界覆盖、对特定指令或数据的重复试探,以及跨会话的协同采集行为。对疑似探测的请求降速、返回泛化结果或触发人工审核。
成员推断可作为探测的量化指标。模型对训练集中的样本通常拟合得更好、损失更低,因此一个简化版攻击用损失阈值判断成员身份:
其中 \(\ell\) 是样本 \((x,y)\) 上的损失、\(\tau\) 是阈值;当损失低于阈值即判为成员。完整的 Shokri 攻击 会先训练若干影子模型,用它们在已知成员/非成员样本上的损失分布为每类校准 \(\tau\),比单一全局阈值更准。对防御方而言,这一指标的用途是反推:若某身份的查询持续落在「低损失」区间,说明其正在系统性地采集可推断样本。
限制返回不必要的置信信息:关闭 logprobs、置信度分数或 top-k 概率输出,除非业务确实需要。这类信息能显著降低蒸馏成本,也是提取内部表征的入口;若必须开放,应按身份和场景分级授权。
知识蒸馏用温度 \(T\) 软化 softmax,让输出分布暴露更多类间关系:
其中 \(z_i\) 是 logits,\(T=1\) 退化为普通 softmax,\(T\) 越大分布越平滑、携带的「暗知识」越多。攻击者拿到 logprobs 或 top-k 概率,就等于拿到了软标签,可直接用上式做蒸馏,查询量远小于纯硬标签场景,这正是要默认关闭这些字段的原因。
验证:用脚本模拟高频采样和边界探测,确认服务触发降速或告警;检查普通业务请求不受影响;确认已关闭不必要的置信信息字段。
案例¶
某 token 持续请求边界输入并高频采样,输出分布被系统性记录。监控发现该身份的查询多样性异常、单位时间采样次数远超正常业务,触发阈值后自动降速并向安全团队告警。
具体检测结合两类信号:一是速率与预算信号(令牌桶与累计 token 封顶),二是分布信号(查询嵌入的多样性、对边界输入的覆盖、跨会话的协同)。当某个身份的查询多样性在滑动窗口内跌破基线、同时累计 token 快速逼近上限时,判定为系统性探测并触发降速。
策略设计需区分正常批量业务与窃取行为:批量业务通常查询分布稳定、来源集中、有历史基线;窃取行为则表现为分布漂移、边界试探和身份复用。用基线加异常检测而非单一固定阈值,可减少误伤。
常见失败点:阈值过低误伤正常批量业务,过高则放过窃取;只做速率限制不做分布检测;泄露 logprobs 等置信信息。排查方向是回看该身份的查询样本与历史基线,判断属于业务波动还是系统性探测。