查看原文
其他

如何在Unity应用中更安全地使用URL处理器和OpenURL

Unity Unity官方平台 2022-05-07

Unity Security团队致力于帮助Unity创作者构建更加可靠的游戏和应用,我们将通过一系列文章介绍使用Unity开发更安全的游戏和应用的技巧、方法和建议。


新系列文章将介绍使用Unity安全地进行开发,并提供实用内容,让Unity开发人员可以直接应用到自己的游戏和应用中。我们希望涵盖从基础到高级的各种主题,并注重Unity产品和服务的最佳使用实践。


本文是新系列文章的第一篇,我们将介绍URL处理器。



如何在Unity应用中安全地使用URL处理器和OpenURL

 

URL和文件处理器可以关联文件类型和可打开相应文件的已安装程序,但存在一定的风险。


在本地计算机上双击打开本地硬盘上的PDF文件时,操作系统会查找文件处理器的列表,选择该文件类型指定的程序,因此PDF文件会通过能够正确显示文件的程序打开。文件处理器通常根据文件扩展名,例如:.pdf,即文件名的后缀,来确定如何处理文件。

 

URL处理器也使用类似的机制,根据路径前缀来决定如何打开URL。


例如:对于常见的“http://”协议,URL处理器会使用默认浏览器打开它。另一种常见的URL类型是“file://c:/windows/system32/drivers/gmreadme.txt”,如果在“运行”窗口中打开该URL,Windows系统会使用记事本打开该文本文件。

 

URL处理器是操作系统中非常实用的功能,帮助用户快速启动应用,节省许多时间。然而,该机制虽然方便,但有时并不安全。


为什么URL处理器对Unity游戏很重要?

 

Unity Editor和Unity Runtime通过使用.NET Framework以及通过特定的Unity脚本API即Application.OpenURL,来支持URL处理器的编程使用。

 

游戏开发人员经常使用OpenURL,当玩家点击游戏中的链接时,便会打开本地系统的网页浏览器。然而,如果游戏开发人员没有仔细清理传入Application.OpenURL的内容,那么玩家可能面临风险。

 

该脚本API从本质上来说是安全的,但如果传入的URL混入了不受信的输入内容,那就要小心了。

 

不受信的输入

不受信的输入或数据是来自不受信任来源的数据。什么是受信任的来源呢?只有站点启用HTTPS严格安全传输协议才会视为受信任的来源。


不受信任的输入有许多例子。如果你想设计防作弊系统,则应将玩家的本地文件系统视为不受信任的。如果你正在开发多人游戏,则应该将所有玩家视为不受信任的。


当然还有一些其它保护数据或输入的方法,包括:利用公私密钥加密功能,但这不在本文的讨论范围之内。


URL处理的不安全使用案例


虽然这类处理器能够为用户提供不少便利,但它们本身带有风险。


下面是Application.OpenURL的不安全使用案例。

using UnityEngine;

using   System.Collections;


public   class VulnerableBrowserClass: MonoBehaviour {

    // 当玩家点击论坛上某个链接时,传入此链接的URL

    void OpenBrowser(string url_from_chat) {

        Application.OpenURL(url_from_chat);   // 这是问题所在;数值未经过清理

    }

}


在这个示例中,游戏内的评论系统允许用户分享链接,在用户点击链接时,便会调用VulnerableBrowserClass.OpenBrowser函数。


下图是链接带有潜在危险的示例场景。


我们可以发现向一个毫无戒心的用户发送带有潜在危险的应用链接是多么容易。如果该URL直接传入Application.OpenURL,受害者的机器将立即运行链接里的应用程序,可能导致受害者的系统受到攻击者操控。


在上图中,攻击者可以在聊天窗口中将链接伪装成:https://SuperLeetCheats.com/VulnTheGame


而实际地址却是恶意软件的链接:

file://leethaxorz.net/super_malware.exe


这里的问题并不是用户可以互相分享链接,而是在点击潜在攻击者用户的链接后,程序会直接将链接传入Application.OpenURL,不经过任何验证和清理,过程类似前面的代码。


