这篇博文披露了MacOS上的一个沙盒转义。我在2019年12月19日,也就是苹果安全赏金计划最终开放的那一天,向苹果产品安全部门报告了这个问题。(我在2019年8月发现了这个问题。)。今天我收到苹果产品安全部门的一封电子邮件,说我们没有看到任何实际的安全隐患。我以前听过这样的回复-他们没有看到任何安全隐患…。直到他们这么做--但无论如何,我显然是不会收到赏金的。
附件是一个示例Xcode项目,它演示了沙箱Mac应用程序如何通过一次点击就可以逃离沙箱。此沙盒转义适用于当前的公开发布版本MacOS 10.15.2。我还在MacOS10.14.6上测试过。
要复制、构建和运行示例应用程序,请执行以下操作。然后,当系统对话框询问示例应用程序是否可以通过Apple事件控制TextEdit时,单击以允许。这将允许样例应用程序在沙箱外的目录";/Users/Shared";中创建一个名为";ESCRIFE";的文件。你还会听到应用程序说“嗨”,表示它已成功逃离沙盒。示例应用程序实际上启动了一个shell脚本";test.sh";,该脚本可以在沙箱之外运行任意代码。
通过TextEdit拥有的授权";com.apple.security.files.user-selected.executable";,沙箱转义成为可能。它也被一些Mac应用商店的应用程序所拥有,比如BBEdit。(请注意,虽然TextEdit和BBEdit本身是沙箱,但此权限也允许它们脱离自己的沙箱。因此,任何具有";com.apple.security.files.user-selected.executable";权限的应用程序都只是名义上被沙箱保护,实际上并没有被沙箱保护。)。
通常,当沙箱应用程序写入文件时,该文件会被隔离。如果文件是shell脚本,则隔离扩展属性将阻止该脚本运行。但是,当具有";com.apple.security.files.user-selected.executable";权限的应用程序(如TextEdit)保存文件时,它会删除隔离扩展属性!
我的示例应用程序在TextEdit中打开一个shell脚本,然后它使用Apple Events权限告诉TextEdit保存文件,从而移除隔离并允许脚本在应用程序的沙箱之外执行。
这对用户来说应该是非常无害的,因为没有人认为TextEdit是危险的,所以人们会认为允许控制TextEdit没有太大风险。
请注意,我选择/Users/Shared目录是为了避免MacOS隐私保护,这些隐私保护会阻止与各种其他目录(如桌面、文档和下载)交互。另请注意,此问题(如果您认为它是一个问题)在最新版本的MacOS 10.15.4上仍然存在。
我写了一篇新的博客文章,试图澄清这里提出的一些问题。