7.2 KiB
7.2 KiB
N-025 Scripting 与平台
状态:BLOCKED(默认拒绝策略、真实 Main Text 来源清单、签名 manifest、权限/资源预算、
平台报告、服务端 hash 门和请求决策审计已落地;本地隔离执行、真实 server job 与发布审计未实现)
已验证切片
- N-025-A:脚本默认拒绝网络、autorun、driver expression 和 add-on 安装;entry/dependency path 必须在项目内,未知权限和重复 ID 会拒绝。
- N-025-B(部分):脚本 manifest 要求 SHA-256、固定长度签名、publisher/keyId、权限 allowlist、CPU/内存/墙钟预算,并检查脚本依赖图。
- N-025-C(门):合法脚本仍要求隔离 sandbox;server job 需要 script/source/input
hash 一致,但当前 endpoint 未配置,返回
SERVER_JOB_UNAVAILABLE。 - N-025-D:Worker/WebGPU/OffscreenCanvas/OPFS 与 native/CUDA/Metal/HIP/OptiX capability
报告只反映 API 存在或显式
BLOCKED。 - N-025-A(Main reader):从 Blender
Text/TextLine重建最多 1 MiB、65,536 行的完整 UTF-8 内嵌来源,记录项目相对外部路径、use_moduleautorun 请求和 SHA-256;所有来源均为 只读且executionStatus=BLOCKED,autorun 请求按默认拒绝处理,不引入 Python 执行入口。 test:scripting-isolation独立验证未批准 key 返回SCRIPT_SIGNATURE_INVALID,批准 key 仍返回SCRIPT_SANDBOX_UNAVAILABLE,server job 返回SERVER_JOB_UNAVAILABLE;测试不创建 本地执行器,也不把签名校验误报为 sandbox。- 每次本地脚本请求都可生成冻结的
ScriptExecutionAuditIR:绑定 canonical manifest/source SHA-256、权限、CPU/内存/墙钟预算、批准 key 命中、UTC 时间戳、请求摘要和明确拒绝码; 审计凭证仍只能是DENY,不能绕过 sandbox 门。 - N-025-E(审计链):至多 65,536 条拒绝审计按 sequence、前项 SHA-256 与 canonical entry SHA-256 串联;读取时重新校验请求摘要和整条链,拒绝 requestId 重放、非递增 UTC 时间戳、内容篡改、断链与超预算日志。该链是内存/序列化协议,不声称已持久化发布审计。
- M13-02A manifest gate:每个 script 必须声明
sourceByteLength和module=false;解析器限制 脚本数量、总源码字节、依赖数量、权限数量与 allowlist,canonicalize 项目内 entry/dependency path,并拒绝重复依赖、模块执行、未知权限和所有预算溢出。Node unit 与生产 Chromium Worker 正负例、golden report 和 artifact manifest 已绑定。 - M13-02B canonical signature input:
canonicalizeScriptingManifest与serializeScriptingManifest是唯一规范入口,locale-independent code-unit 排序所有可重排 数组,固定无空白 canonical JSON,unknown fields 不进入签名输入;order mutation、security field mutation 和 schema drift 均由 Node/Chromium 与 golden report 验证。 - M13-02C signer trust policy:版本化 trust policy 绑定 ED25519 key/public-key、publisher、
active/revoked status、validity window、revocation timestamp、same-publisher rotation chain
和 bounded clock skew;resolver 只返回
ELIGIBLE/cryptographicVerification=REQUIRED,不验签 不执行,revoked/expired/mismatch/cycle/missing predecessor 全部 fail-closed。 - M13-02D declaration-bound signature verification:canonical per-script input 包含 source
SHA-256 和权限/预算/路径等声明,合法 ED25519 signature 才返回
VERIFIED;source hash 或 signature 变化返回SCRIPT_SIGNATURE_INVALID,revoked signer 返回SCRIPT_POLICY_DENIED。 - M13-02E permission minimization:无显式请求时授予空集;只有 manifest 已声明且请求的
permission 才能授予,未知、重复或未声明请求稳定返回
SCRIPT_POLICY_DENIED。 - M13-02F signature negative matrix:missing/expired/not-yet-valid key、publisher confusion
与跨脚本 signature swap 均稳定返回
SCRIPT_POLICY_DENIED或SCRIPT_SIGNATURE_INVALID, canonical ordering 不改变自身签名结果,且不开放执行入口。 - M13-03A sandbox scope contract:versioned scope 对 DOM、host Worker、OPFS、IndexedDB 和
network 五项能力逐项要求
false;启用、缺失或未知 schema 均 fail-closed,执行仍禁用。 - M13-03B sandbox budget contract:CPU、wall-time、memory、message 和 output bytes 各有固定
上限;任一超限返回
SCRIPT_BUDGET_EXCEEDED,不创建或启用脚本执行器。 - M13-03C host-call contract:仅允许五个显式调用名;每个调用使用结构化、调用专属参数,
permission 必须来自 manifest 声明,未知字段、危险路径和未声明调用 fail-closed,解析结果
保持
execution=DISABLED。 - M13-03D sandbox isolation:真实 Chromium Worker crash/timeout 后 job receipt 分别返回
SCRIPT_SANDBOX_CRASHED/SCRIPT_SANDBOX_TIMEOUT,Main revision 不变,temporary/published 资源归零;终止后的迟到结果返回SCRIPT_SANDBOX_LATE_RESULT,执行仍为DISABLED。 - M13-03E cancellation gate:取消 receipt 保持 Main revision 和 execution 状态,真实 Chromium
迟到窗口
lateMessages=0、cacheWrites=0,伪造迟到结果稳定返回SCRIPT_SANDBOX_LATE_RESULT。 - M13-03F dispose gate:真实 Chromium Worker 释放两端
MessagePort、timer、AbortController、 transferable buffer、pending request 和 cache reference;首次和重复 dispose 均返回零资源, 且迟到 timer 消息为 0。 - M13-03G same-session recovery:Worker generation 4->5 后 Main revision/source hash/manifest hash
保持不变;两条 default-deny audit entry 的 request ID、sequence 和 previous hash chain 连续,
replay/source tamper 均返回
SCRIPT_MANIFEST_INVALID。 - M13-04A server job directory gate:每个 job 获得随机
0700one-shot directory,request ID 不 进入目录名;成功/失败清理后无残留且重复清理幂等。 - M13-04B source/output isolation:source directory/file 为
0555/0444,真实写入返回EACCES; output directory 为0700且可写,清理会先恢复 source directory 权限并无残留。 - M13-04C server resource budget:CPU、memory、process、file、wall 和 output 六类限制有固定
上限;每类超限均返回
SERVER_JOB_BUDGET_EXCEEDED,bounded receipt 标记enforced=true, 执行仍为DISABLED。 - M13-04D server network policy:默认 network
DENY;显式声明的 HTTPS/loopback origin 才可ALLOWED,missing/undeclared/unsafe origin 均为SERVER_NETWORK_DENIED。
仍然阻断
- N-025-B/C:签名验证密钥管理、无网络 CPython/native sandbox、server Blender job 和 output hash 提交。
- N-025-D/E:真实 server isolation、真实 GPU/native window/file watcher 适配、恶意脚本/依赖混淆/逃逸/重放、审计日志持久化和发布门;本地 请求级审计凭证与 crash/timeout receipt 已完成,不代表隔离执行完成。
验收
npm --prefix web run test:script-main-reader
npm --prefix web run test:scripting-isolation
WEB_TEST_PORT=5325 npm --prefix web run test:e2e -- --grep "N-025 script"