Files
CyberStrikeAI/docs/bug-sheet-review.md
T

169 lines
24 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.cjs` 4 项通过;项目空名称无部分保存、并发数非法无修改、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 源码正则断言失败(刷新默认审批配置、服务端默认审批人更新),相关实现和测试相对基线未改动,另在原基线归档核验同项失败。新增及受影响场景针对性测试通过。未执行真实模型或真实目标探测,不将提示改进解释为所有模型行为保证。