問題描述
我最近得知,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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。