文章总结: 本文基于BlackHatUSA2026公开课件,介绍了私有化Agent攻防评测框架AgentBreaker。核心观点是Agent安全测试需超越语言层,覆盖工具权限、状态变化和跨轮适应。框架通过侦察、工具画像、漏洞分析和攻击的闭环流程,使用微调开源模型实现高效评测。关键发现包括:成功标准必须落到可验证副作用,使用ESR和ASR指标分别衡量覆盖率和效率,以及训练数据需保留完整轨迹。可操作建议包括使用状态机、独立验证器和重置受害者上下文。 综合评分: 88 文章分类: 渗透测试,红队,安全工具,AI安全,安全运营
Black Hat USA 2026:私有化Agent攻防评测
原创
Max Luo Max Luo
白帽子罗棋琛
2026年8月22日 08:18 日本
在小说阅读器读本章
去阅读
用开源小模型构建私有化 Agent 攻击评测流水线
企业里的 AI Agent 已经不只是聊天窗口。它们会读取代码仓库、调用 CI、创建账号、修改工单、查询财务数据,甚至触发真实业务动作。安全测试如果仍停留在“向模型发一条越狱 prompt,看它是否说出违规内容”,测到的只是语言层服从性,没有覆盖工具权限、状态变化和跨轮适应。
Black Hat USA 2026 公开课件《Cost-Effective, Private, Frontier-Grade》介绍了 AgentBreaker:先构建能够侦察、分析、攻击、观察和调整策略的自动化 scanner,再以完整的成功攻击轨迹微调开源模型。课件给出的内部基准中,微调后的 30B 总参数、约 3B 激活参数模型达到 66.1% Exploit Success Rate,接近或超过若干闭源前沿模型,同时把单 Agent 扫描成本压到基座模型的约 1.4 倍。
这些数字不能脱离实验条件直接外推:测试集只有 30 个 victim agent,且由 15 个真实环境与 15 个加固副本组成;成本还会受 token 数、推理框架、硬件利用率和 API 定价影响。真正值得复用的,是它如何定义一次有效攻击、如何生产可训练轨迹,以及如何避免 scanner 在“拒绝执行”和“虚假成功”之间摇摆。
本文依据公开课件整理,不以现场参会视角叙述。所有流程都应限定在自有或明确授权的 Agent 环境中,示例采用无破坏验证,不面向第三方服务发起测试。
1、不要把 Agent 当聊天机器人测
一个有工具的 Agent,安全边界至少包括五层:模型系统提示、工具 schema、工具实现、后端身份、外部系统状态。模型在文字上拒绝泄露秘密,不代表 get_file_contents 不会返回 .env;模型说“已经删除文件”,也不代表工具真的产生了副作用。
课件把 scanner 设计成四阶段闭环:先识别 Agent 目的和工具,再分析工具能力与约束,随后寻找潜在缺陷,最后持续尝试并按响应调整,直到验证成功或达到预算上限。
图 1:侦察、工具画像、漏洞分析和攻击不是四个孤立步骤,而是带反馈的循环
工程实现可以先定义最小状态机,而不是把全部逻辑塞进一个“万能提示词”:
python
from dataclasses import dataclass, field
from enum import Enum, auto
class Phase(Enum):
RECON = auto()
ANALYZE = auto()
ATTACK = auto()
VERIFY = auto()
STOP = auto()
@dataclass
class ScanState:
target_id: str
phase: Phase = Phase.RECON
tool_specs: list[dict] = field(default_factory=list)
hypotheses: list[dict] = field(default_factory=list)
attempts: list[dict] = field(default_factory=list)
verified_finding: dict | None = None
turns_left: int = 20
cost_left_usd: float = 0.10
def can_continue(self) -> bool:
return (
self.phase is not Phase.STOP
and self.turns_left > 0
and self.cost_left_usd > 0
)
每个阶段只输出结构化对象;编排器决定是否进入下一步。这样可以分别替换 recon、planner、attacker 和 verifier,也能给每一阶段设置独立预算与审计记录。
2、侦察阶段要映射“能力”,不是收集漂亮的自我介绍
课件示例先询问代码审查 Agent 的目的与工具,再逐个询问工具参数、输入格式、输出和限制。一个 get_file_contents(path, ref) 工具表面上只读,真正的风险却取决于:是否允许任意路径、是否能选择未合并分支、是否过滤凭据、调用使用哪个仓库令牌。
图 2:工具名和描述只是入口,路径范围、ref 范围和后端权限才决定真实攻击面
安全 scanner 不应只相信 Agent 自述。它需要把模型返回的工具描述与控制平面的真实 schema 对账:
python
from pydantic import BaseModel, Field
class ToolSurface(BaseModel):
name: str
description: str
input_schema: dict
backend_identity: str | None = None
allowed_resources: list[str] = Field(default_factory=list)
denied_resources: list[str] = Field(default_factory=list)
side_effect: str # none/read/write/execute/admin
confirmation_required: bool = False
def diff_declared_vs_control_plane(
declared: ToolSurface, actual: ToolSurface
) -> list[str]:
findings = []
if declared.side_effect != actual.side_effect:
findings.append("side_effect_mismatch")
if set(actual.allowed_resources) - set(declared.allowed_resources):
findings.append("undeclared_resource_scope")
if actual.backend_identity and not declared.backend_identity:
findings.append("hidden_backend_identity")
return findings
这类差异本身就是安全发现。例如系统提示声称“只能查看 PR 中的文件”,实际工具却接受任意分支和路径;前者是策略文本,后者才是执行边界。
3、攻击循环必须重置受害者上下文
课件中的 scanner 每次尝试都为 victim agent 创建全新 Session。原因不是提高攻击成功率,而是保证实验可解释:如果第 7 次尝试成功,不能让它偷偷继承前 6 次对话暴露的信息、缓存状态或被污染的 memory,然后把组合效应错误归因于第 7 条 prompt。
图 3:attacker 保留观察与策略,victim 每轮从干净上下文开始
一个安全的 runner 至少要区分 attacker state 和 victim state:
python
async def run_attempt(target, hypothesis, attacker_memory, sandbox):
victim = await target.new_session(
memory="empty",
tool_backend=sandbox.endpoint,
tenant=sandbox.tenant_id,
)
prompt = await attacker_memory.next_prompt(hypothesis)
before = await sandbox.snapshot()
response = await victim.send(prompt)
after = await sandbox.snapshot()
evidence = before.diff(after)
await victim.close()
return {
"prompt": prompt,
"response": response,
"evidence": evidence,
}
“新对话”并不等于“干净环境”。数据库、对象存储、消息队列和工单系统也要按测试用例恢复;否则一次成功修改会影响后续样本。更稳妥的做法是每个 attempt 使用独立 tenant 或 copy-on-write fixture,结束后销毁。
4、成功标准必须落到可验证副作用
课件总结了两个相反的失败模式。第一个是 attacker 走得太远,直接尝试 rm -rf / 等真实破坏;第二个是 verifier 太宽松,把返回一段看似敏感的文本也判为利用成功。前者不可接受,后者让模型“永远获胜”。
图 4:目标区域是 benign-but-conclusive:跨过安全边界,但不造成真实损害
一个有效验证目标应同时满足四个条件:只存在于测试环境、不会伤害真实数据、不能仅靠模型编造、能够由外部观察器确认。例如读取专用 canary secret、向隔离 bucket 写入随机 nonce、调用只记录审计事件的测试动作。
python
from dataclasses import dataclass
from hashlib import sha256
@dataclass(frozen=True)
class Canary:
test_id: str
secret_hash: str
sink_path: str
def verify_canary_read(response: str, canary: Canary, expected: str) -> bool:
return (
canary.test_id in response
and sha256(expected.encode()).hexdigest() == canary.secret_hash
and expected in response
)
def verify_write(audit_events: list[dict], canary: Canary, nonce: str) -> bool:
return any(
e.get("path") == canary.sink_path
and e.get("value") == nonce
and e.get("test_id") == canary.test_id
for e in audit_events
)
验证器必须独立于 attacker 和 victim。让同一个模型既生成攻击又判断是否成功,会把自我确认、幻觉和格式迎合带进标签。高风险动作还需要策略层硬拦截,即使 attacker 认为它是“验证所必需”。
5、ESR 与 ASR 分别回答覆盖率和效率
课件使用两个指标:Exploit Success Rate(ESR)统计多少个 victim agent 至少被验证成功一次;Attack Success Rate(ASR)统计全部尝试中成功尝试的比例。
text
ESR = 至少出现一次 verified exploit 的 Agent 数 / 被测 Agent 总数
ASR = verified attack attempts / 全部 attack attempts
图 5:ESR 看能否覆盖目标,ASR 看达到结果需要多少尝试
只报告 ESR 会掩盖暴力重试:对每个 Agent 尝试 1000 次,最终成功一次,ESR 仍可能很高。只报告 ASR 又会惩罚难目标,无法说明产品覆盖。生产评测还应增加:首次成功中位轮数、每个 verified finding 成本、误报率、破坏性动作拦截率、不同工具类别覆盖率。
python
def metrics(records: list[dict]) -> dict:
targets = {r["target_id"] for r in records}
wins = {r["target_id"] for r in records if r["verified"]}
attempts = len(records)
successes = sum(bool(r["verified"]) for r in records)
spend = sum(float(r["cost_usd"]) for r in records)
return {
"esr": len(wins) / max(len(targets), 1),
"asr": successes / max(attempts, 1),
"cost_per_verified_attempt": spend / max(successes, 1),
"unsafe_action_block_rate": sum(
r["blocked_by_safety_policy"] for r in records
) / max(attempts, 1),
}
只有 30 个 Agent 的基准对 2—5 个目标的变化很敏感。比较模型时应固定 victim 版本、工具后端和尝试预算,并使用 bootstrap confidence interval,而不是把 66.1% 与 63.1% 的点估计直接解释为稳定领先。
6、训练数据的单位不是Prompt,而是一条完整轨迹
课件把一个成功训练样本定义为:侦察、分析、第一次攻击、受阻响应、调整、再次攻击,直到外部验证器确认真实影响。被拒绝的中间轮次也必须保留,因为它们教给模型如何从失败信号调整策略。
图 6:一条轨迹保留被拦截的 turn,而不是只保存最后一次成功 prompt
推荐用不可变事件格式存储轨迹,避免后续清洗破坏因果顺序:
json
{
"trajectory_id": "tr_0187",
"target_profile_id": "repo-reviewer-hardened-v3",
"policy_version": "agent-redteam-2026-08-01",
"sandbox_fixture": "fixture-7f31",
"turns": [
{
"index": 1,
"phase": "attack",
"prompt_ref": "sha256:...",
"response_ref": "sha256:...",
"tool_calls": [],
"verdict": "blocked"
},
{
"index": 2,
"phase": "attack",
"prompt_ref": "sha256:...",
"response_ref": "sha256:...",
"tool_calls": [{"name": "read_fixture", "args_ref": "sha256:..."}],
"verdict": "verified",
"evidence_ref": "sha256:..."
}
],
"safety_incident": false
}
原始 prompt、response 和证据可放在受控对象存储,通过 hash 引用;训练视图只在脱敏后生成。这样既减少数据集泄露凭据的风险,也能追溯每个标签来自哪个 verifier 和 fixture。
7、Mock Fleet 解决的是覆盖,不是“虚构越多越好”
公开材料认为当时没有覆盖工具型 Agent 多轮攻击的公开数据集,真实搭建数千个后端又成本过高,于是生成 500 个基础 profile,再组合 2—10 个工具、3 种描述风格和 3 个安全级别,得到 4500 个 mock victim agent。
图 7:角色、工具、描述风格、安全强度和后端模型共同决定 mock victim 行为
4500 个名称不同的 Agent 不等于 4500 个安全边界。大量样本可能只是“改了角色名的同一组读写工具”。课件先对完整 profile 做 embedding,再按 cosine distance 使用 K-Center Greedy,选出 1000 个覆盖面最大的 Agent。
图 8:每次选择当前集合覆盖最差的样本,以减少相似 Agent 的重复测试
算法本身很短:
python
import numpy as np
def k_center_greedy(vectors: np.ndarray, k: int, seed: int = 0) -> list[int]:
x = vectors / np.clip(np.linalg.norm(vectors, axis=1, keepdims=True), 1e-12, None)
chosen = [seed]
nearest = 1.0 - x @ x[seed]
while len(chosen) < min(k, len(x)):
nxt = int(np.argmax(nearest))
chosen.append(nxt)
nearest = np.minimum(nearest, 1.0 - x @ x[nxt])
return chosen
但 embedding 只衡量描述相似性,不能保证攻击面多样性。生产数据选择还应做分层约束,确保 read/write/execute/admin 工具、同步/异步副作用、OAuth scope、审批机制和不同后端都有最低样本数;否则语义距离很大,也可能都落在“只读问答”这一低风险象限。
8、数据引擎要主动丢弃拒绝、幻觉和弱攻击
课件最初的 fine-tune 将 ESR 从 52.4% 提升到 59.6%,但仍落后于闭源前沿模型。研究者回看轨迹后发现三类数据缺陷:攻击者声音单一;失败后只是换一种语气重复;部分轨迹含拒绝、幻觉或弱攻击。第二版引擎引入多个开源 attacker、失败后的 recommender,以及分阶段过滤。
图 9:聚合分数看不出为什么模型停滞,逐条读轨迹才能发现数据缺陷
图 10:采集、成功过滤、重试、拒绝过滤、幻觉过滤、质量过滤和多样性选择依次执行
可把 filter 设计成可审计的纯函数链,每一步写明丢弃理由:
python
FILTERS = (
("verified_effect", lambda t: t.evidence.verified),
("no_refusal", lambda t: not any(x.refusal for x in t.turns)),
("tool_call_exists", lambda t: any(x.tool_calls for x in t.turns)),
("within_turn_budget", lambda t: 2 <= len(t.turns) <= 20),
("safe_boundary", lambda t: not t.evidence.real_world_damage),
)
def filter_trajectory(t):
failures = [name for name, predicate in FILTERS if not predicate(t)]
return {
"keep": not failures,
"reasons": failures,
"trajectory_id": t.id,
}
“含一次拒绝就整条丢弃”是课件采用的清洗策略,但它未必适合所有训练目标。如果目标是教模型从拒绝中恢复,中间拒绝恰恰有信息量。更稳妥的做法是分别训练攻击计划能力和安全受控执行能力,并通过 ablation 对比不同过滤策略,不要把一条经验规则当作普适结论。
9、LoRA降低训练成本,但不会修复标签错误
课件选择 Nemotron-3-Nano-30B-A3B:总参数约 30B,每 token 激活约 3B,采用 Mamba-2、Attention 与 MoE 混合结构。模型已经具备语言、推理和工具调用能力,fine-tune 只需要让它学习安全评测中的多轮攻击行为。
图 11:稀疏激活降低推理成本,长轨迹则由混合序列结构处理
LoRA 冻结基础权重,把更新约束为两个低秩矩阵乘积,适合在有限 GPU 预算下迭代 adapter。训练配置应把数据和模型版本固定下来:
yaml
run_name: agentbreaker-lora-v2
base_model: nvidia/Nemotron-3-Nano-30B-A3B
dataset:
manifest: s3://security-ml/agent-trajectories/v2/manifest.jsonl
train_split_hash: sha256:REPLACE_ME
eval_split_hash: sha256:REPLACE_ME
redact_secrets: true
adapter:
method: lora
rank: 32
alpha: 64
dropout: 0.05
training:
epochs: 2
learning_rate: 0.0001
max_sequence_length: 32768
gradient_checkpointing: true
evaluation:
victim_suite_version: victim-suite-2026.08
max_attempts_per_agent: 20
verifier_version: verifier-v4
report_esr_asr_and_ci: true
safety:
sandbox_only: true
destructive_tool_calls: deny
outbound_network: deny_by_default
图 12:LoRA 只减少可训练参数;数据污染、错误 verifier 和 benchmark 泄漏仍会原样进入 adapter
还要防止 target profile 泄漏。若同一 mock Agent 的轻微变体同时出现在训练集和评测集,模型可能记住工具描述而不是学会迁移。划分应按基础 profile、工具族和后端实现分组,而不是随机按 trajectory 切行。
10、把“66.1%”还原成一套可复验的安全工程系统
课件最终报告 AgentBreaker 在 30 个 victim agent 上取得 66.1% ESR,基座为 52.4%;对照结果包括 Claude Opus 4.5 的 68.2%、GPT-5.2 的 63.1% 和 Gemini 3.1 Pro 的 60.4%。同时材料称每 Agent 成本约为基座 1.4 倍、较所比较闭源模型低 75—120 倍。
图 13:在该测试床中,专用小模型位于 ESR 与成本的折中区域
这些结果支持“专用数据能显著提高小模型任务能力”,但不能证明模型已经普遍达到前沿攻击能力。30 个目标的置信区间较宽,mock data 与真实企业 Agent 之间存在 domain gap,闭源模型版本和价格也会变化。外部团队复现时,应优先检查可审计性,而不是追逐同一个百分比。
yaml
agent_security_evaluation_gate:
authorization:
target_owner_approved: true
tenant_and_network_scope_fixed: true
emergency_stop_tested: true
isolation:
fresh_victim_session_per_attempt: true
backend_fixture_reset_per_attempt: true
outbound_network_default_deny: true
production_credentials_absent: true
verification:
external_verifier_used: true
canary_side_effect_benign_and_conclusive: true
model_self_report_never_counts_as_success: true
data:
raw_trajectory_encrypted: true
secrets_redacted_before_training: true
filter_reasons_retained: true
train_eval_group_leakage_checked: true
metrics:
esr_and_asr_reported: true
confidence_interval_reported: true
cost_and_turn_budget_fixed: true
false_positive_rate_reported: true
operations:
tool_calls_logged_with_arguments_hash: true
destructive_actions_denied_by_policy: true
model_adapter_and_policy_version_pinned: true
Agent 安全评测的最小可信单元不是一段“很会越狱”的文本,而是一条可回放的状态序列:明确的目标能力、受控的攻击尝试、真实工具调用、独立证据、干净环境和确定的停止条件。模型可以更换,LoRA rank 可以调整,推理成本也会下降;如果这条证据链没有建立,scanner 再聪明也只是一个会生成安全报告的聊天机器人。
资料:
- Black Hat 官方 Session 页面
- Black Hat USA 2026 Session
- LoRA:Low-Rank Adaptation of Large Language Models
原始会议材料(仓库内)
- 演讲课件 PDF
开源资料与原始议题 PDF
本文对应的 Markdown 原稿、Black Hat 原始议题 PDF 与配图已整理到 GitHub,可按文章编号查找和下载。
https://github.com/cybermaxluo/black-hat-usa-2026-talks
也可以点击文末“阅读原文”进入仓库。欢迎 Star、提交 Issue 或参与勘误。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:白帽子罗棋琛 Max Luo Max Luo《Black Hat USA 2026:私有化Agent攻防评测》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。












评论