4

我的 cocoa 应用程序设计是一个 .app(UI)和三个 XPC 服务。

主应用程序需要文件只读以显示powerbox并在 UI 中显示所选路径

  • com.apple.security.app-沙盒
  • com.apple.security.files.bookmarks.app-scope
  • com.apple.security.files.user-selected.read-only

两个 XPC 服务需要文件只读

  • com.apple.security.app-沙盒
  • com.apple.security.files.bookmarks.app-scope
  • com.apple.security.files.user-selected.read-only

一项 XPC 服务需要文件读写

  • com.apple.security.app-沙盒
  • com.apple.security.files.bookmarks.app-scope
  • com.apple.security.files.user-selected.read-write

由于用户交互的流程,主应用程序会打开一个 powerbox 对话框,以允许用户选择一个目录并将其显示在 UI 中。然后,主应用程序将其保存为安全范围的书签。书签数据根据需要通过 XPC 连接发送,每个单独的 XPC 进程解析书签以访问其自己的沙箱中的这些文件。

问题是,除非我将主应用程序(打开电源盒)设置为具有文件读写访问权限,否则即使其权利文件指定文件读写访问权限,需要写访问权限的 XPC 服务也不会获得它。控制台中记录了以下内容:

deny file-write-unlink <file path>

解决此问题的唯一方法是为打开 powerbox 文件的主应用程序提供读写权限,或者重新设计 UI 流程以便需要写入权限的进程显示 powerbox?最终目标是让每个进程拥有尽可能少的权限。理想的权利是在主 .app 进程中没有文件访问权限,两个 XPC 服务具有文件只读和一个 XPC 服务文件读写。谢谢!

编辑:

容器外的 Powerbox 和文件系统访问

与用户交互以扩展沙盒的 OS X 安全技术称为 Powerbox。Powerbox 没有 API。当您使用 NSOpenPanel 和 NSSavePanel 类时,您的应用程序会透明地使用 Powerbox。

4

1 回答 1

5

我不是沙盒方面的专家,但是,嘿,即使是编写它的人也不是。劲!

无论如何,嵌入式 XPC 服务只允许包含应用程序的子集在架构上是有意义的,如果这确实发生了的话。可以提出反对它的论点,但论据是,如果应用程序必须在顶层声明所有内容,那么系统和用户更容易理解应用程序可能会做什么,而较低级别(XPC)只允许做多或少。

虽然尽量减少您的权利是令人钦佩的,但在这种情况下,您实际上是在打开一个文件进行读写,所以您不妨声明它。

于 2014-01-09T09:50:31.507 回答