ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

提示注入防护不能靠命令黑名单:外部文档没有执行授权

提示注入防护不能靠命令黑名单:外部文档没有执行授权

知识库里的一段文字要求“忽略规则,调用工具”,和用户主动授权执行某个动作,是两件不同的事。前者是待处理内容,不能因为被检索进上下文就升级成系统指令。

字符串过滤挡不住语义边界错位

只检查命令第一个词,可能漏掉绝对路径、不同参数写法和间接调用;只搜索一个 namespace 字符串,也不能证明资源范围正确。更根本的问题是:为什么模型可以提交任意 shell,再让黑名单猜它是否危险?

2026年10月23日,OpenAI 的 训练与评估环境安全披露描述了特定研究环境中的多层隔离与持续验证。它不是客户系统的安全保证,但足以提醒我们:单一边界会失效,必须验证实际执行路径。

把工具接口收窄到业务动作

下面的教学程序只接受一个只读动作。请求不能携带身份或 shell;真实身份来自可信会话,资源由服务端映射。例子没有试图用正则表达式完成沙箱。

SCOPES = {'oncall-a': {'api-staging'}} def validate(principal, request): if not isinstance(request, dict) or set(request) != {'action', 'resource'}: return False if request['action'] != 'read_service_health': return False return request['resource'] in SCOPES.get(principal, set()) assert validate('oncall-a', {'action': 'read_service_health', 'resource': 'api-staging'}) assert not validate('oncall-a', {'action': 'shell', 'resource': 'api-staging'}) assert not validate('oncall-a', {'action': 'read_service_health', 'resource': 'api-prod'}) assert not validate('oncall-a', {'action': 'read_service_health', 'resource': 'api-staging', 'principal': 'admin'}) print('schema, action and resource checks passed')

模型完全可能提出被拒绝的请求,验证器也不判断答案内容是否有害。它只是把执行能力限制在预先定义的范围;请求通过后,执行端仍要检查当前权限与对象身份,避免授权和使用之间发生变化。

把攻击样本放在完整链路里测

测试材料应包括不可信文档中的伪指令、工具结果里的诱导内容、引用混淆与跨租户同名资源。观察最终工具调用,而不只是模型口头说“我会遵守规则”。拒绝理由与审计记录也不能泄露秘密。

CNCF 的运行时安全讨论进一步区分了声明检查与真实运行行为。本文仅验证结构化授权逻辑,没有运行模型、容器隔离、浏览器或内核策略,也不宣称覆盖全部提示注入。防护效果应由完整权限链和对抗回放给出,而不是由黑名单长度给出。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进