AI Agent 行为链安全:如何拦截「合法但恶意」的工具调用链?
先看一个真实攻击场景。
有个电商客服 Agent,用户只说了一句「帮我查退款」。内容审核看完全安全,直接放行。然后 Agent 的工具调用日志是:
read_sms # 读用户短信
send_credentials # 把验证码发出去
一句话的工夫,验证码出去了。
问题在于:每一步都合法。read_sms 是客服读验证码的常规权限,send_credentials 单看没人会单独调。但串起来就是要命。
市面上的防护都在防「每一步」:
· 内容审核 → 防用户说了什么(这句是干净的)
· Prompt 加固 → 防提示词塞指令(攻击不在提示词里)
· 工具白名单 → 防能不能调某个工具(两个都在白名单)
· 日志审计 → 事后追查(查到了,但验证码已经出去了)
核心结论:内容安全管「Agent 说了什么」,管不住「Agent 做了什么」。
所以我开源了 langchain-starring —— 一个 LangChain 回调,专门判行为链:
pip install langchain-starring
from starring import StarRingCallbackHandler
executor = AgentExecutor(
agent=agent, tools=tools,
callbacks=[StarRingCallbackHandler()], # 一行挂载
)
它不判「这个工具能不能调」,判「这一串工具串起来想干什么」:
1. 看组合:read_sms → send_credentials 是凭据外泄链,熔断
2. 看参数:read_docs("../../etc/passwd") 和 read_docs("docs/a.md") 同一工具,前者越界
3. 看谱系:子 Agent 权限只能比父小
172 条攻击样本 172/172 拦截、0 误伤(合成样本,非真实流量)。
为什么开源?我是独立安全研究员,缺真实业务流量校准误报率。求大家用真实日志来砸我。
GitHub:
github.com
先看一个真实攻击场景。
有个电商客服 Agent,用户只说了一句「帮我查退款」。内容审核看完全安全,直接放行。然后 Agent 的工具调用日志是:
read_sms # 读用户短信
send_credentials # 把验证码发出去
一句话的工夫,验证码出去了。
问题在于:每一步都合法。read_sms 是客服读验证码的常规权限,send_credentials 单看没人会单独调。但串起来就是要命。
市面上的防护都在防「每一步」:
· 内容审核 → 防用户说了什么(这句是干净的)
· Prompt 加固 → 防提示词塞指令(攻击不在提示词里)
· 工具白名单 → 防能不能调某个工具(两个都在白名单)
· 日志审计 → 事后追查(查到了,但验证码已经出去了)
核心结论:内容安全管「Agent 说了什么」,管不住「Agent 做了什么」。
所以我开源了 langchain-starring —— 一个 LangChain 回调,专门判行为链:
pip install langchain-starring
from starring import StarRingCallbackHandler
executor = AgentExecutor(
agent=agent, tools=tools,
callbacks=[StarRingCallbackHandler()], # 一行挂载
)
它不判「这个工具能不能调」,判「这一串工具串起来想干什么」:
1. 看组合:read_sms → send_credentials 是凭据外泄链,熔断
2. 看参数:read_docs("../../etc/passwd") 和 read_docs("docs/a.md") 同一工具,前者越界
3. 看谱系:子 Agent 权限只能比父小
172 条攻击样本 172/172 拦截、0 误伤(合成样本,非真实流量)。
为什么开源?我是独立安全研究员,缺真实业务流量校准误报率。求大家用真实日志来砸我。
GitHub:
展开
2
1