diff --git a/internal/config/config.go b/internal/config/config.go index 47c8f1c8..774bb0a5 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -651,14 +651,25 @@ type HitlConfig struct { AuditAgentPromptReviewEdit string `yaml:"audit_agent_prompt_review_edit,omitempty" json:"audit_agent_prompt_review_edit,omitempty"` } -const hitlAuditAgentPromptBase = `你是 CyberStrikeAI 人机协同审计 Agent。审查 Agent 即将执行的工具调用是否在授权渗透测试范围内、风险可接受。 +const hitlAuditAgentPromptBase = `你是 CyberStrikeAI 人机协同审计 Agent。审查 Agent 即将执行的工具调用是否会对系统造成实质性损害。 你会收到 JSON,包含 hitlMode、toolName、arguments/argumentsObj、userMessage、thinking、reasoningChain、planning 等字段。 -共享原则: -- 与用户授权、当前任务目标一致且风险可控 → approve -- 越权扫描、破坏性操作、与任务无关或风险过高 → reject -- 信息不足时保守 reject` +裁决基调(默认放行): +- 常规、低风险的渗透测试操作 → approve(如信息收集、端口/服务扫描、目录枚举、只读查询、无害探测命令) +- 与用户授权、当前任务目标一致,且未见明确高危迹象 → approve +- 仅在「可能对系统造成实质影响」时 → reject + +必须 reject 的高危情形(示例,非穷举): +- 删库、清表、批量删除数据、格式化磁盘、不可逆破坏 +- 修改/重置密码、创建或篡改管理员账号、持久化后门、开机自启 +- 向生产环境写入恶意载荷、勒索加密、停止关键服务、修改系统核心配置 +- 明显越权:与任务/授权目标无关的破坏性操作 + +不应单独作为 reject 理由的情形: +- 常规 nmap/curl/grep/读文件/枚举类命令本身 +- 参数略显宽泛但无明确破坏意图(审查编辑模式可收窄参数后 approve) +- 仅因「信息不足」——若无上述高危迹象,应 approve 并可在 comment 中提示注意点` const hitlAuditAgentPromptApprovalOutput = ` 仅输出一行 JSON,不要 markdown 代码块: diff --git a/internal/handler/hitl.go b/internal/handler/hitl.go index bcda9164..21ddcc78 100644 --- a/internal/handler/hitl.go +++ b/internal/handler/hitl.go @@ -158,17 +158,14 @@ func (m *HITLManager) DeactivateConversation(conversationID string) { m.mu.Unlock() } -// hitlConfigGlobalToolWhitelist 来自 config.yaml hitl.tool_whitelist(去重、去空)。 +// hitlConfigGlobalToolWhitelist 来自 config.yaml hitl.tool_whitelist(去重、去空),并合并内置元工具免审批项。 func (h *AgentHandler) hitlConfigGlobalToolWhitelist() []string { if h == nil || h.config == nil { - return nil + return multiagent.MergeHitlExemptMetaTools(nil) } raw := h.config.Hitl.ToolWhitelist - if len(raw) == 0 { - return nil - } seen := make(map[string]struct{}) - out := make([]string, 0, len(raw)) + out := make([]string, 0, len(raw)+len(multiagent.HitlExemptMetaTools)) for _, t := range raw { n := strings.ToLower(strings.TrimSpace(t)) if n == "" { @@ -180,44 +177,35 @@ func (h *AgentHandler) hitlConfigGlobalToolWhitelist() []string { seen[n] = struct{}{} out = append(out, strings.TrimSpace(t)) } - return out + return multiagent.MergeHitlExemptMetaTools(out) } -// hitlRequestWithMergedConfigWhitelist 将会话/API 中的白名单与 config.yaml 全局白名单合并(并集),仅用于运行时 Activate;不写入数据库。 +// hitlRequestWithMergedConfigWhitelist 将会话/API 中的白名单与 config.yaml 全局白名单及内置元工具免审批项合并(并集),仅用于运行时 Activate;不写入数据库。 func (h *AgentHandler) hitlRequestWithMergedConfigWhitelist(req *HITLRequest) *HITLRequest { - gw := h.hitlConfigGlobalToolWhitelist() - if len(gw) == 0 { - return req - } if req == nil { return nil } seen := make(map[string]struct{}) - union := make([]string, 0, len(gw)+len(req.SensitiveTools)) - for _, t := range gw { + union := make([]string, 0, len(req.SensitiveTools)+16) + add := func(t string) { n := strings.ToLower(strings.TrimSpace(t)) if n == "" { - continue + return } if _, ok := seen[n]; ok { - continue + return } seen[n] = struct{}{} union = append(union, strings.TrimSpace(t)) } + for _, t := range h.hitlConfigGlobalToolWhitelist() { + add(t) + } for _, t := range req.SensitiveTools { - n := strings.ToLower(strings.TrimSpace(t)) - if n == "" { - continue - } - if _, ok := seen[n]; ok { - continue - } - seen[n] = struct{}{} - union = append(union, strings.TrimSpace(t)) + add(t) } out := *req - out.SensitiveTools = union + out.SensitiveTools = multiagent.MergeHitlExemptMetaTools(union) return &out }