是否为营销接口:是
任意发奖漏洞判定结果:无漏洞
1. campId 从配置获取
2. sendOrderIds 外部可控但不可遍历
3. 最终结论:无漏洞- 严格贴着定义文件走,判定链完整。
- 只回答“是否构成该类漏洞”,不顺手点评代码质量。
- 最终输出与真实答案一致。
一次真实对照实验显示:仅把核心术语从“漏洞”换成“风险”,Skill 审计准确率就从 89.3% 跌到 62.1%。问题不在工作流,而在词汇边界。
这份 deck 聚焦三件事:为什么一个词会击穿约束体系,什么样的 Skill 设计更稳,以及如何把“语义陷阱”变成可检测、可修复的工程问题。
“围墙”可以写得很细,但如果拿来砌墙的砖块本身会膨胀,约束仍然会被从内部撑裂。
两个 Skill 的工作流程、参考文件和示例结构完全一致。唯一差别,是核心术语从“漏洞”改成了“风险”。大模型没有报错,却悄悄换了一套理解框架。
真正可怕的不是“模型答错了”,而是它在表面遵守流程时,已经把“应该看什么”这件事改写了。
| Skill | 核心术语 | 正确率 |
|---|---|---|
| biz-vul-security | 漏洞 | 89.3% |
| biz-risk-security | 风险 | 62.1% |
是否为营销接口:是
任意发奖漏洞判定结果:无漏洞
1. campId 从配置获取
2. sendOrderIds 外部可控但不可遍历
3. 最终结论:无漏洞是否为营销接口:否
接口风险等级:低风险
1. 代码逻辑错误
2. 参数校验不足
3. 缺少 ACL 权限控制
作者对两个 Skill 做了完整 diff:主 `SKILL.md`、定义文件、示例文件、Step 框架,都是机械式替换“漏洞 → 风险”。结构没变,规则没漏,执行链条也没变。
把任务拆成有顺序、有依赖的步骤,减少模型自己“编排任务”的空间。
通过强制回读和外部状态,把每一步的上下文重新锚回当前任务。
用穷举边界和反例校正代替模糊描述,把“算 / 不算”写死。
提前回答“什么时候用、为什么用、怎么用”,而不是只给一堆通用工具。
先落外部状态,再开始任务。
定位入口和防御边界。
确认关键参数是否外部可控。
判断是否属于营销接口语境。
严格按定义文件输出结论。
汇总结构化结论,不再开放发挥。
读取进度文件,确认前置步骤完成,并标记当前阶段开始。
记录将要执行的命令、写入分析结果、把任务状态落地。
回读文件末尾,检查结果确实存在,再标记完成时间。
这套机制的本质,是用外部状态抵消模型的遗忘和偷步倾向,让它每一步都被迫重新看见先前结论。
参数从配置获取
campId / prizeId 来自配置或可信源
=> 非外部可控
=> 无漏洞
MCP 式通用能力会让模型不停思考“该不该调用、应该传什么参数”。领域工具则把这些决策提前固化到 Skill 中,让模型只剩下沿流程执行。
在人类日常语境里看起来相近的词,在大模型的语义空间中可能激活完全不同的范围。词越宽,模型就越容易把你没要求的东西也当成“合理输出”。
语义陷阱:相近词汇在模型语义空间里的激活范围差异巨大,宽边界词会突破 Prompt 原本建立的任务边界,从而诱发幻觉和越界判断。
如果你让实习生去仓库盘点“破损货物”,他通常会聚焦是否损坏;但如果你让他找“有问题的货物”,他很可能会把摆放不规范、标签歪了、灰没擦也写进报告。
加载语义陷阱词典,拿到已知高危词汇对和锚定策略。
从待检测 Skill 中提取核心术语、动作指令、约束词和输出描述词。
做词典匹配 + 上下文角色分析,识别宽边界词和结构性风险模式。
输出结构化报告,给出替换建议、边界锚定和修复优先级。
下次你发现模型“明明规则写得很清楚却还是自由发挥”,先别急着再堆提示词,先看看关键词是不是已经把它放出了围栏。