跳到主要内容

sec-core Provider 接入参考

本页用于组件接入与维护。安装和日常使用请阅读用户指南。

aw-provider-sec-core 让 AW 策略调用已有的 agent-sec-cli scan-code 命令。 配置指定哪些工具输入包含代码,以及发现风险后返回观察还是阻断候选效果。 sec-core 提供扫描器与规则,AW 负责配置、协议校验和有界调用。

当前交付为 Linux 源码,可用于本地 Provider 集成。完整 Preview 集成见下方指南。Provider 不启动任何 daemon,不安装 Agent Hook,也不持久化 AW 审计。 工具后仅返回观察记录,不扫描或替换结果。

完整的 AW 服务、Qoder 和 sec-core 预编译集成见 Preview 包指南。 以下仍可单独从源码使用 Provider 桥接。

通用的组件接入路径见 AW 教程。sec-core CLI 和 daemon 仍是独立管理的后端,AW 审计存储由 AW 服务负责,见 容器持久化说明。Preview 生成器映射 Qoder Bash 和 OpenClaw exec 输入。使用 QwenPaw 或 Hermes 前,须在 config.tools 中补充并 验证其规范化工具名称和输入指针。安全步骤的 match.tools 另行使用标准名称或 精确的原生选择器选择工具,具体语法见下文。

前置条件与构建​

按 sec-core 指南 安装 sec-core。 本桥接要求 Rust V2 CLI 支持 --socket、--timeout-ms 和 scan-code --code --language --mode,且已有可访问的 sec-core daemon 正在运行。 请核对部署版本的帮助;旧 Python CLI 未通过本桥接验收。 AW 不向 sec-core 添加命令或依赖。

从源码构建 AW Provider 与本地 Host 示例:

cd src/aw
cargo build --locked --manifest-path ../../providers/agent-sec-core/Cargo.toml
cargo build --locked -p aw-host --example host

Provider 二进制位于 ../../providers/agent-sec-core/target/debug/aw-provider-sec-core,启动参数为:

aw-provider-sec-core --cli ABSOLUTE_PATH --socket ABSOLUTE_PATH

--cli 指定公开的 agent-sec-cli 可执行文件,--socket 指定其已有 daemon。 两个路径均必填且必须为绝对路径,--help 输出用法。进程从 stdin 读取一份以 EOF 结束的 AW Provider JSON 请求,并向 stdout 写入一份响应。通常由 Host 启动。

包内后台与显式健康诊断​

Preview sec-core Provider 包包含同一次源码构建的 agent-sec-cli、 agent-sec-daemon 和 agent-sec-daemon-health。拆分包和 all-in-one 均通过 组件回执校验它们的哈希和执行权限。官方 systemd/配置模板作为参考资产放在 share/aw/providers/sec-core/;安装 AW 包不会注册服务或修改 /etc。

已有 root agent-sec-core.service 时复用其 socket。新后台按照 sec-core 安装指南安装,服务生命周期 由正式系统包负责。目前组件清单声明 Linux x86_64;本地 AW ARM64 包不代表 sec-core 已有正式 ARM64 发行。源码 make install-core-v2 可通过 V2_BIN_BUILD_DIR 读取本包二进制,但会覆盖目标系统二进制和 unit,不能直接用于 已有受管理安装。root 服务的执行路径不得指向用户可写的 AW 前缀。

安装器或诊断消费者可显式查询包内 helper:

AW_SEC_PROVIDER="$AW_PREVIEW_PREFIX/libexec/aw/providers/sec-core"
"$AW_SEC_PROVIDER/aw-provider-sec-core" --health \
--helper "$AW_SEC_PROVIDER/agent-sec-daemon-health" \
--socket /run/agent-sec-core/daemon.sock

这是可选组件诊断接口,不增加 Agent 启动步骤;日常仍使用 aw run。 它只调用已有 daemon.health 探测,进程期限为一秒,每路输出限制为 4 KiB, 不会启动 daemon、扫描代码或执行目标准入。helper 校验后台的 root peer 凭据, AW 移除 sec-core 测试绕过环境变量。helper 非零退出、无效/不健康响应、非 root 后台、组件缺失和超时均保持 unavailable;不返回 helper 私有输出。

独立 aw-sec-core-health/v1alpha1 JSON schema 位于 providers/agent-sec-core/schemas/health-v1alpha1.schema.json, tests/fixtures/ 包含可达和不可用 fixture。helper_installed 只说明文件存在; socket_configured 只说明传入了绝对 socket 路径。认证健康成功后才返回 backend: authenticated_reachable。admission 和 check_result 保持 unknown:后台健康和近期执行的 status=ok 都不能证明目标准入或扫描无风险。 现有 aw inspect、Provider view 协议及其 unknown 字段不变。诊断结果不会替代 每次调用的 on_error 配置;后台失联时 on_error: block 继续阻断。

AW 卸载只移除本包回执拥有的 helper/模板,保留独立管理的系统服务、/etc 配置及后台数据。后台升级/移除交给拥有它的系统包;AW 暂无自动服务安装、 升级或卸载衔接。

配置 Provider​

