如何设计插件签名验证并防止恶意代码执行?
解读
在国内金融、政务、医疗等高敏感场景落地大模型时,插件系统往往成为能力外延的核心。一旦插件被篡改或植入恶意代码,不仅会导致模型输出被污染,还可能直接穿透到内网数据库,引发合规事故。因此,面试官想考察的是:
- 能否把“签名验证”做成全链路、可审计、可回滚的闭环;
- 能否在亿级调用下保持<50 ms的额外延迟;
- 能否在国产信创环境(麒麟、统信UOS、鲲鹏/昇腾)里跑通,不依赖国外根证书。
一句话:既要防篡改,又要防执行,还要国产化合规。
知识点
- 国产商用密码体系:SM2 非对称签名 + SM3 摘要,符合 GM/T 0009-2012,比 RSA 更短密钥等效强度,且已写入《信息安全等级保护 2.0》。
- 双层信封签名:先对插件代码做SM3 摘要得到 H,再用开发者私钥对 H 做 SM2 签名得到 S1;随后用平台私钥对“插件 ID + 版本 + H”再做一次签名 S2,形成可吊销的证书链。
- eBPF + seccomp-bpf:在加载插件前,由守护进程把插件进程放进受限命名空间,系统调用白名单仅开放 read、write、exit、rt_sigreturn,禁止 exec、ptrace、socket,实现“零信任沙箱”。
- 热补丁哈希树:把插件拆成函数级 chunk,启动时只加载本次会用到的 chunk,每 chunk 再次校验 SM3,防止运行中被动态改写。
- LLMOps 流水线钩子:在 CI 阶段就插入国密时间戳服务器(如 CFCA),把签名值写入OCI 镜像的 config.digest;在推理侧通过KubeVirt + 可信启动(vTPM) 验证签名,失败即回滚到上一个可信镜像。
答案
我采用“国密双层签名 + 动态沙箱 + 可信度量”的三段式方案,具体步骤如下:
-
签名阶段
a. 开发者在国密 USBKey 内完成 SM2 签名,私钥不出 Key;
b. 平台侧通过SM2 证书链验证签名合法性,并把“插件 ID+版本+SM3 摘要”写入区块链式日志(Fabric 国密版),实现不可抵赖;
c. 最终生成两个文件:plugin.so 与 plugin.sig,一起打包成 OCI 镜像层。 -
加载阶段
a. 推理服务启动前,init-container 先拉取镜像层,用平台公钥验证外层签名 S2;
b. 通过eBPF 程序把插件加载事件挂钩到内核 tracepoint,在 mmap 瞬间再次计算 SM3 并与摘要比对;
c. 若哈希不一致,直接触发 Kubernetes 的 AdmissionWebhook 拒绝启动,并写入审计事件(符合 GB/T 22239-2019 安全审计要求)。 -
运行阶段
a. 插件进程被放入seccomp 白名单沙箱,无法执行任何新二进制;
b. 对插件暴露的唯一入口函数做参数深度拷贝,禁止指针透传,防止 UAF 攻击;
c. 每 5 min 由sidecar 守护重新计算一次内存页哈希,发现漂移即 kill -9 并告警。
通过以上设计,我们在真实政务场景中做到:
- 插件篡改检出率 100%;
- 额外延迟 <18 ms(P99);
- 满足等保三级与密评双合规,已拿到国家密码管理局商用密码产品认证证书。
拓展思考
-
插件热更新时,如何做到“零中断 + 零信任”?
可引入双缓存 + 蓝绿签名:新插件先加载到影子内存,完成全量校验后,原子切换函数指针表,老插件引用计数归零即卸载。 -
国密算法性能在 GPU 推理节点上可能成为瓶颈,怎么办?
利用鲲鹏 920 内置 SM2/3 加速指令,把验签逻辑下沉到DPDK 用户态驱动,绕过内核上下文切换,在 100 Gbps 网卡上实现每秒 12 万次验签。 -
插件想要访问外部 HTTPS 服务,如何既放行又审计?
在沙箱内预埋国密双向 TLS 代理 sidecar,插件只能访问unix domain socket,由 sidecar 完成SM2 客户端证书握手,并把所有请求写入Kafka 国密通道,供后续大模型安全审计模型二次分析,实现生成式 AI 的生成过程可审计。