安全是所有软件开发的一个重要方面,Unity项目也不例外。在Unity Responsible Disclosure政策的指导下,我们与外部研究人员展开了紧密合作,研究了Unity环境中可能出现的漏洞或问题。在最近的一次合作中,我们联系上了IncludeSecurity的安全专家。通过采取协调排查(Coordinated Vulnerability Disclosure,CVD)的方法,我们希望揭示出Unity开发者可能会碰到的几种不安全开发实践。本篇博文的两个主题是依赖混淆和AssetBundle安全性。
依赖供应链安全漏洞是一个值得所有开发者仔细考虑的重要问题。
这其中,就有一个被称为依赖混淆(Dependency Confusion)的漏洞。依赖混淆是指攻击者通过篡改开发者的环境和工具来下载恶意软件。这种攻击利用了几种不安全的软件包管理器和私有资源库默认行为。
Unity编辑器有自己的Unity Package Manager,它支持根据NPM注册表抓取软件包。而使用私人NPM注册表的Unity开发者也可能面临上述的依赖混淆漏洞。
举例来说,有这么一个Unity项目须从私人注册表和公共注册表(如npm.io)中提取软件包。作为标准的开发实践,开发者可以将包A上传到私人注册表。这时若包管理器的注册表范围太广,或使用了私人注册表来提取公共注册表的内容,那么攻击者可以把伪装成高版本的恶意软件包A上传到公共资源库。更高版本的恶意软件在更新时可能会被下载到Unity项目中,让开发设备或运行设备在加载依赖时执行其中的恶意代码。
注意:Unity不建议使用NPM等公共注册表。Unity编辑器不支持这些公共资源库中的大多数软件包,Unity Package Manager也不支持包的许多功能。
如果开发者在Unity编辑器中使用了私人软件包或代理公共资源库的私人注册表,便有可能遭受依赖混淆攻击。IncludeSecurity曾在这篇文章中描述过此类攻击。
重要提示:Unity Package Manager的默认配置不会受依赖混淆漏洞的影响。开发者只有像下文那样修改manifest.json文件才有可能受到攻击。请在下方的“对策”部分对照查看你的本地软件包配置是否有风险、了解怎样消除风险。大多数开发人员并不用担心,但最好熟悉相关内容,防止代码库和客户方出现风险。
在下方易受攻击的配置示例中,项目使用了一个代理注册表作为其唯一的范围注册表,它从私有注册表和公共NPM注册表中提取信息。由于该范围内的包共享同一个注册表,攻击者可以伪装成高版本的 "com.private.vulnerable.package "上传到NPM注册表,让开发者在更新时下载恶意软件。
易受攻击的配置示例。
安全配置示例:
AssetBundle是Unity引擎传输资源的一种标准化格式。它们通常用于在需要时将额外的资源下载到游戏客户端中,减少游戏初次启动所需的数据量。在特定情况下,AssetBundles甚至可以用来分发修改或定制Unity项目所需的自定义内容。
在使用AssetBundles时,保证下载源的安全性非常重要。尽管AssetBundles不包含可执行代码,IncludeSecurity发现攻击者仍旧能借助特制的AssetBundle文件来利用游戏代码或Unity运行时的漏洞。IncludeSecurity所描述的问题尚属首次发现。
在这个前提下,网上下载的资源包应与任何其他软件一样受到重视。
作为创作者,我们需要明确依靠他人的工具和服务来辅助创造是有一定风险的。开发者完全有必要花点时间来检查自己的工具链是否安全、配置是否得当,从而保证自己和用户的安全。
更多关于Unity Security和Unity安全建议的信息请在此处了解。