macOS Sandbox Debug & Bypass
沙箱加载过程
在上图中,当运行具有授权**com.apple.security.app-sandbox的应用程序时,可以观察到沙箱将如何加载**。
编译器将/usr/lib/libSystem.B.dylib链接到二进制文件。
然后,libSystem.B将调用其他几个函数,直到xpc_pipe_routine将应用程序的授权发送给securityd。 Securityd检查进程是否应该被隔离在沙箱中,如果是,则将被隔离。
最后,沙箱将通过调用**__sandbox_ms激活,后者将调用__mac_syscall**。
可能的绕过方式
绕过隔离属性
由沙箱进程创建的文件会附加隔离属性以防止沙箱逃逸。但是,如果您设法在沙箱应用程序中创建一个没有隔离属性的.app文件夹,则可以使应用程序捆绑二进制文件指向**/bin/bash,并在plist中添加一些环境变量以滥用open以启动新的未经沙箱处理的应用程序**。
这就是CVE-2023-32364中所做的事情**。**
因此,目前,如果您只能创建一个名称以**.app结尾的文件夹而没有隔离属性,您可以逃离沙箱,因为macOS仅在.app文件夹和主可执行文件中检查** 隔离属性(我们将主可执行文件指向**/bin/bash**)。
请注意,如果已经授权运行.app捆绑包(具有授权运行标志的隔离xttr),您也可以滥用它... 除非现在您无法在**.app**捆绑包中写入,除非您具有某些特权的TCC权限(在高沙箱中您将没有)。
滥用Open功能
在Word沙箱绕过的最后示例中,可以看到如何滥用**open**命令行功能来绕过沙箱。
启动代理/守护程序
即使应用程序应该被沙箱化(com.apple.security.app-sandbox),如果它是从LaunchAgent(~/Library/LaunchAgents)中执行的,仍然可以绕过沙箱。
如此文章中所述,如果要使一个被沙箱化的应用程序获得持久性,可以将其自动执行为LaunchAgent,并可能通过DyLib环境变量注入恶意代码。
滥用自动启动位置
如果沙箱进程可以在稍后将要运行二进制文件的未经沙箱处理的应用程序的位置写入,它将能够通过将二进制文件放置在那里来逃逸。这种位置的一个很好的例子是~/Library/LaunchAgents或/System/Library/LaunchDaemons。
为此,您甚至可能需要2个步骤:使具有更宽松沙箱(file-read*,file-write*)的进程执行您的代码,实际上会在将要未经沙箱处理执行的位置写入。
查看有关自动启动位置的页面:
macOS Auto Start滥用其他进程
如果从沙箱进程中能够危害运行在较不受限制的沙箱中(或没有沙箱)的其他进程,则可以逃离其沙箱:
macOS Process Abuse静态编译和动态链接
这项研究发现了绕过沙箱的两种方法。因为沙箱是从用户空间应用时加载libSystem库的。如果一个二进制文件可以避免加载它,它将永远不会被沙箱化:
如果二进制文件是完全静态编译的,它可以避免加载该库。
如果二进制文件不需要加载任何库(因为链接器也在libSystem中),它将不需要加载libSystem。
Shellcodes
请注意,即使ARM64中的shellcodes也需要链接到libSystem.dylib:
权限
请注意,即使某些操作可能在沙盒中被允许,如果应用程序具有特定的权限,就像这样:
Interposting Bypass
有关Interposting的更多信息,请查看:
macOS Function HookingInterpost _libsecinit_initializer 以防止沙盒
_libsecinit_initializer 以防止沙盒拦截 __mac_syscall 以防止沙盒
__mac_syscall 以防止沙盒使用 lldb 调试和绕过沙盒
让我们编译一个应该被沙盒化的应用程序:
在macOS中,沙盒是一种安全机制,用于限制应用程序的权限以保护系统和用户数据。然而,沙盒本身可能存在漏洞,允许攻击者绕过沙盒并执行恶意操作。为了发现和利用这些漏洞,可以使用调试技术和特权升级技术。
在macOS中,Info.plist文件包含了应用程序的配置信息,其中也包括了沙盒的配置。通过修改应用程序的Info.plist文件,可以调整沙盒的权限和行为。
然后编译该应用程序:
该应用程序将尝试读取文件**~/Desktop/del.txt,而沙盒不允许**。
在那里创建一个文件,一旦绕过沙盒,它就能读取它:
让我们调试应用程序,查看沙盒何时加载:
即使绕过了沙箱,TCC 也会询问用户是否允许该进程读取桌面上的文件
参考资料
最后更新于
