大模型下的深度强化学习的多智能体渗透测试(3)
PenGym 单智能体 izumi 当日进展报告:D3QN-v2 训练评估链路已打通,但当前策略仍陷入局部失败循环
一、这篇文章要说明什么
这份记录只描述今天真实完成的事情,不描述理想路线。
今天的结果可以概括为四点:
- 已新建
prototype/drl_izumi/单智能体 DRL 实验线,并采用 D3QN 作为当前学习型izumi的核心决策模型。 - 已完成 D3QN-v2 训练链与评估链的工程打通,训练不再停留在“规则 agent”或“脚本报错”阶段。
- 已定位并修复一批关键接口级 bug,使训练能够真正进入参数更新阶段。
- 当前模型虽然已经具备深度强化学习训练能力,但评估结果显示策略质量仍然较差,主要表现为重复执行局部失败动作循环。
因此,今天最准确的阶段判断是:
- D3QN-v2 单智能体 DRL 工程链:已打通
- 当前策略效果:仍不理想,尚不能替代规则版
izumi - 下一步重点:不再是修接口,而是抑制循环行为、加强动作约束与奖励设计
二、今天的工作目标
今天的目标,不是继续扩展规则路径,也不是继续尝试 PPO,而是做一件更基础但必须先完成的事:
把 izumi 的学习型分支真正跑起来
也就是说,今天聚焦的是:
- 建立独立的
drl_izumi目录; - 以 D3QN 为核心实现单智能体学习型
izumi; - 跑通训练;
- 跑通评估;
- 判断当前策略到底是“不能训练”,还是“能训练但学歪了”。
三、今天实际新建和修改的内容
今天在仓库中实际建立了新的 DRL 目录:
1 | prototype/drl_izumi/ |
其中至少包括:
state_encoder.pyvalid_actions.pyq_network.pyreplay_buffer.pytrain_ddqn.pyeval_ddqn.py
这些文件构成了当前单智能体 DRL 版 izumi 的独立实验线。
1. 状态编码层
当前版本先采用较保守方式:
- 将环境 observation 直接转为
float32 - 再拉平成固定维向量
这意味着当前单智能体 D3QN 直接使用的是 PenGym/NASim 输出的向量化观测,而不是额外构造图状态或高级语义表示。
2. 合法动作约束层
今天的 valid_actions.py 已经不再是“全动作开放”,而是加入了第一版启发式动作过滤逻辑。
此前实验中已经确认:
- PenGym 当前原生
get_action_mask()在初始状态会返回全 0 mask,不能直接用; - 因此今天采用了启发式合法动作过滤作为第一版替代。
该版本的动作过滤已经能挡掉一部分明显无意义动作,例如此前导致策略死循环的:
SubnetScan: target=(5,0)
在新版本里已经不再是默认可选动作。
3. Q 网络结构
今天已经将原本普通 DDQN 骨架升级为:
Dueling Double DQN(D3QN)
也就是说,当前学习型 izumi 的核心网络不是简单 Q Network,而是:
Double DQN的 target 估计方式Dueling Network的状态价值 / 动作优势分离结构
因此,当前实验线的准确说法应为:
D3QN-v2 单智能体
izumi
四、今天修复了什么问题
今天最大的进展之一,不是“效果变好了”,而是:
把一整条原本会在 episode 7 中途崩掉的训练链修通了
1. 首个关键问题:ReplayBuffer 接口不一致
在给 replay_buffer.py 加入 Prioritized Replay 之后,sample() 返回值发生了变化。
原先 optimize() 仍按旧接口解包,因此导致训练在第一次进入学习阶段时报错:
1 | ValueError: too many values to unpack (expected 7) |
这一问题在今天已被定位并修复。
2. 第二个问题:optimize() 调用参数未补全
在把 optimize() 改成接收 beta 参数后,训练循环中的调用仍保留旧写法,导致后续又出现:
optimize()参数不匹配问题
这个问题本质上仍然属于:
PER 集成链没有一次性改全
今天这部分也已继续修复。
3. 第三个问题:beta_schedule() 及其依赖未补全
在继续向前推进时,又出现:
beta_schedule未定义BETA_START/BETA_END未定义
日志已经明确指出,训练在首次尝试进入 PER 学习分支时,会在:
1 | beta_schedule(global_step) |
这里崩掉。
今天后续已经把:
PRIO_ALPHABETA_STARTBETA_ENDPRIORITY_EPS
补回到 train_ddqn.py 中,使训练链继续向前推进。
4. 当前判断
因此,今天修的不是“随机小问题”,而是一整条D3QN + PER 工程集成链上的连续接口问题。
这说明:
- 环境并不是主要矛盾;
- 当前 bug 的主要来源,是 DRL 分支在从 v1 向 v2 演化时,多个模块接口没一次性对齐。
五、今天最重要的工程结果
今天最关键的结果,不是某个 exploit 成功,而是:
D3QN-v2 训练链已经真正跑通,并且训练已经进入参数更新阶段。
此前很多轮训练都停留在:
global_step < LEARN_STARTmean_loss = 0
这意味着它们实际上只是经验收集,还没有真正开始学习。
但在今天后续的训练结果里,已经出现了:
global_step持续推进直到20000mean_loss不再是0.000000- 训练日志能连续输出到后期 episode
- 程序不再在 episode 7 中途因为 PER 接口 bug 崩溃
这说明:
学习型 izumi 已经真正具备深度强化学习训练能力。
这一步非常关键,因为它和之前“只有规则 izumi 可运行、学习版一直停在接口报错”已经是两个阶段。
六、今天的评估结果说明了什么
虽然训练链已经打通,但当前策略质量仍然较差。
从评估日志可以看到,当前模型并没有形成有效渗透路径,而是陷入了明显的局部循环,重复执行以下几类动作:
ServiceScan: target=(2,1)Exploit e_ftp: target=(2,1)PrivilegeEscalation pe_daclsvc: target=(6,1)
而且这些动作往往会反复产生:
permission_error=TRUEFAILUREreward = -1.0
例如,在评估后期,动作 190、41、36 会以明显循环方式重复出现,分别对应:
PrivilegeEscalation: target=(6,1)Exploit: target=(2,1), service=ftpServiceScan: target=(2,1)
当前评估的准确结论
当前 D3QN-v2 的行为并不是“完全无动作”,也不是“无法执行环境交互”,而是:
已经能动作、能训练、能评估,但学到的是一个低质量局部循环策略。
换句话说:
- 工程问题:今天已经基本打通
- 策略问题:今天首次被清晰暴露出来
七、今天到底完成到了哪一步
如果只用一句话准确描述今天阶段,最合适的表述是:
已完成
prototype/drl_izumi/单智能体 D3QN-v2 分支搭建,修复了 Prioritized Replay 集成过程中的多处接口级 bug,使学习型izumi能够真正完成训练与评估。但当前训练后的策略仍未收敛为有效渗透策略,评估中主要表现为重复执行低价值失败动作循环。
这句话比“已经做成了 DRL izumi”更准确,也比“完全没做成”更符合事实。
八、今天的阶段性成果总结
今天已经真实完成的内容包括:
1. 工程层
- 新建
prototype/drl_izumi/目录; - 建立 D3QN-v2 单智能体训练脚本与评估脚本;
- 补齐状态编码、动作过滤、Q 网络、ReplayBuffer 等基础模块;
- 修复 PER 集成链上的关键接口 bug。
2. 训练层
- 学习型
izumi已能在 medium-multi-site 场景下执行完整 D3QN 训练; - 训练不再停留在纯经验积累阶段;
mean_loss已经不再长期保持 0;- 说明参数更新过程已经真实发生。
3. 评估层
- 可加载训练后模型进行评估;
- 评估说明当前策略不是“不会动”,而是“会动但学歪了”;
- 策略表现为局部重复失败动作循环。
九、当前还没有完成的部分
今天虽然把 DRL 训练和评估打通了,但以下内容仍未完成:
1. 当前学习型策略还不能替代规则 izumi
规则版 izumi 仍然是目前可复现、可演示、可完成有效攻击路径的稳定基线。
而当前 D3QN-v2 只能说明:
- 已具备训练能力
- 尚不具备稳定策略能力
2. 当前动作约束仍不够强
目前的 valid_actions.py 只能挡掉部分明显坏动作,但仍无法阻止:
- 已知目标重复扫描
- 已失败 exploit 反复尝试
- 已失败提权反复尝试
3. 当前奖励设计不够区分“推进”和“空转”
从评估行为看,模型还没有被足够强地惩罚:
- 重复无效扫描
- 重复失败 exploit
- 重复失败 privesc
同时也没有被足够清晰地鼓励:
- 新信息发现
- 首次成功扫描
- 首次成功 exploit
- 首次成功提权
- 子网发现
十、下一步最合理的推进方向
今天之后,下一步不应该再把主要精力放在“修接口”上,而应该转到:
抑制策略循环与提升收敛质量
当前最合理的顺序是:
1. 先加强动作约束
优先在 valid_actions.py 中加入反循环机制,例如:
- 同一目标已扫描过后,本 episode 不允许重复
service_scan - exploit 连续失败后,临时屏蔽相同 exploit 重试
- privesc 连续失败后,临时屏蔽相同提权动作重试
2. 再做 reward shaping
明确区分:
- 新信息探索
- 首次成功 exploit / privesc
- 子网发现
- 重复失败动作
- 重复扫描已知目标
3. 之后再继续比较 v1 / v2 / v3
这样后面每一轮实验才能回答清楚:
- 到底是哪一刀起作用
- 是动作约束改善了循环
- 还是奖励设计改善了收敛
十一、这一阶段最准确的结论
今天最重要的意义,不是“已经得到最终智能体”,而是:
第一次把学习型 izumi 从“不断接口报错”推进到了“能够真实训练和评估”的阶段。
这意味着当前项目已经不再只是:
- 规则基线 + 独立 PPO 脚本
而是已经拥有:
- 一条独立的 D3QN 单智能体实验线
- 可训练
- 可评估
- 可继续优化
这一步非常关键,因为没有这一步,后面所有关于:
- 收敛
- reward
- action masking
- 多智能体扩展
- LLM 上层编排
都没有工程落点。
十二、总结
当前最准确的当日总结是:
今天已完成
prototype/drl_izumi/单智能体 D3QN-v2 深度强化学习实验线的工程打通,修复了 Prioritized Replay 集成过程中的关键接口问题,使学习型izumi首次具备了真实训练与评估能力。但当前训练结果显示,策略尚未收敛为有效渗透行为,而是主要陷入局部失败动作循环。下一步工作重点应从“修接口”转向“加强动作约束与奖励设计”,以提高策略质量并逐步接近可替代规则基线的学习型izumi。
