随着 AI 模型在功能和创建成本方面的增长,它们保存了更多敏感或专有数据,保护静态数据变得越来越重要。为此,组织正在设计策略和工具,通常作为数据丢失预防和安全供应链计划的一部分,以保护模型权重。
虽然安全工程讨论的重点是预防(我们如何预防 X?),但检测(发生了 X 吗?)是成熟的深度防御框架中类似的关键部分。这一部分可显著缩短检测、隔离和补救入侵所需的时间。目前,对于 AI 模型的检测功能与用于监控任何其他敏感数据的检测功能相同,没有任何检测功能专注于 AI/ML 的独特性。
在本文中,我们将介绍 canary,然后展示如何使用 canary 令牌增强适用于 AI 和 ML 模型的常见 Python Pickle 序列化格式,以提供超出普通网络监控解决方案的其他 AI 特定的损失检测功能。虽然首选像 safetensors 这样的更安全的模型格式,但组织仍然支持 Pickle 支持的模型文件的原因有很多,在其中构建防御是良好风险缓解策略的一部分。
Canaries:轻量级线
在最基本的层面上,canaries 是环境中留下的伪影,这些伪影是良性用户不可能访问的。例如,授权用户通常会记住自己的密码,但是一般来说,用户不会在凭据文件中搜索密码,然后尝试使用这些凭据对网络上的服务进行身份验证。
安全工程师可以创建虚假凭据,将其留在可发现的位置,并在凭据被使用时生成警报,以调查其访问和使用情况。这是 CanaryTokens 背后的逻辑。Canary tokens 相对来说生成速度快、简单,几乎无需维护,可以在基础设施中处于休眠状态数月。如果正确放置,很少会出现误报。
Thinkst Canary 是一项安全服务,帮助创建和监控金丝雀。它们支持各种格式和结构。在这种情况下,我们专注于 DNS Canarytokens。
Thinkst 会为您要创建的每个 Canary 令牌动态生成唯一的主机名。如果该主机名在 DNS 中被查询,您将收到警报。该功能具有惊人的可扩展性,并提供创建自定义域的功能。此外,该功能还允许您根据需要创建自定义域。
虽然这篇博客文章主要介绍了自动 Canary 创建,但您也可以手动使用 免费版本的 Canarytoken,或构建和维护自己的 Canary 跟踪和警报系统。
机器学习模型格式
最近对机器学习安全性的关注通常集中在 Python Pickle 和 Pickle-backed 文件格式的反序列化漏洞上。虽然这显然包括以 .pkl
结尾的文件,但也可能包括由 PyTorch 或其他 ML 相邻库(如 NumPy)生成的文件。
如果用户加载不受信任的 Pickle,他们将面临任意代码执行的风险。这意味着他们可能会遭受恶意软件的攻击,影响主机或机器学习系统的安全。任意代码执行的大部分分析和范围都集中在恶意软件对主机或机器学习系统的潜在影响上。
我们问自己:“如果我们 必须 使用具有这种漏洞能力的模型,可以将其用于善事吗?”
机器学习模型 Canary
向序列化模型构件中注入代码相对容易,该构件会将信标作为金丝雀。例如,在我们的初始研究中,我们使用 Thinkst DNS Canarytokens 来保留所有原始功能,同时在加载时也会以静默方式向 Thinkst 发出信标。
我们可以使用此功能来跟踪使用情况或确定是否有人使用不应该使用的模型(真正的 Canary)。如果必要,我们可以通过此警报触发事件响应操作手册或猎杀操作。图 1 显示了从 Canary 生成到未经授权的用户生成警报的工作流程。
如下代码块所示,此方法易于与 Thinkst Canary 一起实施,也可以与专有服务器端跟踪功能一起使用。
生成新模型神器后,可以将其放置在授权用户不太可能访问的位置。Canary 需要很少的主动监控。设置它们,然后忘记它们,直到触发警报。
def inject_pickle(original: Path, out: Path, target: str):
"""
Mock for a function that takes a pickle-backed model file, injects code to ping <target> and writes it to an output file
"""
return
def get_hostname(location: str) -> str:
"""
Register with Thinkst server and get DNS canary
"""
url = 'https://EXAMPLE.canary.tools/api/v1/canarytoken/create'
payload = {
'auth_token': api_key,
'memo': f"ML Canary: {location}",
'kind': 'dns',
}
r = requests.post(url, data=payload)
return r.json()["canarytoken"]["hostname"]
def upload(file: Path, destination: str):
"""
Mock for uploading a file to a destination
"""
return
def create_canary(model_file: Path, canary_file: Path, destination: str):
"""
Register a new canary with Thinkst and generate a new 'canarified' model
"""
host = get_hostname(memo=f"Model Canary at {destination}/{canary_file.name}")
inject_pickle(model_file, canary_file, host)
upload(canary_file, destination)
create_canary("model.pkl", "super_secret_model.pkl", "s3://model-bucket/")
所提供的代码包含一个差异,该差异演示了如何在序列化模型前面追加一个对 exec
的调用。此调用充当我们 Canary DNS 端点的信标。
< 000001b0: 5496 3949 d7f8 bf94 8694 5294 8c10 5f73 T.9I......R..._s
< 000001c0: 6b6c 6561 726e 5f76 6572 7369 6f6e 948c klearn_version..
< 000001d0: 0531 2e31 2e33 9475 622e .1.1.3.ub.
---
> 000001b0: 5496 3949 d7f8 bf94 8694 5280 0263 5f5f T.9I......R..c__
> 000001c0: 6275 696c 7469 6e5f 5f0a 6578 6563 0a28 builtin__.exec.(
> 000001d0: 637a 6c69 620a 6465 636f 6d70 7265 7373 czlib.decompress
以下是它的实际运作方式。安全工程师创建了一个 Canary 模型文件,并将其放置在私有资源库中。几个月后,Thinkst Canary 警报被触发,启动了为保护私有资源库和敏感模型而定制的事件响应流程。在这个早期阶段,防御者可以利用这个信号来识别、隔离和补救导致未经授权的访问的配置错误。
基本的加载信标
功能可能只是开始,这是任意代码执行的美妙之处。这种技术可以扩展到更精细的主机指纹识别,或者其他网络欺诈操作。
安全的 AI 策略
安全的 AI 策略可以从安全的文件格式和强大的预防性控制入手。为降低剩余风险,重要的是要考虑在检测策略中添加金丝雀功能,以便在未经授权的用户访问专有模型时收到警报。
与其他防御性控制相比,Canary 模型易于实施,无需维护或开销,并且可以生成可行的警报。这些技术使我们朝着一个世界迈进,在这个世界中,未经授权的用户在搜索、exfiltrating 和执行模型之前应该三思而后行。
有关 AI 安全的更多信息,请查看其他 NVIDIA 技术博客 posts。
致谢
我们要感谢美国军事学院学员詹姆斯·鲁伊兹在 NVIDIA AI Red Team 的学术个人高级开发经验期间,对模型 Canaries 原型设计所做出的贡献。