文件虚拟化与标识
Sandboxie 的常规文件系统虚拟化会呈现一个逻辑文件路径,而文件的内容与元数据可能来自不同的后备层。一个有用的概念性查找顺序是:
删除与重定位状态可以抑制或重定向较低层。访问规则可以把常规的合并虚拟化替换为另一种模式,并且并非每个 Windows API 都走同一条路径。这是一套查找模型,不是固定不变的物理目录布局。
逻辑路径与沙盒存储
沙盒中的应用程序通常继续使用其逻辑路径,而创建或迁移进实时沙盒的文件,实际存储在生效的文件容器根之下。因此逻辑文件与其沙盒表示可能位于不同的卷上。有关存储配置参见 沙盒根与卷布局 与 文件根路径。
选定的被拦截文件名查询与最终路径查询,会把由沙盒支撑的句柄转换回应用程序的逻辑路径。这并不保证每个 API 都隐藏物理沙盒路径。
读取、创建与修改文件
当没有实时沙盒表示遮蔽该路径时,符合条件的只读打开可以直接使用已解析的后备对象,而不必先把它复制进实时沙盒。该后备可以是宿主文件、快照,或其他已解析或已重定位的来源。访问模式、删除状态、快照与兼容性路径都可能改变结果;并非每次读取都走这条直接路径。
需要沙盒本地可变状态的操作通常需要一个实时表示。对于已存在的后备文件,Sandboxie 可能在完成操作之前把信息迁移进该表示。对于没有可见低层后备的新逻辑文件,常规的虚拟化路径会在沙盒存储中创建对象,而不是创建对应的宿主文件。
一旦存在可用的实时表示,常规虚拟化访问通常由它遮蔽对应的低层对象。实时文件为相关操作提供自己的内容与元数据;Sandboxie 不会把它的字节与低层文件的字节合并。元数据查询的回退行为并非在所有 API 上都一致。
迁移决策
迁移并不总是完整内容的复制。取决于操作与策略,Sandboxie 可能创建一个包含既有数据的副本、一个不含先前内容的表示、元数据或目录状态,或专门的重解析点状态。例如:
- 普通的修改可能要求复制既有内容。
- 覆盖操作可以保留元数据而不先保留旧内容。
- 仅删除、并在关闭时删除的打开可以避免复制文件内容。
- 创建目录表示不会递归复制其子项。
流与重解析点有专门处理;这套模型并不承诺每种对象类型都以相同方式复制。
当考虑完整内容迁移时,迁移规则与当前的大小/提示策略决定 Sandboxie 是复制内容、创建空表示、拒绝迁移,还是走适用的回退。文件迁移设置 涵盖配置;始终复制、复制空的副本 与 不要复制 描述各条迁移规则。复制较新文件 是针对既有实时副本的独立刷新机制。
当 Sandboxie 拒绝所请求的内容迁移时,复制阻止拒绝写入 决定该路径是被拒绝,还是 Sandboxie 可以去掉写/删除能力后重试已解析的后备。降权重试仍可能失败,且后备可能是快照或已重定位的来源,而不是当前的宿主文件。这种拒绝处理不是所有迁移错误的回退。
创建表示或迁移数据都可能失败。原生权限与共享行为仍然相关,迁移也不是一个能把失败后每一次中间文件系统更改都回滚的通用事务。
合并视图、删除与快照
目录枚举可以合并来自实时沙盒状态、快照层与宿主/后备层的条目。对于同一逻辑名称,通常由上层可见层获胜。删除状态可以抑制在其下方仍物理存在的条目。由此得到的合并视图让应用程序在存储分散的情况下仍使用单一逻辑命名空间。
在常规虚拟化的沙盒中删除一个由宿主支撑的既有文件,并不需要删除宿主对象。Sandboxie 会记录沙盒侧状态,使该低层对象在沙盒视图中表现为不存在。V1 与 V2 以不同方式存储该状态,参见 虚拟化方案 V1 与 V2。这并不承诺通过每个元数据 API 看到的删除可见性都一致。
使用 沙盒快照 时,实时更改位于活动快照之上,其父快照可以提供更旧的后备。只有当更高层的可见状态既不提供也不抑制该逻辑对象时,才会触及宿主或其他已解析的后备。修改由快照支撑的对象可能创建或迁移出一个新的实时表示。快照管理与清理工作流记录在快照页面。
生效的文件访问模式
| 生效模式 | 架构结果 |
|---|---|
| 标准 | 使用常规合并虚拟化:低层后备可被读取,可变状态保留在沙盒侧。 |
| 开放 | 对匹配的操作直接访问真实/宿主路径,而不用常规复制虚拟化。 |
| 封闭 | 在常规复制路径之前拒绝匹配的逻辑访问。 |
| 只读 | 面向读取的模式使用直接真实路径访问,适用的写入强制执行另行处理。 |
| 只写 | 隐藏常规的低层后备数据,在沙盒/复制侧操作。 |
这些是选定生效规则之后的高层效果。规则优先级与嵌套例外另见 规则特异性。不应把封闭访问理解为让每一种可能的元数据查询都不可见,这些模式也不会授予或绕过 Windows ACL 权限。
虚拟化决定逻辑状态从哪里读取或存放。Sandboxie 的访问策略决定允许的操作以及是否适用常规虚拟化。Windows/文件系统权限管辖对物理对象的原生访问。仅靠写时复制并不构成完整的安全边界。
文件标识与 File ID
在一个逻辑卷上呈现的文件,可能物理存放在另一个卷上的沙盒存储中。在所有地方都返回原始物理 File ID,会让标识与按 ID 打开的行为与该命名空间不一致。因此 Sandboxie 在选定的查询路径中调整 ID,并对受支持的按 ID 打开情形做反向处理。这属于兼容性与标识处理,不是权限强制、加密或匿名化。
查询覆盖范围与后备标识
File ID 虚拟化是局部的、取决于 API 的。选定的基于句柄、基于名称与合并目录的查询路径可以在虚拟化视图中调整 ID,但覆盖范围并不在所有 Windows 信息类或枚举路径上一致。当前处理识别带 File ID 的形式,包括 FileInternalInformation、FileAllInformation、FileIdInformation、FileStatInformation、FileStatLxInformation 与 FileStatBasicInformation;该列表并不保证每个查询 API 都接受每种形式。
在已覆盖的句柄查询路径中,直接的宿主句柄通常保留其原生 File ID,而由实时或快照支撑的沙盒句柄可能获得 Sandboxie 调整后的标识。新建的、仅存在于沙盒的文件,其标识来自它自己的物理文件系统对象;Sandboxie 不会为它分配全局合成的、基于路径的 ID。迁移不承诺保留宿主文件先前的 ID。
不应假定目录枚举得到的 ID 与每个基于句柄或基于名称的查询返回的 ID 相同。当前枚举路径不提供通用的跨 API 标识保证:既不能假定所有宿主条目都保持原生,也不能假定所有条目都被转换。
稳定性与按 ID 打开
该转换对底层 ID 是确定性的,但 Sandboxie 不会为每个逻辑路径分配单独的持久合成标识。不要依赖标识在重建、迁移或 CopyNewer 替换、切换快照、移动或重建沙盒存储、恢复到宿主,或文件系统更改之后保持稳定。重启进程、SandMan 或服务本身,并不会在该机制中引入新的随机标识种子。
对于受支持的按 ID 打开路径,Sandboxie 可以重试标识解析并把结果转换回逻辑路径,之后适用常规的沙盒路径/规则处理。这不会绕过文件规则或 Windows 访问检查,也不保证重新打开最初查询的同一个物理快照层。
当前处理并未在所有文件系统与查询族上建立通用的 128 位 File ID 往返语义,尤其在标识的高位部分具有重要意义时。应用程序不应假定所有 File ID API 都暴露同一个完全合成的、可互相替换的标识。
卷信息
File ID 调整与卷信息是彼此独立的机制。某些文件元数据仍可能反映物理后备卷,而选定的卷查询可能被重定向到逻辑驱动器。Sandboxie 不提供完全合成的文件系统卷标识。
应用配置更改与生命周期
实时迁移或创建的文件系统状态会保留在沙盒存储中,直到被更改、删除或通过相关工作流重置。删除与快照状态同样是持久的沙盒状态,遵循各自的机制。
迁移规则与限制会在沙盒进程初始化时载入并缓存。更改这些设置后请重启受影响的沙盒进程以确保使用新值;这并不意味着与迁移相关的每个决策都被缓存。已打开的句柄继续指向它已经打开的对象,而不会被配置更改重新定向。File ID 转换本身不需要重启 SandMan。