跳转到内容

扩展安全模型

本页面向安装或发布扩展包的人。读完后,你会知道 Phase 1 为什么不运行第三方代码,以及如何评估一个 pack 是否适合安装。

Phase 1 扩展包是 data-only。Jarvis 读取 manifest、profile YAML 和 workflow YAML,然后由 Jarvis Core 执行已有能力。

这条边界带来三个安全属性:

  • 没有插件入口函数。
  • 没有安装脚本或 post-install hook。
  • 没有在线 registry 自动拉取。

permissions 是声明和展示机制,不是绕过确认的授权机制。比如:

permissions:
terminal:
requested: true

这会在验证和 UI 中显示为高风险能力。真正运行时,worker 仍走 Jarvis 的权限模式、启动门和人工确认。

Pack 安装后创建的 Profile 和 Workflow 带有 ownership metadata:

source: extension
owner_pack_id: example.ssh-tunnel
owner_contribution_id: open-tunnel
locked: true

普通编辑和删除 API 会拒绝 locked 对象。用户需要修改时,在 UI 中选择“复制后编辑”。复制件不再归原 pack 所有,停用或卸载 pack 不会删除复制件。

Manifest 只能声明 secret 名称:

secrets:
- name: SSH_TARGET_ALIAS
required: false
description: Optional host alias used by the workflow prompt.

不要把 secret 值写进 manifest、profile、workflow、README 或示例命令。Profile 中 MCP server 的 secret-like env 值如果是明文,会被 lint 视为错误;使用环境变量引用。

Profile 可以包含 MCP server 配置。MCP stdio server 是可执行进程,因此 pack 作者必须:

  • permissions.profiles.mcpServers 中声明。
  • 在 README 中说明 server 来源和用途。
  • 不使用 jarvis 作为 MCP server 名称;该名称保留给 worker uplink。
  • 不在 env 中写入明文 token。

安装者应把含 MCP stdio 的 pack 当作高风险 pack 审核。

如果 workflow 可能运行终端命令、部署、发布、写远程系统或关闭外部资源,建议把对应节点设为:

requires_approval: true

这样 pipeline engine 到达节点时会等待显式放行。

  • disable:移除 pack-owned Profile、Workflow 和 command contribution,保留 pack registry。
  • uninstall:删除 pack registry。启用中的 pack 需要先停用,或使用 force 卸载。
  • 历史 workflow run 读取创建 run 时的快照,不依赖当前 pack 是否仍安装。

Phase 1 不增加自动外发路径。安装目标是 server-local pack path。需要通过内网分发时,把 pack 目录或归档交给环境管理员,再在目标机器本地安装。