把第三方工具交给AI代理,和把陌生程序交给定时任务调度器,本质上是同一个难题。工具作者可能是善意的,也可能不是;代理可能误用工具,也可能不会。作为操作者,你需要一个底线——无论哪边出问题,损失都能被兜住。ACT的策略层就是用来安装这个底线的。本文从wasmtime虚拟机一路讲到DNS解析器,拆解这套机制如何运转。
三层结构,职责分明。最底层是wasmtime虚拟机,负责隔离:JIT编译、线性内存边界、禁止直接系统调用。中间层是WASI能力接口,组件按需申请wasi:filesystem或wasi:http等导入项,主机选择提供、提供受限版本,或不予链接。最上层是ACT策略层,夹在组件声明与操作者授权之间,确保双方都不会越界。
![]()
一个常见陷阱是混淆底层隔离与能力接口。wasmtime的隔离是硬核的:组件读不了/etc/passwd,开不了原始套接字,执行不了execve。但它能做什么,完全取决于主机愿意暴露哪些导入项。WASI采用"正向授权"模型——没有"拒绝"操作,只有"有"或"没有"。
![]()
ACT的策略层处理的是声明与授权的匹配。每个ACT组件自带清单文件(act.toml或从Cargo.toml/pyproject.toml/package.json合并而来)。需要文件系统访问?必须显式声明:
[std.capabilities."wasi:filesystem"]
description = "Stores the database file."
[[std.capabilities."wasi:filesystem".allow]]
path = "**" # glob,"**"表示任意路径
mode = "rw" # "ro"只读或"rw"读写
需要对外HTTP?同样要写清楚:
[std.capabilities."wasi:http"]
description = "Fetches OpenAPI specs from public catalogs."
[[std.capabilities."wasi:http".allow]]
host = "petstore3.swagger.io" # "*"任意,"*.suffix"后缀匹配,否则精确匹配
scheme = "https" # 可选
methods = ["GET"] # 可选
ports = [443] # 可选
![]()
act-build pack在构建时验证这些声明,并将其嵌入act:component自定义段。act-build validate可在供应链任何环节重新解析。声明缺失、或声明了能力表但allow留空的组件,在主机加载时被硬拒绝。没有"忘了声明"就能拿到环境权限的后门。
操作者策略是另一半拼图。运行时需要明确授权:
act run \
--fs-policy allowlist \
--fs-allow "/data/**" \
--fs-allow "/tmp/work/db.sqlite" \
--http-policy allowlist \
--http-allow "host=api.example.com;sch
组件声明是"天花板"——它说自己最多需要这些权限。操作者授权是"地板"——实际运行时只给这么多。两者取交集,就是真实生效的权限边界。这种设计把"最小权限原则"从口号变成了可强制执行的技术约束。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.