[macOS翻译]Mojave带来重大安全变化

83 阅读7分钟

本文由 简悦SimpRead 转码, 原文地址 latenightsw.com

macOS 10.14 Mojave 大幅加强系统安全性,对 AppleScript 的影响如下:......

macOS 10.14 Mojave 大幅加强了系统安全性,对 AppleScript 的影响很大。在升级之前,您应该先熟悉一下新规则,尤其是因为在某些情况下,您可能需要先对现有脚本进行修改。

这些变更主要影响三个方面,并将对所有脚本编写者产生不同程度的影响。本摘要基于我们目前发现的情况,可能还有其他更小的问题。如果有其他问题出现,我们会及时更新这篇文章。

告别脚本添加

除苹果标准附加组件(即位于 /System/Library/ScriptingAdditions)之外的脚本附加组件在 Mojave 中实际上将无法使用。这些附加组件及其术语根本无法加载。如果打开的现有脚本使用了其他脚本附加组件中的命令,则该命令将以原始的 chevron 风格形式显示(«event ABCDEFGH»)。如果运行使用此类命令的 applet,它将会失败,而且很可能没有任何错误信息。

这一点早已有所暗示。苹果公司早在一段时间前就开始阻止开发人员编写附加程序,首先鼓励他们考虑编写可编写脚本的无界面后台应用程序。随着可以访问 Objective-C 框架并包含自己的脚本字典的脚本库的引入,他们逐步对附加命令的使用方式引入了安全限制,这就变成了一个 "何时 "而不是 "是否 "的问题。

尽管如此,目前还没有正式的直接公告,因此这对某些用户来说将是一个冲击和痛点。如果你使用第三方插件,你将需要从其他地方开始寻找同等功能。AppleScriptObjC 或一些公开可用的脚本库都提供了与某些常用命令类似的功能,而且一些附加组件的作者也有可能在不露面的后台应用程序或脚本库中提供等效或类似的功能。

那么,为什么 "实际上 "无法使用呢?如果脚本附加组件是在小程序的捆绑包中,而不是在 /Library/ScriptingAdditions~/Library/ScriptingAdditions 中,那么小程序仍能加载该脚本附加组件。它必须位于小程序包资源目录中名为 "脚本附加组件"(注意空格)的文件夹内,必须经过代码签名,并且所包含的小程序也必须以相同的签名身份经过代码签名。

如果您有一个依赖于脚本附加功能的现有脚本小程序,您可以在不违反任何许可条件的情况下,在其捆绑包中对附加功能进行代码签名并嵌入其副本。但您需要在升级前完成这项工作。一旦您在 Mojave 系统上安装了该脚本,您将无法在脚本调试器(或任何其他脚本编辑器)中编辑或测试该脚本,因为编辑器无法加载其捆绑包之外的附加组件。

因此,您最多只能考虑将嵌入作为临时解决方案。

发言权限

任何通过系统事件(System Events)编写过界面脚本的人都知道,小程序需要获得许可才能这样做。这些权限在 "系统偏好设置 "的 "安全与隐私 "面板的 "隐私 "选项卡中的 "可访问性 "标题下进行控制。

从 Mojave 开始,应用程序(包括小程序和第三方脚本编辑器)需要获得许可才能向其他应用程序发送 Apple 事件。应用程序首次尝试为其他应用程序编写脚本时,会要求用户批准。然后,该应用程序和任何目标应用程序都会列在系统偏好设置同一面板的 "自动化 "标题下。

脚本调试器的 "字典资源管理器 "通过发送 Apple 事件来工作,因此,如果这是你处理特定应用程序的第一个地方,那么在继续探索之前,你会被要求获得许可。

与界面脚本一样,在修改脚本时,无论是编辑还是更改持久性顶层属性值,都会再次征求许可。但小程序已进行代码签名的情况除外--在这种情况下,可以编辑脚本而无需进一步授权(前提是捆绑标识符和签名标识保持不变)。

如果您不同意,今后尝试编写该应用程序脚本时将会失败,并生成错误 -1743。一旦您拒绝,系统将不会再次提示您。要改变主意,需要进入 "系统偏好设置",通过选中(或取消选中)相应的复选框进行更改。(在更改生效之前,你可能还需要退出并重新启动应用程序)。

在实际操作中,如果你分发脚本,你可能希望在脚本[1]的开头附近尝试编写任何目标应用程序的脚本,这样用户就能一次性收到所有提示,如果权限未被授予,你也可以从容退出。在 "系统偏好设置 "中无法对应用程序进行预先授权。

框架限制

Apple 的脚本编辑器在与其他应用程序对话前无需请求权限,而作为第三方应用程序的脚本调试器则需要。不过,脚本编辑器在框架方面有更大的限制。

脚本库可以包含嵌入式 Objective-C 框架,为其提供扩展功能。Myriad Tables.scptd 就是这样一个例子,还有其他一些例子。但在 Mojave 中,脚本编辑器无法运行使用此类库的脚本,因为它拒绝加载外部代码。苹果内置的脚本菜单也有同样的限制。

脚本调试器和 FastScripts 没有这种限制。重要的是,即使是从脚本编辑器中保存的小程序,也不受这种限制。

请注意,这只适用于涉及第三方框架的脚本库,而不适用于使用标准 Cocoa 库的脚本库。

四处探索的权限

某些系统目录被禁止使用已有一段时间,在 Mojave 中,苹果甚至对某些用户目录也引入了更严格的限制。包括脚本 applet 和脚本编辑器在内的应用程序将无法访问许多此类目录,除非用户特别授予它们权限。

这包括 "主目录 "和"~/Library "的大量子目录。这意味着 Mail 和 Safari 文件以及许多设置文件。

用户可以在 "系统偏好设置 "的 "安全与隐私 "面板中,在 "全盘访问 "标题下授予应用程序访问这些文件的权限。面板上有 "+"和"-"按钮,可以用来添加或删除列表中的应用程序。

不过,与上述 "自动化 "设置不同的是,应用程序无法提示您获得此权限。此权限不能在对话框中授权,只能在系统偏好设置中授权。如果未授予此权限,脚本将跳出错误代码 1("不允许操作")。

如果不授予脚本调试器此权限,也将无法编写或测试需要此权限的脚本。它还会限制某些功能的工作方式,例如 "快速打开"。

如果使用其他实用程序(如 FastScripts)运行脚本,则需要授予它们类似的权限。(对于许多用户来说,需要 "全磁盘访问 "才能使用不受限制功能的应用程序数量可能会很多)。

解决方法和故障排除

大多数新限制都是 macOS 10.11 El Capitan 首次引入的系统完整性保护计划的扩展。可以禁用 SIP,在这种情况下,上述许多限制将不适用。(发送事件的审批要求是单独处理的,不能禁用)。

也有报告称设置无法按预期运行。如果您认为可能发生了这种情况,可以使用命令行工具 tccutil 重置为默认设置。要重置自动化权限,请在终端中运行以下命令:

tccutil reset AppleEvents

要重置全磁盘访问权限,请运行以下命令:

tccutil reset SystemPolicyAllFiles

这些命令是全有或全无的,你不能只删除一个应用程序的权限。

[1] - 如果不方便重组脚本,可以发送对应用程序状态没有影响的查询 AppleScript 命令,如 count windowscount documents,以触发系统提示获取与目标应用程序交互的权限。

有关这些更改对脚本调试器的影响,请参阅 此处


www.deepl.com 翻译