检测运行的应用程序是否被沙盒化

5

如果给出应用程序的进程ID,有没有什么方法可以程序化地检测该应用程序是否在OSX沙盒环境中运行?

理想情况下,我想知道是否有 API 调用(最好是使用 C 而非 objective-C 语言编写,因为这是一个守护程序,所以不使用 Cocoa),但如果没有,还有其他检查的方法吗?


你可能可以使用CoreFoundation调用。 - Linuxios
@Linuxios,我以为他们可能会有,但你知道有什么是吗?我还没有找到。 - TheDarkKnight
请纠正我,但出于安全原因,通常不应该有任何方法。 - Medinoc
1
@Medinoc,如果请求应用程序在沙盒中,那么我会同意你的观点,但它不是。例如,Activity Monitor有一个沙盒列,显示了这些信息,所以肯定能够找到它。 - TheDarkKnight
3个回答

4
@Linuxios在某种程度上是正确的,确实有一些CoreFoundation调用,事实上,有几个组合起来可以用来解决这个问题,并且基于对SecStaticCodeCheckValidityWithErrors的调用。
对于任何想要或需要以编程方式测试应用程序是否被沙盒化的人可以按照此博客中的步骤进行操作。
此外,本文的完整代码已添加到Github 这里

1

首先,您需要从pid获取应用程序的路径,然后可以使用命令codesign --display --entitlements - app_path查看所有授权。如果应用程序的授权中包含com.apple.security.app-sandbox,则表示它被沙盒化了。

您可以在这里查看。


谢谢,虽然我更喜欢函数调用,因为我不想解析系统调用的输出。如果苹果更改权限名称,我的守护程序将无法正常运行。我知道我也可以使用asctl命令,它会打印出“启用App Sandbox运行”,但出于同样的原因,我尝试避免使用它。 - TheDarkKnight
codesign还接受pid作为参数,因此无需从pid查找路径开始。 - TheDarkKnight

0

要在Flex/AIR/AS3中检测沙盒,您可以使用以下的折衷方法。相同的方法也适用于objc。唯一不起作用的条件是如果文档文件夹完全为空。或者您可以使用任何其他被禁止访问的文件夹。

            var file:File = File.userDirectory;
            var a:Array = file.nativePath.split("/");
            var userName:String = a[2];
            var docFolder:File = new File("/Users/" + userName + "/Documents/");
            var dirList:Array = docFolder.getDirectoryListing();
            if (dirList.length>0) {
                docDirectoryDisplay.text = "App is NOT sandboxed.";
            } else {
                docDirectoryDisplay.text = "App is sandboxed.";
            }

什么是“文件”? - ScottyBlades

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接