闪存通配符安全域风险

Flash wildcard security domain risk

我有一个关于在 Flash 方法 security.allowDomain 中使用通配符作为安全域的风险的问题。

假设 Flash 应用程序所做的唯一事情就是连续显示一些帧或图像,并且没有任何令人兴奋的功能。 Flash应用实现了System.security.allowDomain('*'),但是服务器没有跨域策略文件.

allowDomain documentation 中的第一张图片显示,恶意 SWF 可以使用具有通配符安全策略的 Flash 应用程序的所有功能。但是因为这个应用程序没有任何令人兴奋的功能,所以这不是问题。

恶意 SWF 是否可以在没有相应功能的情况下从 Flash 应用程序中窃取 cookie 或其他数据? Adobe 将 跨脚本 定义为:

movieA.swf can examine and modify variables, objects, properties, methods, and so on in movieB.swf

这是否意味着恶意 SWF 可以将函数修改为 return cookie 或在 Flash 应用程序的安全上下文中执行 JavaScript?

另一个资源,this tutorial page,讨论了跨域策略文件和 allowDomain 函数之间的区别:

The trust given to a SWF loaded into the current security domain goes beyond that given through allowDomain. Whereas with allowDomain you're effectively giving a SWF anything you can do, I can do permissions, when loading a SWF into the same security domain, you give them permissions along the lines of I can do anything.

但让我感到困惑的是,该页面描述由于 loadBytes 方法,这种差异是不存在的:

It's the difference between anything you can do, I can do and I can do anything. The difference being, there's actually no difference.

那么 allowDomain('*') 但没有功能或跨域策略文件的风险是什么?

据我所知,理论上可以让您的 swf 为所欲为。

注入代码并使其由当前应用程序域加载非常容易,因为 Loader.loaderBytes()

此外,我不明白为什么只有 "shows image in a row" 的 "simple application" 需要 Security.allowDomain

然而,拥有一个跨域 * 策略文件是非常危险的,因为攻击者可以读取您的 cookie 或代表用户从他拥有的任何域提交请求。

我建议您重新考虑在 Security.allowDomain 中使用通配符,并且只允许您信任的域。

真正的区别是 allowDomain 允许在代码级别进行跨域访问,而 crossdomain.xml 可以被认为是允许访问静态内容文件。


Does this mean that the malicious SWF can modify functions to return cookie or execute JavaScript in the security context of the Flash application?

对于 allowDomain,仅当 public 方法或变量包含此信息或在 SWF 中允许此功能时。

通过不受限制的 Flash 域设置绕过 crossdomain.xmlexploit like this are available which allows the Same Origin Policy。它不是完全访问权限,因为攻击者无法直接读取 cookie,但如果站点功能允许,他们可以使用它们来检索其他数据。

即您将允许托管 SWF 的任何域向您的域发出请求,然后检索响应。因此,您的用户可以通过他们在您域中的 Web 浏览器看到的任何信息,攻击者也将能够检索(假设您的用户已登录到您的网站并使用相同的浏览器浏览攻击者的网站)。

But what confuses me is that the page describes that this difference is non-existent because of the loadBytes method:

意思是,如果您信任另一个域的 SWF,那么这可能会使用 loadBytes 加载另一个 SWF。例如您的域 A 可能信任域 B 但不信任 C。如果您从域 B 加载 SWF,该 SWF 可能会使用 loadBytes 从域 C 加载某些内容,从而破坏您的信任模型。