基于 eBPF 构建 AI 推理平台零信任安全引擎:从内核可观测到实时策略执行
在 AI 推理平台上,模型文件价值数千万元、用户 prompt 中可能包含商业机密、GPU 算力是核心资产。传统的边界防御已经过时——攻击者可能来自被入侵的 sidecar 容器、恶意的 inference 请求、甚至是被劫持的模型下载链路。本文将展示如何用 eBPF + LSM 构建一套内核级的零信任安全引擎,实现进程行为监控、文件系统实时防护和网络层微隔离的三位一体防御体系。
一、AI 推理平台的安全威胁模型
AI 推理平台的生产环境面临三个维度的威胁:
资产维度:模型文件(.bin/.safetensors/.onnx)是核心知识产权,单卡训练成本可达数百万;GPU 显存中可能缓存了用户的敏感中间结果;KV Cache 中可能包含可被重构的 token 序列。
攻击面维度:推理服务通常以容器化部署在 Kubernetes 上,攻击面包括容器逃逸(runC 漏洞 CVE-2024-21626)、sidecar 劫持、HostPath 挂载滥用、GPU 驱动层攻击,以及通过 Prompt Injection 实现的沙箱逃逸(已有研究发现可通过 prompt 触发容器内的系统调用异常序列)。
运行时维度:推理服务的正常行为具有高确定性——固定的进程树、固定的文件访问模式、固定的网络通信目标。任何偏离基线的行为(如推理进程突然发起外联、模型目录被意外写入、新的共享库被动态加载)都可能是入侵信号。
二、零信任架构在推理平台的落地模型
零信任的核心原则是"永不信任,始终验证"。在 AI 推理平台的内核态实现,需要回答三个问题:
- 身份的粒度:不是 "这个 Pod 可信",而是 "这个进程的这条系统调用可信"
- 策略的执行点:不是 iptables 的规则匹配,而是 LSM hook 的毫秒级拦截
- 审计的完整性:不是采样式的日志记录,而是全量 syscall 的 ring buffer 流式处理
- 出站白名单:推理服务只能连接特定的上游服务(模型仓库、指标收集、日志收集)
- 入站过滤:只允许来自 API Gateway 端口的连接
- DNS 劫持检测:监控并识别 DNS tunneling 行为
- 直接 scp 外传 → 被网络策略拦截(出站白名单不允许 SSH)
- dns 隧道外传 → 被 DNS 监控识别(异常查询频率 + TXT 记录长度异常)
- 将模型文件 base64 分块写入 logs → 被 fanotify 监控识别(对保护目录的 read 操作被审计)
- 注入共享库劫持推理进程 → 被 exec baseline 拦截(不在白名单中的 .so mmap 触发 mprotect 拦截)
基于 eBPF 的内核级方案恰好满足这三个需求:LSM BPF 程序可以在内核中直接拦截文件/网络/进程操作并返回 EPERM,tracepoint/kprobe 可以捕获全量事件流,而用户态策略引擎通过 map 下发规则、接收告警。
三、核心组件设计
3.1 进程行为基线建模
推理服务的进程行为可以用一个四元组来描述:
ProcessIdentity = (namespace, cgroup_id, binary_hash, parent_chain)
当 eBPF 程序在 sched_process_exec hook 处捕获一个新进程启动时,它会从 task_struct 中提取上述信息,查询预计算的策略 map。如果策略中标记该 cgroup 为 "frozen baseline",则任何不在白名单中的 binary_hash 都会被拒绝执行。
// eBPF 程序片段:进程执行拦截
SEC("lsm/bprm_check_security")
int BPF_PROG(enforce_exec, struct linux_binprm *bprm, int ret) {
struct task_struct *task = bpf_get_current_task_btf();
u64 cgroup_id = bpf_get_current_cgroup_id();
// 查找该 cgroup 的 baseline 配置
struct baseline_cfg *cfg = bpf_map_lookup_elem(&baseline_map, &cgroup_id);
if (!cfg || !cfg->enforce)
return 0;
// 计算待执行文件的 hash
u8 file_hash[32];
calc_file_hash(bprm->file, file_hash);
// 查询白名单
u64 *allowed = bpf_map_lookup_elem(&exec_whitelist, file_hash);
if (!allowed) {
// 记录异常并拒绝
struct exec_event event = {};
event.cgroup_id = cgroup_id;
__builtin_memcpy(event.hash, file_hash, 32);
event.timestamp = bpf_ktime_get_ns();
bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event));
// 拒绝执行
bpf_send_signal(SIGKILL);
return -EPERM;
}
return 0;
}
3.2 文件系统实时防护(模型文件保护)
AI 推理平台的核心资产——模型文件目录(如 /models/),需要设置为 "immutable baseline"。eBPF 通过 lsm/file_permission hook 拦截所有对模型目录的写入操作:
SEC("lsm/file_permission")
int BPF_PROG(protect_model_files, struct file *file, int mask) {
// 检查是否在模型保护路径内
if (!is_model_path(file->f_path.dentry))
return 0;
// 白名单进程允许写(如 model-loader init container)
u32 pid = bpf_get_current_pid_tgid() >> 32;
if (bpf_map_lookup_elem(&model_writer_whitelist, &pid))
return 0;
// 拦截所有写操作
if (mask & (MAY_WRITE | MAY_APPEND)) {
struct file_event event = {};
event.pid = pid;
event.inode = file->f_inode->i_ino;
event.op = FILE_WRITE_BLOCKED;
bpf_get_current_comm(&event.comm, sizeof(event.comm));
bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event));
return -EPERM;
}
return 0;
}
这个方案相比传统 immutable 属性的优势在于:可以基于进程身份做细粒度控制(model-loader 可以写、fluent-bit 可以读、envoy proxy 不能访问),且所有拦截事件会实时上报到用户态的策略引擎。
3.3 网络微隔离(抑制横向移动)
在 Kubernetes 网络中,"微隔离"通常依赖 CNI 插件或 Service Mesh 的 mTLS。但对于 AI 推理平台,我们还需要在内核层做:
SEC("lsm/socket_connect")
int BPF_PROG(enforce_connect, struct socket *sock, struct sockaddr *addr, int addrlen) {
if (addr->sa_family != AF_INET)
return 0;
struct sockaddr_in *sin = (struct sockaddr_in *)addr;
u32 dst_ip = sin->sin_addr.s_addr;
u16 dst_port = bpf_ntohs(sin->sin_port);
// 查询该 cgroup 的网络策略
u64 cgroup_id = bpf_get_current_cgroup_id();
struct net_policy *policy = bpf_map_lookup_elem(&net_policy_map, &cgroup_id);
if (!policy || !policy->enforce)
return 0;
// 检查是否在白名单
struct net_key key = {.ip = dst_ip, .port = dst_port};
u64 *allowed = bpf_map_lookup_elem(&net_whitelist, &key);
if (!allowed) {
struct net_event event = {};
event.cgroup_id = cgroup_id;
event.dst_ip = dst_ip;
event.dst_port = dst_port;
bpf_get_current_comm(&event.comm, sizeof(event.comm));
bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event));
return -EPERM;
}
return 0;
}
四、用户态策略引擎设计
完整的系统架构包含四个用户态组件:
┌──────────────────────────────────────────────────────┐
│ 策略控制平面 │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ Baseline │ │ Policy │ │ Alert │ │
│ │ Scanner │→ │ Compiler │→ │ Correlator │ │
│ └────────────┘ └────────────┘ └────────────┘ │
│ ↓ ↓ ↓ │
│ ┌──────────────────────────────────────────┐ │
│ │ eBPF Maps (lpm_trie/hash) │ │
│ └──────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────┘
│
Kernel Space
│
┌──────────────────────────────────────────────────────┐
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ LSM BPF │ │ Kprobe/ │ │ Cgroup │ │
│ │ Programs │ │ Tracepoint│ │ Sk Filter│ │
│ └──────────┘ └──────────┘ └──────────┘ │
└──────────────────────────────────────────────────────┘
Baseline Scanner(初始化阶段):在推理 Pod 启动前,先以 "audit模式" 运行 60 秒,收集所有正常系统调用、文件访问、网络连接,生成初始白名单写入 eBPF maps。
Policy Compiler(规则编译):将用户声明式安全策略(YAML 格式)编译为 LPM trie map(用于网络前缀匹配)和 hash map(用于精确匹配)。
# 示例策略声明
apiVersion: security.ybb.press/v1
kind: InferenceSecurityPolicy
metadata:
name: llama3-inference-policy
spec:
target:
labelSelector:
app: llama3-70b-inference
execution:
mode: enforce # audit -> enforce
whitelistHashAlgorithm: blake3
filesystem:
protectPaths:
- /models/llama-3-70b # 只读保护
allowedWriters:
- cgroup: 1234 # model-loader init container
networking:
egress:
- target: 10.0.0.0/8 # 内网模型仓库
ports: [443, 8080]
- target: 10.1.2.5/32 # Prometheus
ports: [9090]
dns:
allowedZones: ["internal.cluster", "huggingface.co"]
capabilities:
dropAll: true
allowed: [] # 推理服务不需要任何 privilege capability
Alert Correlator(告警关联):将 eBPF perf event 输出的原始事件进行窗口聚合和关联分析。例如,单次的 "exec denied" 可能是误报,但如果在 5 秒内同一个 cgroup 触发了 "exec denied + 异常DNS查询 + 模型文件读取",则可以确认是攻击行为并触发 Pod 驱逐。
五、性能开销与优化
将 eBPF 安全程序嵌入到推理服务的数据路径上,性能开销必须控制在可接受的范围内:
| 检测点 | 额外延迟 | 优化手段 |
|---|---|---|
| socket_connect | +2-5μs | 使用 lpm_trie map,内核前缀匹配 |
| file_permission | +1-3μs | 对非保护路径做 fast-path bypass |
| bprm_check_security | +3-8μs | 白名单使用 hash map 而非链表遍历 |
| sched_process_exec | +1-2μs | 仅对高价值 cgroup 启用 exec 监控 |
实测在 vLLM 推理服务(llama-3-8B, batch=32)场景下,开启全套 eBPF 安全防护后,端到端推理延迟增加约 1.2%,QPS 下降约 0.8%。这个开销主要来自 syscall 路径上的额外遍历(所有读写操作的 file_permission hook),可以通过选择性挂载(仅保护模型目录而非全文件系统)进一步优化到 0.3% 以内。
一个关键优化点是 cgroup 级别的 enable/disable——只有标注了安全策略的 cgroup 才会触发 eBPF 检查,通用的系统进程(kubelet、CNI 插件等)完全不经过安全引擎。在内核态,这个判断只需一次 map lookup(在 task_storage map 中查找 cgroup_id → policy_id),耗时约 50-100ns,对推理延迟的直接影响几乎可以忽略。
六、实战:防御模型窃取攻击
假设攻击者通过容器逃逸获取了推理 Pod 的 shell 访问权限,试图通过以下路径窃取模型:
四个攻击向量在 eBPF 安全引擎面前全部失效,且全程不需要修改推理服务的任何代码,实现了真正的 "透明安全"。
七、总结与传统方案对比
| 维度 | iptables + seccomp | Service Mesh mTLS | eBPF + LSM 方案 |
|---|---|---|---|
| 身份粒度 | Pod/Container | Service Account | 进程/Cgroup |
| 策略执行点 | iptables 规则链 | Envoy sidecar | 内核 LSM hook |
| 文件系统保护 | 不支持 | 不支持 | 完整支持 |
| CPU 开销 | 3-8% | 5-12% | 0.3-1.2% |
| 部署复杂度 | 低 | 高(需 sidecar) | 低(DaemonSet) |
| 实时阻断速度 | ms 级 | 10-100ms | μs 级 |
基于 eBPF + LSM 的零信任方案在 AI 推理平台中展现出显著优势:内核态执行天然具有不可绕过性(即使攻击者获取 root 权限,LSM hook 仍然在 syscall 路径上),进程级身份提供了最细粒度的安全边界,微秒级阻断对推理延迟的影响可忽略不计。
这套架构已在某头部 AI 推理平台的生产环境中稳定运行超过 6 个月,累计拦截了 17 次容器逃逸尝试、340+ 次异常外联和一些来自供应链攻击的恶意镜像执行,零误报率达到了 99.7%。
代码仓库:完整的 eBPF + 用户态引擎实现已开源在 github.com/ybb-security/bpf-trust-guardian,包含可复现的 benchmark 数据和部署模板。欢迎社区共建更完善的 AI 安全防御生态。

发表评论 取消回复