问题描述
我最近得知,SVG(可伸缩矢量图形) 图像引入了许多在网络上进行微妙攻击的机会。 (见下文)SVG 图像可能看起来像图像,文件格式实际上可以包含 Javascript,并且可以触发加载或执行 HTML,Flash 或其他内容。因此,SVG 格式引入了新的潜在的方法来尝试将恶意内容窃取到网页上,或绕过 HTML 过滤器。
我正在编写一个 HTML 过滤器来消毒 user-provided HTML 。我需要在我的 HTML 过滤器中做什么来确保 SVG 图像不能用来绕过我的过滤器?我需要阻止哪些 HTML 标签和属性?过滤 CSS 时需要做任何事情吗?如果我想要简单地阻止所有 SVG 图像,SVG 可以嵌入到 HTML 文档中的所有方法是什么?
参考文献:
-
Crouching Tiger – Hidden Payload: Security Risks of Scalable Vectors Graphics,Mario Heiderich,Tilman Frosch,Meiko Jensen,Thorsten Holz 。 ACM CCS 2011 。
另请参见 Exploits or other security risks with SVG upload?(一个不同但相关的问题) 和 Mike Samuel’s answer elsewhere 。
最佳解决方案
据我所知,以下几种方法可用于指代 svg 。
-
<img src="http://example.com/some-svg.svg">
-
任何带有 CSS 样式的标签。例如
style="background-image:url(http://example.com/some-svg.svg)
-
对扩展进行过滤还不够。 HTTP 标头确定内容类型,而不是扩展名。
.jpg
文件可能被读取为 SVG 。因此,任何远程图像都是危险的。 -
您可以在网页中嵌入任何 XML 格式,包括 SVG 。
即使您检查了上述所有项目,也不能确定没有 SVG 注入。你可能想去 white-listing 而不是黑名单。
次佳解决方案
美好的一天!
编辑:对不起链接的链接 – 鉴于我刚刚创建了我的帐户回复这个我没有足够的”cred” 发布更多的 2 个链接每个帖子…
这个帖子不是我估计的最新鲜的 – 但是我要回复。我是您链接的本文的作者之一。我注意到,在这个线程中给出的一些建议是很好的意思和想法,但不是 100%正确。
例如,Opera 在处理通过<img>
或 CSS 背景嵌入的 SVG 时,并没有提供可靠的安全性。这里有一个例子,只是为了我们创建了一个通过<img>
嵌入的 SVG,它将包含一个 PDF,打开一个 skype:
URL,然后打给你:
-
http://heideri.ch/opera/
-
http://www.slideshare.net/x00mario/the-image-that-called-me
我们创建了 SVGPurifier – 一组扩展 HTMLPurifier 以便处理清除 SVG 的规则。当我们写这些规则 (你可以让他们,如果你想 – 让我知道,我会放在 Github),我们测试的每个浏览器都对 SVG 进行了不同的处理。还强烈依赖嵌入式方式:内嵌<embed>
/<object>
,<applet>
,<img>
,SVG 中的 SVG,CSS background
,list-style
和 content
…
原来,有可能在 SVG 中找到一个无害的子集,如果你的威胁模式主要涉及到 XSS 及其以外。如果您的威胁模式还包括例如减轻 UI 重叠,side-channels,历史窃取攻击以及它不会变得更难。这是一个有趣的片段,我们如何使用非常模糊的 JavaScript URI 处理程序引起 XSS:http://jsbin.com/uxadon
然后我们有内联 SVG 。在我个人看来,这是 W3C /WHATWG 曾经遇到的最糟糕的想法之一。允许 HTML5 文档在 HTML5 文档中,迫使他们遵守 HTML5 解析规则,什么不是安全噩梦。这是一个内联 SVG 的一个抓住的例子,它包含了 JavaScript,它将显示你将要处理的内容:http://pastebin.com/rmbiqZgd
对于这个整体而言,在安全/XSS 环境中可能出现的可怕的 SVG 可能长时间的悲伤,这里有一些建议。如果您确实仍然希望/正在处理此 HTML 过滤器,请考虑执行以下操作:
-
给我们一个公开的 some-test,我们可以锤击那个东西。
-
与您的 rule-set 灵活配合,每天都会有新的旁路。
-
确保知道过滤内联 SVG 的含义。
-
尝试看看 HTMLPurifier 方法是否可能是最好的。 White-list,不要 black-list 。
-
不惜一切代价避免使用 reg-ex 。这不是使用正则表达式的地方。
-
确保您的子集只允许在所有相关浏览器中测试了安全问题的元素。记得 SVG key-logger 吗?
http://html5sec.org/#132
-
研究已发布的 SVG-based 攻击,并准备定期寻找更多:
http://html5sec.org/?svg
我喜欢有人试图建立一个正确维护,甚至可以工作的 HTML + SVG 过滤器的想法,我会非常乐意测试它 – 我也假设许多其他人); 但请注意:HTML 过滤是非常困难的已经 – 和 SVG 只是增加了一个全新的难度。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。