【发布时间】:2014-10-18 03:09:04
【问题描述】:
我有一个沙盒化的 Cocoa 应用程序,在导出过程中,它需要运行第三方命令行工具。这个工具似乎被硬编码为使用/tmp 作为它的临时文件;沙盒不允许访问此文件夹,因此导出失败。
我怎样才能让这个工具运行?我无权访问它的源代码,所以我无法修改它以使用NSTemporaryDirectory(),而且它似乎不尊重TMP 或TEMPDIR 环境变量。由于我不明白的原因,给自己一个com.apple.security.temporary-exception.files.absolute-path.read-write 权利似乎也不起作用。
有没有办法在我的沙箱中重新映射文件夹?我可以使用一些晦涩的技巧吗?我应该尝试以某种方式修补该工具的二进制文件吗?到这里我就束手无策了。
【问题讨论】:
-
我立即想到的一个解决方案是使用
DYLD_INSERT_LIBRARIES,如所述,例如here 并覆盖open/fopen和其他相关的系统调用 -
另外你可能需要
dtrace那个第三方工具,检查你需要覆盖哪些系统调用。 dtruss 似乎是 DTrace MacOSX 内核工具的少数命令行前端。 -
你能控制访问/tmp的工具如何启动吗?如果您可以用自定义脚本替换它的调用,那么您就有了解决方案。如果不是,则需要一些额外的技巧。
-
我正在通过
NSTask启动该工具。大约一年前我尝试了DYLD_INSERT_LIBRARIES,但它没有用,因为(信不信由你)-[NSTask setEnvironment:]似乎没有做任何事情,至少在沙箱中是这样。但是,在启动之前调用 POSIXsetenv(3)似乎至少设置了可以使用/usr/bin/env看到的环境变量。我明天可以试试这个。 -
知道了! @user3159253,如果你写一些关于
DYLD_INSERT_LIBRARIES的东西,我很乐意给你赏金。
标签: c macos appstore-sandbox