科技議題

首頁> 科技議題 - 智慧科技> 內容安全策略 ─ 防止跨網站腳本攻擊
內容安全策略 ─ 防止跨網站腳本攻擊 Mitigating Cross-Site Scripting Attacks with a Content Security Policy
Imran Yusof
2016/03
http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=7433336&newsearch=true&queryText=Mitigating%20Cross-Site%20Scripting%20Attacks%20with%20a%20Content%20Security%20Policy
內容安全策略(CSP)能夠幫助網頁應用程式開發者及伺服器管理員更易於管理網站內容,並防止跨網站腳本攻擊(XSS)。筆者分別在四個大眾較常使用的瀏覽器上,以一個樣本網站做測試,皆成功以CSP阻擋所有類型的XSS。
在眾多網站攻擊的類型中,跨網站腳本攻擊(XSS)是最常見的一種。XSS攻擊的模式包括:在使用者不知情的情況下,將惡意的腳本植入到使用者所瀏覽並信任的網站,然後攻擊者就可以從中取得該瀏覽器所存取的使用者資訊(例如: session tokens、cookies等)。而當攻擊者取得這些使用者資訊,就可以進行許多惡意行為,像是竊取個資、鍵盤側錄、網路釣魚、盜用使用者、遠端開啟電腦鏡頭進行監看…等。
即使是廣受大眾所使用的應用程式,都還是會受到XSS的攻擊,事實上,自從2003年,他們第一次回報給「電腦網路危機處理暨協調中心」的顧問,告知遭受攻擊開始,這些攻擊一直驚人的成長。開放網路軟體安全計畫(OWASP)組織在他們於2013年所公布的「網站應用程式十大弱點(OWASP Top 10)」將XSS列為第三名,並稱他為「最流行的網站應用程式安全漏洞」。白帽安全公司(WhiteHat Security)在2013年5月的網絡安全報告統計指出,網站應用程式所受到的攻擊中有43%皆來自XSS植入攻擊,由此可見這種攻擊行為的廣泛性。
XSS的類別
XSS可以分為持續性或非持續性,也可以建立於文字物件模型(DOM)
持續型XSS
這種攻擊種類是將惡意腳本植入到網站的資料庫中,當此網站沒有正確的從資料庫過濾腳本時,這個惡意腳本便可以存在於網站應用程式中,並且以該網站的權限在使用者的瀏覽器上執行。這種持續型XSS並不需要惡意連結才能成功觸發,只要瀏覽該網站便可以危害使用者。持續型的XSS通常較難被偵測到,並被認為比另外兩種XSS攻擊種類更具傷害性。因為惡意的腳本會自動渲染,所以並不需要鎖定特定的目標或是引誘使用者們進入第三方網站。由於上述的特性,攻擊者可以很輕易地隱藏他們的攻擊行為;舉例來說,在一個部落格中,攻擊者可以將惡意腳本鑲嵌在看似無害的留言或者評論中,這樣一來,拜訪這個網站的使用者們便會在不知情的情況下把他們的瀏覽器(還有儲存在瀏覽器的資料)暴露在風險中。
非持續型XSS
通常,攻擊者會將他的惡意腳本隱藏在某個網址中,將他偽裝成使用者的輸入,然後寄一封作為誘餌的電子郵件給受害者,引誘他們點及附加在郵件中的網址。受害者們點擊網址後,那些有害的腳本便會在他們的瀏覽器上開始執行,讓攻擊者可以通過認證,或是竊取資料。
DOM-base XSS
一個網站是由各種元素所組成的,像是字體、段落、表格等可以表達物件差別的格式。為了能夠動態的更新網站內容的結構以及風格等,所有網站應用程式與網頁會跟文件物件模型(DOM)交互作用,也就是一個可以存取這些網站元素的虛擬地圖,犧牲一個DOM會導致客戶端代碼以意外的方式執行。
了解內容安全策略
CSPs(內容安全策略)並不是一個新的構想。最初是由Mozilla基金會所開發的,當時(2001年)是CSP這個概念第一次被應用在火狐瀏覽器第四代上,並在2012年11月成為萬維網聯盟的推薦候選。由網站應用程式開發者,或伺服器管理者所寫的CSP可以作用在網頁上,讓瀏覽器知道哪些網頁資源是他被允許執行的。創造出CSP背後的動機是希望能在不大幅修改應用程式的來源碼之下仍然可以避免XSS攻擊。
CSP是如何運作的
一個採用CSP的瀏覽器只會遵循CSP的指令 ─ 一個規定編譯器(或直譯器)如何處理所獲得的輸入值的語言。預設情況下,CSP是被禁止在網站上使用內嵌腳本的。例如以下的XSS內嵌負載(使用Java Script):>X
同時,CSP也提供使用Java Script中的evalv系列的功能。以下就是一個使用eval的XSS攻擊負載範例:
x

