24 KiB
Bug 表核对与修复
范围:2026-10-06 用户提供的 Bug记录表.xlsx。只修复当前仓库已有功能的已确认缺陷。表内命令和建议只作为待核实证据。
工作流与维护门禁
- 阶段:P10 缺陷修复。既有代码、接口、测试为上游依据。
- 分支:codex/bug-sheet-fixes;完成验证后合入 main。
- 维护策略:narrow_fix。对大文件仅做局部修复,新增测试放独立文件,不做广泛重构。
- 验收:复现/代码证据确认问题;针对性回归通过;相关包和全仓检查;提交仅包含修复、测试、文档,不包含真实配置或凭据。
- 生命周期记录合并到本文,避免针对同一缺陷制造无关阶段提交。
已确认待修复
| 表内条目 | 证据 | 修复计划 |
|---|---|---|
| C2 wait/cancel 资源权限 | handler 直接按 ID 查询和取消,缺少 c2ResourceAllowed | 与同模块接口一致,先校验任务访问权限,再执行 |
| 32 纯文本批量/机器人任务缺少执行证据 | batch_queue_executor 和 finalizeRobotAgentSuccess 显式传 true | 与普通对话的默认策略一致,允许无工具文本回复,保留 pending/HITL 检查 |
| 30、31 角色名路径字符/长度 | 名称未校验,文件名会转换,存在碰撞 | 拒绝路径和控制字符、首尾空格、超过 64 字符及文件名碰撞 |
| 工作流悬空引用 | 角色保存与工作流删除均未检查引用 | 保存时验证存在;删除引用中的工作流返回冲突 |
| 4 登录用户名为空 | 前端无 required,后端空用户名默认 admin | 登录接口及页面拒绝空白/超过 64 字符用户名 |
| Profile UA/响应头/Jitter 保存丢失 | 前端 snake_case 与后端 camelCase 不一致 | 对齐 JSON 字段;保留 0;拒绝负值/倒置范围 |
| 22 取消后显示成功 | 回传结果无条件更新任务终态 | 终态保持不变;取消和结果写入使用状态条件检查 |
| 同 UUID 旧连接断开误判离线 | WS defer 无条件删当前连接及标记 dead | 仅当前登记连接可以删除并退役会话,结束心跳 goroutine |
| 23 WebShell 目录路径及假条目 | normalizeWebshellPath 删除根斜杠;权限兜底正则接受 ls 错误行 | 保留 Unix 绝对路径;树/面包屑/父级保持绝对路径;只接受权限格式目录项 |
| 6 查看通知未清计数 | 查看回调只跳转 | 查看普通事件后标记已读并刷新;待审批通知仍保留待处理状态 |
| 13 配置接口明文返回 API Key | GetConfig 序列化真实配置 | 返回掩码;保存时按原配置路径还原;模型测试在服务端解析指定通道凭据 |
| 19 WebShell 口令明文回显 | 列表和创建/更新响应返回 Password | 响应掩码;保存时保留/替换/清空;执行按有权限的 connection_id 取服务端凭据 |
| Markdown 智能体字段与重复 ID | 保存缺少关键字段和 ID 唯一性检查 | 创建/更新统一校验 name、ID、指令;ID 不允许文件间重复;创建使用排他文件写入 |
| 辅助文件编辑描述丢失 | 辅助文件保存接口不更新 SKILL.md 元数据 | 辅助文件禁用描述编辑;描述未保存时阻止切换文件,提示先保存 SKILL.md |
| C2 终端输出粘连/尾部分号语法错误 | Unix 探测直接追加 && pwd,结果按最后一行切分 |
使用随机分隔标记和换行探测,保留用户命令的输出及退出状态 |
| 事实正文的关系语法未生成图谱 | 关系字段是显式结构化输入,普通正文不是通用关系解析器 | 按问题表给出的替代方案,明确提示关系应填写到关系字段;保持既有正文语义 |
不适用
当前仓库未实现的用户容器并发配额、容器生命周期和容器释放后重新调度,不添加对应实现。
验证
go test ./internal/handler ./internal/app ./internal/agentfinalizer通过。- 新增 C2 跨用户禁止等待/取消、所有者正常操作、机器人纯文本交付、角色名称边界、工作流引用、登录用户名测试。
- 前端已有测试存在 HITL 断言失败,正在核实基线;未修改 HITL 脚本。
- 当前尚未完成全部表内条目核对,也尚未合入 main。
go test ./internal/c2 ./internal/database通过;新终态保护及连接替换测试通过。- Profile API 持久化/无效 Jitter 测试和前端实际提交字段测试通过。
- 前端 HITL 断言问题在原始提交
82b0af1的隔离导出目录也可复现,属于基线问题。 go test ./...全仓通过。- WebShell 路径、错误输出、目录树测试与通知查看/待审批区分测试通过。
- 配置凭据处理保留既有字段与空字符串清除语义;掩码标记只用于已保存的同路径凭据,新通道不能直接保存掩码。通道探活新增可选
channel_id,模型列表/审查测试支持可选凭据范围,避免同 URL 多密钥选择错误。 - 新增 GET 配置不泄漏/不变更内存、掩码保留/替换/清空、歧义拒绝、WebShell 回显及执行凭据、Markdown 创建/更新唯一性、技能描述切换测试。
- C2 Shell 回归只提取模板中的 Shell 辅助函数,不运行传输循环。验证无换行、有换行、尾部分号、注释、失败退出、带空格目录切换;Unix 系统通过,Windows 路径未修改。模板修复适用于重新生成的客户端。
追加:输入校验、权限入口与回传归属
- Excel 第 40 行:权限管理页三个新建角色/添加成员按钮补上
rbac:write标记,复用现有隐藏、禁用与点击守卫。前端用权限被拒绝的真实守卫验证入口不可见且不可点击。 - Excel 第 41 行:并发数内联编辑对空值、小数、0、9 等明确报错并保留编辑框,不发送请求;队列元数据更新在任何修改前拒绝越界值。保留旧配置加载时的归一化行为。
- Excel 第 42 行:项目设置前端和更新 API 均拒绝空/纯空格名称;API 省略名称仍允许部分更新,拒绝时描述等字段不发生部分保存。
- Excel 第 44 行:后端 URL 补齐使用
IP 非空作为分支条件,导致已由前端解析的 IP 被再填入 Domain。改为先判别 URL 主机类型再补齐缺失 IP;IPv4、IPv6 预填及仅 URL 三条数据库保存回归通过。第 22 行截图与第 25 行为同一 WebShell 路径丢失/错误文本条目问题。 - Excel 第 36 行:WebSocket 与 TCP Beacon 回传按连接已登记的会话和监听器校验;HTTP 回传及取任务先校验监听器;已有 UUID 不允许通过其他监听器重新登记改变归属。未授权回传不能更改任务状态、结果或产生完成事件。HTTP 同监听器下的会话认证尚待继续核对,本项不标为全部完成。
- 验证:
form-validation.test.cjs4 项通过;项目空名称无部分保存、并发数非法无修改、IP URL 入库及结果来源拒绝均新增回归。全部包回归在提交前再次执行。
追加:工作流与现有行为核对
- Excel 第 26 行:新建工作流 ID 限制为以字母/数字开头,仅含字母、数字、下划线、连字符,最多 128 字节;重复 POST 使用数据库原子插入保护,返回 409 且不改变旧版本;PUT 不得更改 ID,不存在目标返回 404。已存储的旧格式 ID 仍可原位编辑。
- Excel 第 31 行:工具 arguments 先解析 JSON,再递归展开字符串中的
{{inputs...}}等模板,避免带引号/换行的值破坏 JSON;显式字段绑定保持优先。实际工作流调用测试工具,验证传入值已展开且原始引号完整保留。 - Excel 第 45 行:流式和非流式入口统一使用工作流自身状态进行最终回复检查,不强制要求本来不应存在的工具执行记录;实际 start→output 流程能完成,真实 HITL 暂停/拒绝流程保留 awaiting_hitl/cancelled 和拒绝原因,不变成 missing_execution_evidence 或成功。
- Excel 第 62 行:列表/详情 API 附带图校验错误;前端将错误显示为“校验未通过”及错误色,当前选中草稿的本地校验变化同步更新列表与画布标题。配置的 enabled 值保留,以免验证展示改变用户保存的数据。
- Excel 第 11 行:当前 HTML 的
fact-modal-summary标注“摘要(索引一行)”,saveFactModal读取 summary 并必填检查,已存在原描述称缺失的字段。第 16 行是跨项目去重建议,当前list_vulnerabilities按授权项目/会话列举以避免重复,不新增跨项目合并。第 17 行原记录已注明没有点击保存;当前 tool-guard 草稿变更有未保存标识,只有保存动作 PUT 才改变服务端配置。 - Excel 第 57 行:执行当前
resetAuditLogFilters与查询参数构建函数,验证关键词、类别、动作、结果、时间条件全部清空,页码回到 1,模板按钮调用此函数。原描述在当前实现未复现。 - 验证:新增工作流保存/API 校验、纯文本与 HITL 实际运行、实际工具参数传递、列表标记和审计重置回归;后端完整测试及新增前端测试在提交前执行。
追加:密码表单反馈与传输核对
- Excel 第 3、6 行:登录空密码通过自定义校验展示原因并聚焦字段,编辑后清除旧错误;显示/隐藏密码按钮在关闭或重新打开登录时恢复隐藏。修改密码显示当前密码必填、新密码长度与确认不一致的具体原因,服务端失败也保留在表单中。
- 四项真实脚本回归通过;隔离预览使用实际模板片段与样式,在 375px 登录布局和桌面密码表单中验证提示、焦点和按钮。预览未使用真实账号凭据。
- Excel 第 4 行:HTTP 下请求体可被截获,属于部署传输配置风险。当前服务已有 TLS、HTTP 到 HTTPS 重定向和同端口协议分流;现有 TLS/重定向测试通过。应在部署中启用 HTTPS,未加入额外客户端加密协议或改动凭据配置。
追加:资产语言与导入兼容
- Excel 第 8、9 行:截图与模板对照证明灰色 CN/Beijing 是 placeholder,省市是手工输入,不是时区识别结果。示例增加中、英、俄翻译;不修改用户保存的地理字段,也不新增地区识别或联动能力。
- Excel 第 10 行:CSV 与 XLSX 表头采用当前语言,环境、重要性、状态与已知风险等级显示本地化标签。原始地址、地区、项目、标签、未知枚举值保持原样。导入兼容旧英文列名与当前语言的导出列名、枚举值。
- 验证:7 项测试通过,包含使用仓库内实际 SheetJS 生成和读取 CSV/XLSX,再调用真实导入解析;中、英、俄三种语言均验证地址、项目归属、带引号/换行标题、标签和枚举值不丢失。
追加:监听器表单与保存入口
- Excel 第 50 行:编辑保存使用 document 点击委托,但 c2-modal 内层 inline stopPropagation 阻止按钮到达委托。移除内层阻断;背景关闭本来已检查 event.target===this,不会因内部点击关闭。验证实际委托分发到真实 saveListener 后发送 PUT 并在成功后关闭。
- Excel 第 23 行:名称、类型、端口增加必填标识;创建/编辑均提示并聚焦具体错误字段,端口仅允许 1–65535 整数,不再接受 parseInt 的小数或尾随文本。网络/响应解析失败显示错误并保留表单。
- 编辑 API 在修改字段前检查空名称和端口范围;数据库回归验证非法请求不部分保存、合法编辑正常落库。5 项前端测试和针对性后端测试通过。
追加:回连地址生成校验
- Excel 第 52 行:截图中的
bad host/abc原先会直接拼入 URL。单行生成与 Beacon 构建均在生成前校验 IP/DNS 主机名,拒绝协议、路径、端口、空格、非法数字 IP 与命令片段;不执行 DNS 查询,也不改变地址解析优先级。 - URL 以监听器协议生成,HTTPS 使用 https;IPv6 使用 net.JoinHostPort 补齐方括号,普通域名及 IPv4 保持原格式。
- 主机校验覆盖全部单行类型;真实 API 验证非法输入返回 400、合法域名与 IPv6 正常生成,测试仅使用 test-only-token。
追加:重复包提示与关联事实查看
- Excel 第 28 行:现有预检已经区分相同内容和 ID 冲突,后端跳过/保留不会覆盖本地数据;确认动作仍用于记录冲突处理。按钮明确改为“确认跳过导入”或“确认保留本地版本”,结果分别显示“已跳过导入”“已保留本地版本”。创建、覆盖确认及另存语义保留。14 项既有与新增包导入测试通过。
- Excel 第 15 行:关联事实入口原先先切到 facts 并清空筛选,改为留在当前页面查询并直接打开详情;无关联只提示,多条取消也留在原页。4 项实际函数回归覆盖单条、空集合、多条选择/取消和 API 失败,不再发生列表导航或筛选重置。
追加:知识库索引提示与工具挂载核对
- Excel 第 53 行:原截图的服务错误明确为 401 Unauthorized/Incorrect API key。页面改为按认证、权限、限流、超时、网络错误给出对应检查建议,保留原错误供定位;未知错误不推断原因。状态 API 不再五分钟后隐藏失败,下一次索引由现有 resetLastError 清除;空知识列表也显示已有失败。实际状态渲染与错误保留回归通过。
- Excel 第 54 行:当前启动、动态初始化及 ApplyConfig 路径均注册知识检索工具;真实 RegisterKnowledgeTool + Agent.ToolsForRole 验证默认角色和显式允许角色均含搜索/风险列表定义,显式不允许角色不被绕过。截图只有模型回复,缺少当时启用配置、工具目录和角色列表,不能据此证明当前注册缺陷;本项标为当前未复现,保留历史证据不足的限制。
追加:nmap 参数拼接
- Excel 第 47 行:截图显示 NSE 将
-sT当作脚本名,原因是 scan_type 根据“最后一个非标志参数”找插入位置,遇到 additional_args 的 --script 值时插入到了标志与值之间。nmap 的 scan_type 改为置于参数列表开头,保留各 flag/value 相邻关系;其他工具的既有插入规则保留。 -sC与 --script 不是互斥错误;官方说明明确有 --script 时忽略 -sC,故不新增错误拒绝规则。来源:https://nmap.org/book/man-nse.html 。- 读取真实 tools/nmap.yaml 验证截图参数、nse_scripts 字段和尾部 --max-retries 值的完整顺序;既有空可选参数测试通过。测试不向目标发送扫描;本机没有 nmap,因此不声称完成实际扫描验证。
追加:批量队列结果标签
- Excel 第 58 行:截图的子任务为 failed,队列 completed 表示所有子任务已经结束;绿色“已完成”和 100% 被误认为全部成功。列表和详情共用展示函数,现在全部失败显示失败色及“执行失败”,部分失败显示“已结束(N 项失败)”,详情解释进度统计结束任务,包含失败/取消。后端生命周期和重跑规则不变。
- 3 项实际展示函数回归覆盖全失败、混合结果、成功、运行中及已有周期队列的后续运行信息;不扩展调度能力。
追加:Agent 取消竞态与最终事件
- Excel 第 24 行:AgentTaskManager 原先允许取消之后的 UpdateTaskStatus/FinishTaskRun 覆盖终态。明确用户取消增加单向取消标记,晚到的 running/completed/failed 更新及 completed 收尾仍保存 cancelled;“中断并继续”不设置该标记。
- 主 SSE 收尾从实际已保存任务取 status,保留原消息字段且不修改调用方对象;前端 done 不再一律覆盖为成功标题,取消/失败/超时/清理异常使用实际结果,取消时遗留工具调用标记取消。任务 eventBus 本来已有真实 status,保持不变。
- 新增取消晚到更新、正常继续、done 实际状态与前端展示回归;完整 handler 包测试通过。Excel 第 60 行仍需审批等待中断的完整路径验证,暂不声明该历史场景全部完成。
追加:审批等待取消的闭环验证
- Excel 第 60 行:真实数据库中创建会话/助手消息,启用人工审批,实际 waitHITLApproval 发出 pending 后通过 AgentTaskManager 取消;验证等待返回 context.Canceled、审批记录 cancelled、任务从活跃列表移除、历史与 done 均 cancelled。测试不调用真实模型或扫描目标,因此证明审批/任务收尾路径,不能重建截图中的远端模型过程。
- done 分支的进度控制按钮也按终态显示,不再再次写“已完成”。真实分支执行验证取消、失败和成功标题、控制文案与遗留工具状态;保留已收到工具终态的结果。
列表标签布局(表格第 12、13、43 行)
事实列表置顶和关联信息改为统一的可换行容器,关联漏洞 ID 增加明确标签及完整 ID 提示。资产项目标签原最大宽度 180px 超出 126px 列宽,现限制为单元格内容宽度并显示省略号及完整名称提示。使用实际样式表和代表性长名称进行本地浏览器布局检查:项目标签宽 98px,右边界位于单元格内,相邻归属文本保持可见。此检查覆盖标签布局,未作为完整应用流程验证。JavaScript 语法与 diff 检查通过。
工作流节点文字边界(表格第 27 行)
默认空白换行不能拆分连续中文,固定 52px 高度也无法容纳长标签。现允许按字符换行,普通节点按标签高度扩展并保留最小高度与内边距;条件节点扩大到 150px,文字超过安全宽度时省略,完整值仍在节点属性面板。使用仓库 Cytoscape 与实际节点样式在本地浏览器检查截图中的中文标签及连续长标签,确认节点内显示。相关 13 项工作流测试、语法和 diff 检查通过。换行属性依据 https://js.cytoscape.org/ 官方文档。
侧栏标题及仪表盘项目标签(表格第 2、18 行)
最近对话标题的 flex 子元素填满剩余空间,但原生按钮默认文本居中,导致标题偏向中间。增加明确左对齐。第 2 行截图未提供其他可识别重叠证据,未重新设计侧栏。仪表盘项目标签使用居中 inline-flex 时长文字会首尾裁切且不产生省略号,改为普通块级文本截断,完整名称保留既有 title。实际样式表与代表性 DOM 在 1280px 和 375px 视口下验证:标题左对齐,长项目名称尾部省略,相邻文本可见。此验证不覆盖完整应用交互。
工作流进度及已有工具超时配置核对(表格第 29 行,继续核对)
当前 Agent 回调会转发 iteration、tool_call、tool_result 并附带工作流及节点标识,新增回归测试确认此路径;原截图没有运行日志,尚不能确认历史零进度原因。发现已有工具节点 timeout_seconds 虽校验却未执行,现将配置期限传给 MCP 后台执行服务的硬超时,兼容后台等待分离机制,不影响未设置期限的任务。实际慢 MCP 工具测试确认 1 秒期限触发失败;执行服务测试确认等待方取消不抹掉明确期限、不延长已有更短硬超时、期限后迟到成功保留 hard_timeout 及结束时间。工作流和 MCP 包测试通过。此修复不宣称解决 Agent 节点历史全程零进度,也未新增 Agent 超时配置。
单资产有限核验范围和写回提示(表格第 48 行)
默认单 Agent 系统提示中的持续深挖、穷尽攻击面和赏金门槛要求,与只读连通性/指纹任务完成条件冲突。现以本轮目标限制执行深度,403/认证失败等按核验目标如实报告,达到目标后结束,仍保留明确全面评估任务的验证要求。自定义资产模板此前替换掉默认模板中 complete_asset_scan 指令,现保留用户模板内容并追加完成后的现有记录动作,不增加探测范围;已有写回指令不重复。新增前端测试验证限定核验模板、资产 ID、写回提示及无额外漏洞/弱口令探测提示。Agent 包测试、资产工具和数据库测试通过,后者覆盖实际 complete_asset_scan 回写时间、会话及漏洞数量。未运行真实模型探测,提示修复不能证明所有模型均会及时结束;历史长时间行为仍保留验证限制。
HTTP 文件上传归属检查(表格第 36 行扩展路径)
HTTP 上传端点此前只验证共享监听器凭据与任务 ID 路径,未校验任务会话归属。现上传前查询任务及其会话,拒绝其他监听器任务。回归测试验证外部监听器不能覆盖已有文件、所属监听器正常上传可用;原路径安全测试增加真实任务/会话夹具。C2 包测试通过。文件下载端点使用独立 file_id,不可直接当 task_id 校验,未以错误映射限制下载;同监听器会话隔离及下载文件归属继续核对。
HTTP 会话及文件端点隔离(表格第 36 行)
HTTP 原共享监听器凭据无法证明具体会话身份。现生成客户端为每个运行实例产生随机独立 X-Session-Token,数据库只保存 SHA-256 哈希;首次身份绑定不可覆盖,已有无绑定身份不得由仅知 UUID 的客户端认领。心跳、任务领取、结果回传和文件读写均检查独立凭据;文件下载通过任务 payload.file_id 关联真实所属会话。生成 Go 客户端所有 HTTP 请求同步携带会话凭据,curl 心跳客户端同步生成并携带凭据。双会话回归覆盖正常重连、任务领取、结果回传、文件读写及缺失/其他会话凭据拒绝,验证不修改其他任务或文件。身份测试覆盖哈希存储、旧身份禁止认领和跨监听器拒绝。C2/数据库测试通过,Go 客户端 Linux/Windows/macOS 编译通过,未执行生成客户端。
升级兼容:原 HTTP 客户端没有独立会话凭据,不能继续通过新校验,需要重新生成客户端;新实例使用新身份,不自动接管旧实例任务。自定义 HTTP 客户端需生成至少 32 字符随机凭据、首次注册携带并在同一实例后续请求保持一致。旧会话和任务记录保留。此要求是修复共享身份绕过所必需,未保留可绕过校验的旧协议入口。
离线命令收尾及串行派发(表格第 37 行)
看门狗原仅标记会话离线,已发送命令无错误和完成时间。现对 dead 会话已发送 exec/shell 命令,超过客户端既有 timeout_seconds(默认 60 秒)加最小宽限期后写失败、完成时间及远端终止尚未确认说明;不推断远端进程已经停止。显式长超时、queued、成功/取消及非命令任务不受影响,迟到成功不能覆盖失败终态。TCP 串行客户端原一次领取多条并提前标记 sent,现同会话有 sent/running 任务时不再派发,一次领取一条,后续任务保持 queued。回归覆盖离线默认超时、300 秒显式期限、等待任务、正常终态、非命令任务、迟到成功与串行下一任务派发。C2 包测试通过。
历史工作流进度核对结论(表格第 29 行)
当前 workflowAgentProgress 转发节点关联的 iteration/tool_call/tool_result;新增 handler 集成测试确认 workflow_node_start、iteration、tool_call、tool_result、workflow_node_result 均落库并发送至流,故现有路径未复现全程零进度。原截图与描述没有可重放运行日志及配置,不能断言历史现象不存在。已有工具节点期限未执行的缺陷已经修复;Agent 节点没有独立无进度超时配置,不凭历史耗时增加新的监控机制或任意期限。默认提示持续扩展探测的冲突另已修复。取消审批场景通过真实 pending → cancel → 历史与 done 的集成测试,第 24 行同步结论。
最终整仓验证
当前修复集合 go test ./... 全部通过。前端 node --test web/static/js/*.test.cjs 共 217 项,215 项通过;2 项 HITL UI 源码正则断言失败(刷新默认审批配置、服务端默认审批人更新),相关实现和测试相对基线未改动,另在原基线归档核验同项失败。新增及受影响场景针对性测试通过。未执行真实模型或真实目标探测,不将提示改进解释为所有模型行为保证。