問題描述

我最近得知,SVG(可伸縮矢量圖形) 圖像引入了許多在網絡上進行微妙攻擊的機會。 (見下文)SVG 圖像可能看起來像圖像,文件格式實際上可以包含 Javascript,並且可以觸發加載或執行 HTML,Flash 或其他內容。因此,SVG 格式引入了新的潛在的方法來嘗試將惡意內容竊取到網頁上,或繞過 HTML 過濾器。

我正在編寫一個 HTML 過濾器來消毒 user-provided HTML 。我需要在我的 HTML 過濾器中做什麼來確保 SVG 圖像不能用來繞過我的過濾器?我需要阻止哪些 HTML 標籤和屬性?過濾 CSS 時需要做任何事情嗎?如果我想要簡單地阻止所有 SVG 圖像,SVG 可以嵌入到 HTML 文檔中的所有方法是什麼?

參考文獻:

另請參見 Exploits or other security risks with SVG upload?(一個不同但相關的問題) 和 Mike Samuel’s answer elsewhere

最佳解決方案

據我所知,以下幾種方法可用於指代 svg 。

  1. <img src="http://example.com/some-svg.svg">

  2. 任何帶有 CSS 樣式的標籤。例如 style="background-image:url(http://example.com/some-svg.svg)

  3. 對擴展進行過濾還不夠。 HTTP 標頭確定內容類型,而不是擴展名。 .jpg 文件可能被讀取為 SVG 。因此,任何遠程圖像都是危險的。

  4. 您可以在網頁中嵌入任何 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 backgroundlist-stylecontent

原來,有可能在 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。