如果没有清理过程,在用户点击链接时,Unity编辑器会直接将文件传到目标玩家的操作系统中,并有可能执行攻击者的恶意程序。


如何减少风险?


最安全的方法是:不在Application.OpenURL中使用任何不受信数据,只使用它来打开开发人员或服务器传来的URL,并使用受信的传输协议。例如:HTTPS协议。


如果你使用了远程配置功能,例如:托管了一组内容URL来用于更新,那么请确保只通过严格的HTTPS来检索数据。任何远程内容都应该以这种方式进行检索。


请注意,如果应用中使用了不受信/未清理的输入数据,类似上文介绍的攻击案例,HTTPS不会修复任何缺陷。然而,它会确保发送给玩家的数据不会在传输过程中被篡改。


如果必须在OpenURL使用不受信来源的数据,请一定仔细清理从不受信来源收到的数据


使用正则表达式、通过.Net库构建URL、或使用外部清理库等方法都可以进行数据清理,但是这些方法并不总是有用,不论使用了哪种方法,只要在Application.OpenUrl或类似函数上使用了不受信数据,就会存在风险


用户可能无法知道链接表面下暗藏了什么URL。所以,至少要让用户在访问链接前,提示完整的URL地址。然而,这也不是很可靠的方法,因为用户常常会忽视任何提示,盲目地直接点进链接。


为什么要处理OpenURL和文件处理器?


对于开发人员而言,使用OpenURL和文件处理器非常普遍,特别是在富媒体应用程序和社交媒体类功能,例如:游戏内聊天、评测和评论,用户常常会分享游戏之外的网络内容。


此外,在常见的制作过程中也会用到OpenURL和文件处理器,例如:编辑配置文件时,我们会把链接传入操作系统,打开用户的偏好代码编写工具,方便进行工作。


Application.OpenURL是独立于平台的API,支持文件处理器,通过使用它,Unity开发人员不用为每个平台都编写处理器,节省许多时间和精力。


这种问题是Unity编辑器和运行时独有的吗?


不是。如上文所说,该功能被普遍应用于大多数操作系统中,支持许多语言和架构。


请小心使用这两个Windows API:Windows.System.LauchURIAsync,常用于通用Windows平台(UWP)应用中;System.Diagnostics.Process.Start这两个原生.Net库提供类似Application.OpenURL的功能。


LaunchURIAsync可以在Windows安全应用沙盒中启动应用,而Process.Start可以在本地系统中启动任何可执行程序。


此外,部分原生操作系统的调用也提供相同的功能,例如:Apple的open(_:options:completionHandler:)如果不受信或未清理的输入内容传入这些API,那么这类API可能容易被滥用。


小结


我们将定期发布文章,讨论Unity开发过程中维持安全性的最佳使用实践。未来的话题包括:游戏数据的安全传输,推广安全软件开发生命周期SSDLC。我们也将开源内部指南和安全工具。


你希望在未来的文章深入了解什么安全问题呢?不妨留言告诉我们。了解更多的Unity Security团队信息和安全方面的建议:

https://www.unity3d.com/security


下载Unity Connect APP,请点击此处 观看更多Unity官方精彩视频,请关注“Unity官方”B站账户。


你可以访问Unity答疑专区留下你的问题,Unity社区和官方团队帮你解答:

Connect.unity.com/g/discussion


推荐阅读

在Shader Graph中使用表面梯度框架合成法线贴图

揭秘《Sherman》:使用Unity制作影视级光照效果

运用Unity进行自动驾驶中的程序化生成

ML-Agents:让机器学习训练加速7倍

Unity 2019.3新资源导入管线入

使用FPS Microgame制作你的第一款Unity游戏


官方活动

 Unity X 创想家计划

「Unity X 创想家计划」是针对中国地区9-15岁青少年的编程教育计划,火热报名中~~[了解详情...


Asset Store黑色星期五资源大促

11月25日-12月2日,Asset Store最受欢迎的资源将进行5折大促,每日一款特惠插件3折优惠。[了解详情...



喜欢本文,请点击“在看”

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存