应用程序如何以静默方式告知它是否正在沙箱中运行?

问题描述 投票:2回答:4

我正在编写可以运行沙盒的应用程序。

我想让我的代码独立于以后是否为沙箱进行代码签名,即我想在我的代码(或构建环境)中拥有一个常数,我必须对其进行更改以使代码知道它是否'是否会为沙箱构建。

自然,在某些情况下,我需要在代码中使用不同的API,具体取决于应用是否被沙盒化。

因此,我希望在我的应用程序中包含可以动态检测它是否在沙箱中运行的代码。而且我喜欢这样做,而不会在控制台日志中收到消息。也就是说,尝试访问沙箱中无法访问的文件不是一个好的解决方案,因为这将导致日志条目,进而使我的应用程序用户感到不安,认为有问题。

macos sandbox
4个回答
1
投票

我现在发现了一个简单得多的把戏:

我获得了Preferences文件夹的路径。如果看起来像这样,我将被沙箱化:

/Users/<user>/Library/Containers/<bundle_id>/Data/Library/Preferences

满足我的需求就足够了,我只是想避免看到控制台消息。如果Apple曾经更改过路径并且我的测试失败,那么我将看到的最糟糕的情况是有关拒绝操作的控制台消息。我可以忍受。


1
投票

正如您已经提到的,沙盒中的应用程序已代码签名。您可以通过命令行调用“ codesign”来检查是否存在此问题。

因此,如果您的程序可以使用以下命令调出命令行:-

codesign -d --entitlements :- <path to executable>

从命令中检索输出并搜索字符串:-

com.apple.security.app-sandbox

如果字符串存在,则将正在运行的可执行文件沙箱化。在应用程序启动时的初始化函数中执行一次此操作,并存储一个标志,以后可以进行测试。

-------编辑----------------

我还没有亲自测试过它,只是遇到了this article,其中包含用于检查应用程序是否已沙箱化的代码。完整的代码可以在github here上找到。

----编辑2 --------------

我终于检查了aforementioned article中的代码,并可以确认它可以按预期工作。


0
投票

我使用这个:

// Determine if an application is running in sandboxed mode
func IsSandboxed() -> Bool {
    let dir = NSHomeDirectory()
    let bundleName: String = NSBundle.mainBundle().bundleIdentifier as String!
    if dir.containsString("Library/Containers/" + bundleName) {
        return true
    }
    return false
}

0
投票
    import Foundation // For String/CFString bridging
    import Security

    if
        let task = SecTaskCreateFromSelf(nil),
        let value = SecTaskCopyValueForEntitlement(task, "com.apple.security.app-sandbox" as CFString, nil),
        let isSandboxed = value as? Bool
    {
        print("sandbox: \(isSandboxed)")
    }
© www.soinside.com 2019 - 2024. All rights reserved.