

没用的碎碎念:最近报名参加了一下这个 ai 攻防挑战赛,本来是红蓝两个队都报名了,上传了一个红队的恶意 skill 之后,拿了个 5. 多分好像是,但是我感觉红队的这个面太大了,恶意 skill 种类太多了,我是写了一个可以读取宿主机文件的恶意 skill,但是我感觉也没啥其他可试的了,这个我感觉主要是看积累。所以还是 all in 蓝队这个恶意 skill 检测,感觉这个可优化的点比较多。
本文只做一个简单的思路分享,因为也不是什么排名前几的大佬,不涉及泄密什么的,后面比赛结束了,作者看到好的开源方法也会在这个文章下面继续分享。
什么是恶意 skill
我理解的恶意 skill 就是指那些表面上伪装成帮你干活的好好小助手,实际上背地里干点坏事的 skill。比如:读你的文件传给黑客的远程服务器,给你电脑上下载两个恶意软件(黑客可以通过工具回连)这种。官方给的完整类型如下:
| ID | 分类 | 中文说明 | 严重程度 | 主要信号 |
|---|---|---|---|---|
| AST01 | Malicious Skills | 恶意技能 | 严重 | 破坏性命令、凭证窃取、反向 Shell、提示词注入、数据窃取 |
| AST02 | Supply Chain Compromise | 供应链妥协 | 严重 | 远程安装器、运行时包拉取、生命周期钩子、不受信任的注册表 |
| AST03 | Excessive Authorization | 过度授权 | 高 | 通配符权限、敏感凭证或宿主机访问、权限提升、逃逸符号链接 |
| AST04 | Insecure Metadata | 不安全元数据 | 高 | 隐藏的元数据指令、不披露指令、误导性的安全声明 |
| AST05 | Insecure Deserialization | 不安全反序列化 | 高 | 不安全的 pickle/YAML/对象反序列化及输入驱动的求值 |
| AST06 | Weak Isolation | 弱隔离 | 高 | 特权容器、Docker 套接字、宿主机命名空间、沙箱禁用 |
| AST07 | Update Drift | 更新漂移 | 中 | 自动更新、可变的 latest/main 引用、版本范围、验证禁用 |
| AST08 | Insufficient Scanning | 扫描不足 | 中 | 扫描器绕过、编码载荷、运行时反混淆、忽略指令 |
| AST09 | Lack of Governance | 缺乏治理 | 中 | 审计抑制、匿名特权操作、审批绕过 |
| AST10 | Cross-Platform Reuse | 跨平台复用 | 中 | 跨平台载荷分发、多代理平台目标定位 |
检测方法设计
先看一下官方给的环境 ------ 评测期间完全隔离,无外部网络访问
bash
4) 资源限制
计算资源:4 vCPU / 8GB 内存 / 30 分钟总时限
网络:评测期间完全隔离,无外部网络访问
镜像大小:上限 16M
超时或内存溢出:按已完成部分计分 ------ 重点检查现在的代码是否满足 引擎接口规范。
那就是静态扫描了,如果我对无外部网络访问理解无误的话,应该就是不能调用外部接口,那么问题就简化为了就是静态扫描检测 skill 有没有恶意行为。
我的设计思路比较简单,就是一个单进程、顺序扫描架构,描述如下:
bash
/data/skills/
|
v
发现 Skill 子目录
|
v
安全遍历与扫描
|
+--> manifest.json 分析
+--> 文件清单分析
+--> Python AST 分析
+--> 依赖文件分析
+--> 通用文本规则分析
|
v
发现项去重与分类计分
|
v
生成 verdict、confidence、category、evidence
|
v
/output/results.jsonl
其中,扫描部分扫描的文件是由 skill 架构决定的,Skill(技能包)本质上是一个包含代码、配置和说明文档的压缩包。其中:
- manifest.json(或类似的元数据配置文件)是 Skill 的"身份证"和"权限声明书"。
- 文件清单是对 Skill 包内所有文件的"结构体检",检测包内是否藏匿了不该出现的危险文件。
- AST(Abstract Syntax Tree,抽象语法树)分析是针对 Python 代码的"深度白盒审查"。
- 依赖文件分析针对 Skill 引入的第三方库和外部组件(如 requirements.txt, package.json 等)。
- 通用文本规则分析是针对 Skill 中的自然语言说明(如 SKILL.md、README)及普通文本的"意图审查"。
分析到上面,问题就简化为了对上面几种类型文件的扫描分析,针对上面几种类型文件的安全检查,我们可以检索、让大模型给我们生成相应的检测代码即可。
其实,分析到这里,在我这种纯静态扫描到方法中,问题就变成了看谁想的更全面,也就是谁的覆盖面更广的问题,这种问题就很适合迭代优化,发现不足,增加相应方法即可。
完整流程
设计完检测引擎后,安装平台执行流程将其封装为 docker 镜像即可。
- 接收或拉取参赛 Docker 镜像
- 校验镜像 digest 和镜像大小
- 准备黑、白、灰 Skill 数据集
- 创建空输出目录
- 在断网和资源限制下启动容器
- 将数据集挂载到 /data/skills:ro
- 将结果目录挂载到 /output
- 等待容器完成或达到 30 分钟超时
- 读取 /output/results.jsonl
- 校验 JSONL 格式并计算评分