使用 eBPF 保护 PyTorch 模型安全
评估不安全的代码
在现代软件开发中,向代码库添加新库可能存在风险。我们缺乏对软件包行为的清晰认知,导入的包可能在不知情的情况下操纵环境。
以 HuggingFace 为例,存储库通常存储模型的 PyTorch 定义(Python 代码)。我们依赖星标作为可信度指标,但这应该改变——星标往往只是书签,很少有人会真正审查代码。
Pickle 协议与供应链攻击
Pickle 协议是许多主要框架(包括 Python 多处理)的基础构建块,但其设计存在漏洞:
import pickle
class Demo:
def __reduce__(self):
return (eval, ("__import__('os').system('echo Exploited!')",))
# 序列化恶意对象
pickle.dumps(Demo())
# 在另一个环境中加载会导致漏洞利用
pickle.loads(b"\x80\x04\x95F\x00\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x04eval\x94\x93\x94\x8c*__import__('os').system('echo Exploited!')\x94\x85\x94R\x94.")
复制代码
PyTorch 沙箱示例
1. 运行基础示例
使用 PyTorch 官方文档中的多项式回归示例:
import torch
import math
class Polynomial3(torch.nn.Module):
def __init__(self):
super().__init__()
self.a = torch.nn.Parameter(torch.randn(()))
self.b = torch.nn.Parameter(torch.randn(()))
self.c = torch.nn.Parameter(torch.randn(()))
self.d = torch.nn.Parameter(torch.randn(()))
def forward(self, x):
return self.a + self.b * x + self.c * x ** 2 + self.d * x ** 3
复制代码
2. 创建安全沙箱
使用 secimport 跟踪代码并构建沙箱策略:
# 跟踪代码执行
secimport trace --entrypoint pytorch_example.py
# 构建沙箱策略
secimport build
复制代码
该过程会创建 YAML/JSON 策略文件,映射每个模块允许的系统调用。
3. 在沙箱中运行代码
secimport run --entrypoint pytorch_example.py
复制代码
4. 测试安全防护
向代码中注入恶意命令:
def forward(self, x):
import os; os.system('ps')
return self.a + self.b * x + self.c * x ** 2 + self.d * x ** 3
复制代码
secimport 会检测到违规行为并记录:
[SECURITY PROFILE VIOLATED]: called syscall 56 at depth 561032
[SECURITY PROFILE VIOLATED]: called syscall 61 at depth 561032
复制代码
代码执行防护
使用以下标志实现主动防护:
secimport run --entrypoint pytorch_example.py --kill_on_violation
复制代码
结论
secimport 使 Python 用户能够以不同权限和规则限制代码中的各个模块。通过 eBPF 技术,我们可以将 Torch 模型运行时一直保护到内核系统调用级别,为生产环境提供强有力的安全保护。
参考资料
评论