复制完整示例为 aw.sec-core.yaml,替换可执行文件与 socket 路径。示例使用 mode: observe 和 on_error: report,本地评估不会请求阻断。before 步骤通过 native:qoder:shell 和 native:qoder:python 选择合成的 Qoder shell、python 事件; 其他工具跳过该步骤,不调用此 Provider。 同时配置步骤和事件选择条件时,两者都须匹配。 必需的安全检查使用 mode: block,并在 before 步骤中准入 [observe, block]、 设置 on_error: block。缺少映射、无效提取输入和后端失败均通过 Host 的错误策略 阻断选中的调用;扫描器发现的风险保留独立的 code_risk 结果。

Host 选择器支持 *、标准名称 bash、file_read、file_write,以及 native:<adapter>:<native_name>。原生选择器匹配事件的 Adapter 和保留的 event.tool.native_name。Provider config.tools 独立使用规范化的 event.tool.name 作为键,配置时须核对 Adapter 的这两个事件字段。 例如,Qoder 原生 Bash 调用可通过 native:qoder:Bash 选择, 对应的 Provider 映射使用规范化工具名称。

Provider 的私有 config 接受以下字段:

字段含义
version必填,固定为 1
mode必填,observe 或 block,只影响 scan_code
unmapped_tool可选,error(默认)或 observe,控制 scan_code 对已选中但没有映射的工具的处理
tools必填,包含 1–128 个规范化工具名称的对象,按名称精确匹配
tools.<name>.languagebash 或 python
tools.<name>.input_pointer指向 event.tool.input 内部的 JSON Pointer,所选值必须为字符串

未知字段、不支持的语言和非法指针会被拒绝。空指针选择根字符串,/command 选择字段,/items/0 选择数组元素。工具名区分大小写,使用 event.tool.name; native_name 不参与映射选择。已选中但未映射的工具默认返回 Provider 错误 tool_unmapped,没有候选效果。省略 unmapped_tool 的已有配置也采用此严格默认值。 需要为这些工具保留只观察、不扫描的行为时,显式配置 unmapped_tool: observe, 返回结果为 observe/tool_unmapped。

mode: observe 记录已映射工具的扫描结果,发现风险时返回观察效果。 缺少映射、提取失败和后端错误仍返回错误。已映射工具缺少代码或代码不是字符串时, 返回 invalid_tool_input;配置 unmapped_tool: observe 时也执行这一校验。 仅观察的错误处理策略须显式使用 on_error: report。

操作事件结果
scan_codetool.beforeok: true, verdict: pass → observe/code_pass;warn 或 deny 按 mode 返回 observe/code_risk 或 block/code_risk
observe_tooltool.afterobserve/tool_observed,不调用扫描器

describe、私有配置校验和工具后观察不访问 sec-core。工具前扫描使用字面参数和 --mode regex,不会把代码作为 shell 命令执行。CLI 退出 0 表示扫描完成,不代表 判定为 pass。非零或信号退出、非法 JSON、无效判定、超时和输出超限均返回 Provider 错误,不产生候选效果。

扫描前,桥接通过 --trace-context 传入以 Adapter 名称表示的 agent_name、 原生 trace_id、session_id、run_id、call_id 和 tool_call_id。 字段从原始回调提取,包括 OpenClaw 的 event/context 和 Hermes 的 extra 字段。 Pi、QwenPaw 和 AgentScope 的原生工具 ID 从 tool_call.id 提取。 AW 标准化事件中的 session、调用和实例 ID 不用于兜底;原生字段缺失、空白或 不是字符串时会省略。 sec-core CLI 将这份兼容输入转换为已有的 OTel Context/Baggage。

启动 CLI 前,桥接会去除各原生关联字段首尾的空白,并将其限制为 256 个 Unicode 码点;超长时保留 ...[truncated] 后缀,后缀也计入限长。这与 CLI 的归一化规则 一致,并在触及操作系统参数长度限制之前约束 context 参数大小。

调用方必须限制整个 Provider 进程的期限,包括 stdin 接收和 stdout 输出。 aw-host 通过 aw-exec 提供这一保证。直接调用时也必须在请求发送完毕后关闭 stdin, 并在 I/O 停滞时终止进程;Provider 自身不保证独立调用的总耗时上限。 EOF 到达后,桥接从 invoke 预算(最多 60 秒)中扣除读取和解析已消耗的时间, 仅将剩余预算交给扫描。CLI stdout 上限为 1 MiB,stderr 上限为 64 KiB, 并向 CLI 传递 Host 为 Provider 选定的环境。响应仅携带原因码与绑定的输入摘要,不包含源码、发现详情或 CLI stderr。 代码经 argv 传递,受操作系统的参数可见性与大小限制;当前 CLI 合同不提供 stdin 或文件回退路径。

本地验证候选效果​

在 src/aw 中编辑好 aw.sec-core.yaml,将 mode 改为 block 后执行:

./target/debug/examples/host aw.sec-core.yaml tool.before shell '{"command":"echo safe"}'
./target/debug/examples/host aw.sec-core.yaml tool.before shell '{"command":"rm -rf /"}'
./target/debug/examples/host aw.sec-core.yaml tool.after shell '{"command":"echo safe"}'

这些命令提交合成工具事件,不执行待扫描代码。使用内置 regex 规则时,预期候选效果 分别为 code_pass、block/code_risk 和 tool_observed。Host 输出的 adoption: not_tested 表明阻断候选效果尚不能证明 Agent 阻止了工具执行。 原生工具前后接线和持久化 AW 审计仍需 daemon 与适配器完成。

禁用时移除 Provider 及引用它的事件步骤即可,无需回退 sec-core 代码或打包改动。 已有 Agent 原生 sec-core Hook 继续使用相同的公开 CLI。