权限边界
用户范围的安装不需要提权:一切都位于用户自己的目录中。整机范围的安装要写入系统位置,因此需要管理员权限;Niobium 以一种封闭的能力授予这些权限,而不是提供一个通用的提权进程。
对于整机范围的事务,setup 会以管理员权限启动它自身的第二个副本(视平台而定,通过系统授权提示、runas、pkexec 或 sudo)。这个助手:
- 只在一个事务期间存在;
- 只接受一份固定的带类型操作列表:创建目录;写入、追加或复制文件;重命名;删除文件或目录树;设置或删除
current指针;准备、激活、丢弃或删除一项系统集成;报告可用空间; - 没有任何运行程序、加载库或建立网络连接的操作;
- 用事务 id 和一个随机 nonce 认证每一条消息,并拒绝被重放的消息 id。
未提权的 setup 负责下载和验证发布,并把它暂存到用户的缓存中;助手把暂存的文件复制到位。
助手可以写到哪里
Section titled “助手可以写到哪里”助手自行计算其策略,不接受来自未提权一方的路径:
- 它只在
<install base>/<product id>内写入,其中安装基目录在 macOS 上是/Library/Application Support,在 Windows 上是%ProgramFiles%,在 Linux 上是/opt; - 系统集成只写到它已知的系统集成目录;
- 复制的源必须位于暂存区或安装根目录中,打开时不跟随符号链接;拥有多个硬链接的文件会被拒绝。
边界不覆盖什么
Section titled “边界不覆盖什么”助手限制的是它写到哪里,而不是写什么。内容已经由未提权的进程对照已签名的发布验证过。如果攻击者已经控制了执行安装的用户的会话,他们可以让助手把任意内容写进该产品的整机安装根目录,并为其注册服务或快捷方式;但不能借助它写入其他产品或任意系统位置。这一剩余风险是被接受的。
使用 C ABI 的嵌入宿主永远不会弹出提权提示:只有当宿主进程本身已经提权时,整机范围才可用。
在真实的 Windows 或 Linux 系统上进行的整机范围安装尚未验证;参见状态与平台上的 N1-UJ-02。线路协议在 ipc-v1 中规定。