Bre*_*don 8 c macos appstore-sandbox
我有一个沙盒Cocoa应用程序,在导出过程中,需要运行第三方命令行工具.此工具似乎是硬编码/tmp
用于其临时文件; 沙盒不允许访问此文件夹,因此导出失败.
如何运行此工具?我无法访问其源代码,因此我无法修改它以使用NSTemporaryDirectory()
它,并且它似乎不尊重TMP
或TEMPDIR
环境变量.由于我不理解的原因,给自己一个com.apple.security.temporary-exception.files.absolute-path.read-write
权利似乎也没有用.
有没有办法在我的沙盒中重新映射文件夹?我可以使用一些不起眼的技巧吗?我应该尝试以某种方式修补工具的二进制文件吗?我在这里结束了我的智慧.
我能够获得user3159253的DYLD_INSERT_LIBRARIES
工作方法.我希望他们会写一个答案来描述它是如何工作的,所以我将把这些细节留下来并解释最终特定于这个案例的部分.
感谢LLDB,肘部油脂,而不是Hopper的一点帮助,我能够确定用于mkstemp()
生成其临时文件名的第三方工具,以及一些调用(并非所有)使用固定模板开头/tmp
.然后我编写了一个libtmphack.dylib,它mkstemp()
在调用标准库版本之前拦截了调用和修改参数.
由于mkstemp()
需要一个指向预分配缓冲区的指针,我不觉得我可以将一个以"/ tmp"之类的短字符串开头的路径重写为到达沙箱内Caches文件夹所需的非常长的字符串.相反,我选择在当前工作目录中创建一个名为"$ tmp"的符号链接.如果工具chdir()
处于不合适的时间,这可能会破坏,但幸运的是它似乎没有这样做.
这是我的代码:
//
// libtmphack.c
// Typesetter
//
// Created by Brent Royal-Gordon on 8/27/14.
// Copyright (c) 2014 Groundbreaking Software. This file is MIT licensed.
//
#include "libtmphack.h"
#include <dlfcn.h>
#include <stdlib.h>
#include <unistd.h>
//#include <errno.h>
#include <string.h>
static int gbs_has_prefix(char * needle, char * haystack) {
return strncmp(needle, haystack, strlen(needle)) == 0;
}
int mkstemp(char *template) {
static int (*original_mkstemp)(char * template) = NULL;
if(!original_mkstemp) {
original_mkstemp = dlsym(RTLD_NEXT, "mkstemp");
}
if(gbs_has_prefix("/tmp", template)) {
printf("libtmphack: rewrote mkstemp(\"%s\") ", template);
template[0] = '$';
printf("to mkstemp(\"%s\")\n", template);
// If this isn't successful, we'll presume it's because it's already been made
symlink(getenv("TEMP"), "$tmp");
int ret = original_mkstemp(template);
// Can't do this, the caller needs to be able to open the file
// int retErrno = errno;
// unlink("$tmp");
// errno = retErrno;
return ret;
}
else {
printf("libtmphack: OK with mkstemp(\"%s\")\n", template);
return original_mkstemp(template);
}
}
Run Code Online (Sandbox Code Playgroud)
非常快速和肮脏,但它的工作就像一个魅力.
由于@BrentRoyal-Gordon 已经发布了一个工作解决方案,我只是复制我的评论,这启发了他提出解决方案:
为了修复程序行为,我将在DYLD_INSERT_LIBRARIES和具有给定系统调用的自定义实现的自定义共享库的帮助下拦截并覆盖一些系统调用。
需要重写的系统调用的确切列表取决于应用程序的性质,并且可以使用基于 MacOS DTrace 内核设施的许多工具进行研究。例如dtruss或Hopper。@BrentRoyal-Gordon 已调查该应用程序可以仅通过 /property/ 实现来修复mkstemp
。
就是这样。我仍然不确定我是否应得赏金:)
归档时间: |
|
查看次数: |
654 次 |
最近记录: |