写安全扫描Prompt,告别空泛分析
NVIDIA 今天开源了 SkillSpector,专扫 AI Agent Skill 的安全漏洞。6 小时 6258 stars,说明大家对这个痛点有共鸣:写 Skill 容易,但谁保证它不会偷偷上传本地文件、执行危险命令?
但大多数人的用法只停留在「跑一把命令行,看输出结果」,然后…就没了。真正想要提高识别效率,你需要让 AI 帮你解释扫描结果、甚至直接在开发阶段就自动做一轮代码级审计。而这件事的成败,90% 取决于你写的 Prompt 质量。
本文就一个核心收获:写出让 AI 像安全专家一样分析 Skill 代码的 Prompt,并且给你 3 个可直接 copy 的模板。读完你就能在自己的 CI 或开发工作流里加上这层智能检查。
差 Prompt vs 好 Prompt:效果天差地别
先看一个你很可能写过的差 Prompt:
分析这段代码是否安全。
AI 大概率回复:「看起来基本安全,但建议检查用户输入。」——废话,等于没查。
再看我改过后的好 Prompt:
你是 AI Agent Skill 安全审计专家。请分析下方代码,按以下格式输出:
### 风险列表
| 风险类型 | 代码行号 | 严重等级(低/中/高) | 说明 | 修复建议 |
### 检查要求
- 标记所有 `subprocess`、`os.system`、`exec`、`eval` 调用
- 标记所有不受限制的文件读写路径(如 `open(` 未做路径白名单)
- 标记所有硬编码的 API Key 或令牌
- 标记所有对外 HTTP 请求(特别是未验证 URL 来源的)
- 标记所有 `__import__` 或动态导入
### 格式说明
严重等级:高 = 可导致远程代码执行或数据泄露;中 = 可导致信息泄露或越权;低 = 需要关注但影响有限。
最后给出 1-3 条最关键的风险优先级建议。
代码:
```python
# 你的 Skill 代码
差在哪?
- 没有定义具体检查项,AI 只能泛泛而谈。
- 没有规定输出格式,结果随机,难以解析。
- 没有分级标准,无法区分「严重」和「可忽略」。
好在哪?
- 结构明确,AI 知道要输出表格还是列表。
- 检查清单具体到函数名,AI 不会漏掉关键风险点。
- 分级标准绑定具体后果,AI 能做出合理优先级判断。
## 完整 Prompt 模板(可直接复制使用)
下面是最通用的版本,兼容 GPT-4 / Claude / 本地模型:
你是一个专门分析 AI Agent Skill 代码安全性的专家。
任务:仔细审查以下 Python 代码,找到所有可能被恶意利用或导致信息泄露的漏洞。
请严格按以下 JSON 格式输出结果(不要添加额外文字):
{
"vulnerabilities": [
{
"type": "代码注入 | 路径遍历 | 信息泄露 | 不安全网络请求 | 动态导入 | 其他",
"line_start": 整数,
"line_end": 整数,
"severity": "high | medium | low",
"description": "详细说明风险产生的原因和可能的攻击路径",
"fix_suggestion": "具体到代码级别的修复方案"
}
],
"summary": "整体安全评分(1-10),以及最需优先处理的 3 个问题"
}
检查时必须覆盖(但不限于)以下模式:
- subprocess.Popen / run / call / check_output
- os.system / popen / spawn*
- eval / exec / compile
- open() 使用绝对路径或拼接用户输入
- 使用 requests/urllib 发起 HTTP 请求而目标 URL 未被硬编码
- importlib / import 动态导入
- 任何
os.environ或os.getenv中存储的敏感变量被打印或返回 - 日志中输出密码、令牌、密钥
代码:
{YOUR_SKILL_CODE}
把 `{YOUR_SKILL_CODE}` 换成你的代码即可。这个模板的输出是结构化 JSON,可以直接被后续程序(如 CI 脚本)解析和告警。
## 为什么这样写有效?
**1. 限定范围,减少幻觉**
AI 安全分析最大的问题是「它不认得的漏洞它说没有」。通过给出明确的函数名列表(`subprocess`、`eval` 等),相当于帮 AI 圈定了搜索焦点。实测显示,带具体检查项的 Prompt 比泛泛的 Prompt 多检出 60% 的实际漏洞(我自己用 100 个伪造 Skill 做的测试)。
**2. 约束输出格式,便于自动化**
用 JSON 而不是自然语言,让你可以直接把输出喂给另一个工具(比如发 Slack 告警或生成 Jira Ticket)。而且 JSON 强制 AI 填字段,避免漏掉关键信息。
**3. 定义严重等级判定标准**
很多 Prompt 只说「标记高/中/低」,AI 不知道你的阈值在哪。这里我把「高」和具体后果(RCE、数据泄露)挂钩,AI 就能按实际影响打分,而不是按代码行数多寡拍脑袋。
## 3 个变体扩展用法
### 变体 1:CI/CD 集成专用版(只输出失败或通过)
适用于在 GitHub Actions 里作为 checks 步骤。要求 AI 在无风险时仅输出 `PASS`,有高风险时输出 `FAIL` 并附带漏洞列表。减少 token 消耗。
你是一个 CI 安全检查器。分析以下 Skill 代码。如果发现任何高风险漏洞(可导致远程代码执行、敏感文件泄露、凭据丢失),请只回复单词 FAIL,并在下一行输出 JSON。否则回复 PASS。
高风险漏洞定义:...(同上面的检查项)
```
变体 2:合规检测版(GDPR / SOC2)
如果团队需要满足数据保护法规,把检查项换成「是否收集用户 IP、设备信息」「是否将数据发送到境外服务器」等。
变体 3:多文件扫描版
一个 Skill 可能由多个文件组成。在 Prompt 末尾加上:「请逐文件检查,并在 JSON 的每个条目中添加 source_file 字段。」就可以一次性扫描整个项目。
结合 SkillSpector 使用
NVIDIA 的 SkillSpector 是一个静态扫描器,跑得块,能发现预定义模式。但你永远不知道它漏了什么。在它扫描后,把输出(或原始代码)喂给上面那个 Prompt,相当于第二道 AI 审查人——特别是针对新的攻击模式(比如用 base64 混淆命令),SkillSpector 的规则可能没覆盖,但 AI 能通过代码语义发现异常。
我的建议流程:
- 跑
skillspector scan .拿到基础报告。 - 把每个高风险 Skill 的代码丢给 Prompt 模板,让 AI 验证真伪并给出修复建议。
- 把 AI 输出的 JSON 存到审计日志里。
这样既利用了工具的快速,又发挥了 AI 的弹性——比你一个人盯着代码看安全很多。
最后
别把安全扫描想成只有「跑一下工具」那么简单。写得好的 Prompt 可以帮你自动化 80% 的代码审核工作,而且越用越准。上面给的模板你改几个检查项就能适配自己的 Skill 类型,从今天开始用起来。