有支援的瀏覽器
根據萬維網聯盟(W3C)的規範,內容安全性策略標頭檔是標準標頭檔,並被目前大多數瀏覽器的版本所使用。包括了火狐23(含)以上的版本、Chrome 25(含)以上的版本、Safari 7(含)以上的版本,跟iOS Safari 7.1(含)以上的版本。
來源指令
CSP的來源指令控制當客戶端的瀏覽器遇到各類型被保護的網站內容(從JavaScript到連接位置)時,該如何反應。我們最常用來描述來源指令的是預設、腳本跟風格。
Default source.
網站應用程式開發者或是伺服器管理員使用預設來源(default source),或是default-src指令來定義資源的白名單(white list)。使用這些指令的範例如下:
Content-Security-Policy: default- src ‘self’
這是允許客戶端的瀏覽器只能從網站應用程式所屬的來源下載資源。
而 Content-Security-Policy: default- src ‘none’ 則是指定none這個字是沒有資源被允許存取。
Script source.
script-src指令控制的是網站上JavaScript的下載。其第一部分的範例如下
Content-Security-Policy: default- src ‘none’;
script-src script .example.com javascript.example .com
而第二部分允許客戶端的瀏覽器從script.example.com跟javascript.example.com下載腳本。第二部分default-src的政策制定也就是說,沒有資源(腳本)是允許的,除了從script.example.com和javascript.example.com加載。
Style source.
Style-SRC直接控制網頁上的Cascading Style Sheets (CSS)和其他網頁上的樣式。
Content-Security-Policy:
default- src ‘none’;
style-src ‘unsafe- inline’ maxcdn.bootstrapcdn.com
該政策允許使用內聯風格和僅bootstrapcdn.com樣式表。它不允許的任何其他來源,如連接,框架,和媒體源的加載。
Object source
Object –SRC定義資源的白名單且從該瀏覽器允許下載資源,同時構建標籤。
Content-Security-Policy:
default- src ‘none’;
object-src plugins .example.com applet.example.com
樣本策略定義'無'的預設-SRC,然後允許該物件可裝載兩個有效位置。
Image source
IMG-SRC指出種類的域來自該圖像且可以被下載。
Content-Security-Policy:
default- src ‘none’;
img-src img.example .com images.example.com
在樣本策略的圖像只能從img.example.com和images.example.com下載;其他所有的圖像源域將被阻止。
Media source.
media-src 這個媒體可以被下載。
Content-Security-Policy:
default- src ‘self’;
media-src video .example.com youtube.com
在這個簡單的策略下媒體來源被限制在video .example.com 和 youtube.com下,其他所有的資源必須來自Web應用程序本身的起源。
Font source.
Font-src 字體可以被加載。
Content-Security-Policy:
default- src ‘self’;
font-src ‘self’ http://fonts.gstatic.com
這個簡單的政策允許字體從fonts.gstatic.com,但是其他所有的資源必須來自Web應用程序本身的起源。
Frame source.
frame-src 瀏覽器被允許呈現幀
Content-Security-Policy:
default-src ‘self’;
frame-src ‘self’youtube.com video.com
這個策略允許幀從youtube.com和video.com;所有的其他資源必須來自於Web應用程序自己的原點。
Connect source.
Connect-SRC指令允許連接了XMLHttpRequest,的WebSockets和EventSource的位置。禁止連線到其他地方。
Content-Security-Policy:
default-src ‘none’;
connect-src xhr.example.com
允許XHR傳出連接.example.com的並阻止任何其他資源。
Report-only mode with the report-uri directive
在報告模式下,CSP告訴瀏覽器不用阻止不允許的元素。雖然貌似事與願違,這種模式下,report-URI指令一起創建一個具有指定端點CSP配置的預演。透過該指令,瀏覽器可以回報政策違規或者是運行過程中有有害內容到服務器的存在。然後,伺服器存儲或處理採取進一步行動的報告。

實驗評價
為了測試我們的CSP的有效性,我們創建了一個樣板網站,在Apache網絡服務器上運行,並通過用戶的個人資料頁允許不可信的HTML輸入。圖8示出我們用於改變網絡服務器的配置在CSP標題。類似的配置可以在任何特定的頭頁面進行設置。因為default-src指令是“無”,在CSP禁止所有資源,除了白名單和可信資源加載。任何政策違規調用report-uri指令。我們使用XSS小抄的集合從以前work3和50個獨特的XSS向量來模擬三種不同的攻擊類型,進行一個模擬的50 XSS向量每4個瀏覽器:Chrome的v40.0.2214.115(64位),火狐v35.0.1,Safari瀏覽器v8.0.2(10600.2.5)和Opera v27.0.1689.69在OS X約塞米蒂10.10。
預防XSS攻擊的相關工作
另一些人提出的機制,以防止XSS攻擊。 Noxes,一個客戶方的工具充當網頁代理,禁止不屬於的網站,從而挫敗存儲XSS攻擊的請求。瀏覽器強制嵌入策略(警示聲)讓網頁應用程序開發者通過指定的腳本允許運行嵌入到網站的政策。伴有蜂鳴聲,開發人員可以把真正的來源腳本放在白名單和禁用某些網站的區域來源腳本。文檔結構完整性(DSI)是一個客戶端 - 服務器架構,限制了不受信任的內容解釋。 DSI使用的解析器可以隔離內嵌和不可信數據和分離靜態內容動態內容。然而,這種方法既需要服務器和客戶端以協同升級以啟用保護。BEEPs是一個在瀏覽器上的強制性策略,主要是讓網頁發展者能夠藉由指定哪個碼本能被執行將執行策略加入於網頁當中。用了BEEP之後,發展者可以把正常的原始碼本放置於一份白清單之中,並且取消在有些網域當中的碼本執行。Blueprint是一個伺服器端的應用程式編碼的內容轉換為客戶端的部分可以處理表示模型。然而,應用藍圖WordPress的平均增加了55%的處理時間;它應用到MediaWiki增加處理時間平均35.6%。
游家牧
英文
指導單位國家科學及技術委員會
執行單位財團法人國家實驗研究院科技政策研究與資訊中心
地  址(10636)台北市和平東路二段106號1, 14~15樓
© 財團法人國家實驗研究院科技政策研究與資訊中心 2023 All Rights Reserved.