mirror of
https://github.com/Ed1s0nZ/CyberStrikeAI.git
synced 2026-10-19 22:17:42 +02:00
feat: verify attack-chain nodes against real tool calls
A node claiming something ran must cite a tool_call_id the host issued in the trajectory. A citation absent from the trajectory is invented, so the node is dropped along with its edges; a missing citation counts as invented only when every real ID survived budget fitting, so a trimmed payload cannot silently empty a graph. Judging is skipped where the evidence cannot be enumerated: the process-detail supplement dumps raw event JSON and the messages-table fallback carries no call IDs. Verified citations land in node metadata rather than tool_execution_id, which is foreign-keyed to tool_executions. Also close two smaller holes: fact text can no longer carry the host index delimiters, which would close the block early and spill the remaining index into the system prompt; and the console fact endpoints reject the reserved note/context-* prefix, matching the MCP tool layer.
This commit is contained in:
1 parent
16189e0b76
commit
3d2dfdac36
10 files changed
+341
-15
No files matched your search
@@ -38,7 +38,7 @@ Eino 默认续接摘要使用 `user` 消息角色传输,但同时带 `_eino_su
|
||||
|
||||
`list_project_facts`、`search_project_facts` 与 `get_project_fact` 默认使用当前会话范围;前两者支持 `source_conversation_id` 缩小查询。过滤在数据库分页前执行,避免置顶历史记录占满一页后才被丢弃。初始主 Agent 注入、子 Agent 黑板补充以及普通/原生压缩后的索引刷新,都显式传入当前会话 ID;缺少会话 ID 时不会退回注入全部自动续接记录。
|
||||
|
||||
关系速览、索引行内关系提示以及 get/upsert 的关系边返回同样过滤其他会话的自动续接 key,防止通过关系边绕过默认范围。事实 body 的「关联」镜像段由 `get_project_fact` 原样返回、没有按读取方过滤,因此该段不写入任何自动续接 key;结构化关系边仍按调用方范围返回,本会话自己的续接记录不会因此消失。历史正文附来源会话和更新时间,不因读取自动升级为已确认事实或新的任务授权。`note/context-*` 为系统保留前缀,事实写入工具不能覆盖;废弃/恢复工具不能修改其他会话的自动续接记录。核实后的项目知识应另写独立事实 key 并保留证据。
|
||||
关系速览、索引行内关系提示以及 get/upsert 的关系边返回同样过滤其他会话的自动续接 key,防止通过关系边绕过默认范围。事实 body 的「关联」镜像段由 `get_project_fact` 原样返回、没有按读取方过滤,因此该段不写入任何自动续接 key;结构化关系边仍按调用方范围返回,本会话自己的续接记录不会因此消失。历史正文附来源会话和更新时间,不因读取自动升级为已确认事实或新的任务授权。`note/context-*` 为系统保留前缀,事实写入工具与控制台的事实新建/改写接口都不能创建、覆盖或把普通事实改名进该前缀(续接记录只由压缩流程写入);废弃/恢复工具不能修改其他会话的自动续接记录。核实后的项目知识应另写独立事实 key 并保留证据。
|
||||
|
||||
这属于上下文注入和事实检索的默认范围,不是新的文件访问权限隔离;不删除快照、不修改既有记录,也不清洗已进入旧对话历史的内容。项目管理页面及原有不带范围参数的数据库查询仍可供有权用户查看项目全量数据。现有项目权限继续由工具授权层核验。
|
||||
|
||||
@@ -127,6 +127,8 @@ Eino 的压缩流程支持在 `Finalize` 中处理摘要并重写上下文,`Ca
|
||||
|
||||
攻击链分析输入根据持久化的来源元数据,分别标明真实用户输入、宿主保留的原始用户账本、系统生成摘要、技能上下文和执行模板。生成摘要和模板只是工作线索,不构成新的用户授权,也不能独立证明漏洞或工具执行;节点仍须以实际工具记录为依据。用户自己引用摘要文字时继续作为真实用户输入,不根据正文关键词判定来源。
|
||||
|
||||
「以实际工具记录为依据」由程序判定,不只写在提示词里。`action` 与 `vulnerability` 节点可带 `tool_call_id`,取值须逐字来自轨迹中宿主签发的调用 ID;引用了轨迹里不存在的 ID 即判为编造,节点连同指向它的边一起丢弃,`target` 节点不参与判定。是否强制「必须引用」取决于模型当时看不看得到 ID:预算裁剪后全部真实 ID 仍可见时,留空同样丢弃;有 ID 被裁掉时,留空只算无法对应、不算编造。多代理补充的过程详情原样转储事件 JSON,其 ID 不在解析后的轨迹内,此时与 `messages` 表回退分支一样跳过判定,避免误杀真实节点。通过校验的引用写入节点 `metadata.tool_call_id`;不写 `attack_chain_nodes.tool_execution_id`,该列有指向 `tool_executions` 的外键,而模型引用的是调用 ID。
|
||||
|
||||
攻击链侧栏提供可展开的「压缩摘要与证据线索」,显示当前会话轨迹中带摘要来源标记的完整正文,保留其中的不可变快照路径,并可复制正文按路径核对原文。读取已有缓存攻击链时也会返回当前轨迹中的摘要,不需要重新生成节点才能查看。摘要单独展示,不变成图中的攻击节点,不改变节点统计、筛选或图导出。没有工具执行的会话可展示摘要而保持空图。
|
||||
|
||||
该入口只读取当前会话的代理轨迹,不从项目共享黑板汇总其他会话,不增加快照文件下载或任意文件读取接口。旧轨迹缺少来源元数据时不猜测其摘要身份;已被后续压缩移出轨迹的旧摘要仍按快照目录回溯。更新代码不会重写旧缓存节点;需要使用新的来源标注重新分析攻击链时,点击「重新生成」。
|
||||
|
||||
Reference in new issue
Block a user