跨站腳本攻擊(Cross Site Script,簡稱CSS),通常又被稱為XSS,是當今網絡上最常見的漏洞類型之一。
通過XSS漏洞,惡意攻擊者可以在未經授權的情況下往Web頁面里插入惡意html代碼,當用戶瀏覽該頁面時,嵌入Web里面的html代碼會被執行,從而達到惡意用戶的特殊目的,如竊取各類用戶賬號(網銀賬號、設備登錄賬號等),讀取、篡改、添加和刪除企業敏感數據,非法轉賬以及網絡掛馬等等。
根據谷歌工程師Lukas Weichselbaum和Michele Spagnuolo的說法,XSS對于谷歌公司而言,同樣是一個亟待解決的大問題,這也解釋了為什么谷歌公司會通過使用一種稱為 “內容安全策略”(CSP)的技術方法,來實現降低XSS風險的目的。
2019年4月17日,這兩名谷歌工程師在夏威夷考艾島舉行的LocoMocoSec會議上詳細介紹了谷歌 “內容安全策略”(CSP)的工作機制及成果。
LocoMocoSec會議創始人Jeremiah Grossman在其Twitter消息中激動地寫道,谷歌公司花了12-18個月的時間來重構他們的JavaScript,以支持內容安全策略在其大約3/4的 properties配置文件中運行。現在,他們已經創建了新的開發框架,可以使用開發人員不可見的CSP自動生成代碼。
事實上,內容安全策略并不是一個新出現的概念,因為至少從2010年開始,開發人員和瀏覽器供應商(包括Mozilla)就已經開始利用各種形式來實施CSP。在最基本的形式中,內容安全策略(CSP)可以作為一種“聲明機制”,允許Web或應用程序開發人員在其應用程序上指定多個安全限制,由支持的用戶代理(瀏覽器)來負責強制執行,以防止未經授權的注入腳本的運行。簡單來說,CSP旨在 “作為開發人員可以使用的工具,以各種方式保護其應用程序,減輕內容注入漏洞的風險和減少它們的應用程序執行的特權”。
目前,谷歌公司正在其擁有的80多個域名和160多項服務中實施CSP,這一數據約占所有輸出谷歌流量的62%。根據兩位谷歌開發者的說法,僅2018年,就有超過60%的XSS嘗試被谷歌的內容安全策略攔截阻斷。
采取Nonce-Based的CSP方法
在多年部署CSP的過程中,谷歌發現并非所有方法都能夠切實有效地防護XSS攻擊。就拿基于白名單的CSP模型來說,雖然它明確列出了哪些域可以注入腳本,但是根據谷歌的研究結果發現,約95%的基于白名單的CSP都是可以被成功繞過的。因此可以說,部署傳統的基于白名單的CSP模型,對于防止XSS是不可行的。
Weichselbaum和Spagnuolo所倡導的是一種nonce-based的CSP模型。在nonce中,應用程序定義并生成了單一的,不可猜測的令牌(nonce),這個令牌會同時傳遞給CSP策略和作為一個合法HTML屬性傳遞給script。 用戶代理僅允許執行那些nonce值能夠匹配策略中指定的值的腳本。雖然攻擊者可以將標記注入易受攻擊的頁面,但是由于不知道nonce的臨時值,因此他并不能執行惡意腳本。
除了使用nonce-based方法之外,谷歌還在利用CSP中的新功能。CSP3是CSP的最新版本,并引入了幾個可用于進一步降低XSS風險的附加屬性。其中,script-src-elem標記適用于所有腳本請求和內聯腳本塊,為更精細的控制提供了一種新機制。
CSP的報告功能
為了獲得對已實施規則的有效反饋信息,CSP 的報告功能不可或缺。通過CSP模型中提供的一種集成報告功能,組織可以有效地了解某些內容遭到阻止的原因。
例如,將 “report-sample” 標記添加到script-src指令中,CSP模型就會為相應組織提供一份報告,其中內聯腳本違規還將提供被阻止數據類型的樣本,以允許組織識別哪個腳本被阻止了。
為了幫助組織更好地利用和理解CSP,谷歌還創建了許多有關CSP利用的小工具和指南:
CSP Evaluator
這是一個能夠評估你當前輸入的CSP能否幫助你有效避免XSS攻擊的工具,其用法非常簡單,在輸入框中輸入你當前設置或將要設置的CSP值,選擇需要驗證的CSP版本,然后按下 “CHECK CSP” 即可。
CSP Guide
谷歌編寫的一份有關CSP運用的指南。
雖然CSP可以成為降低XSS風險的有效工具,但它應該只是作為組織更大安全性工作的一部分來使用,以實現提高代碼質量和整體安全性的目標。
最后,兩位谷歌研究者強調稱,CSP是一種縱深防御機制,這就意味著它是在主要安全機制(例如轉義)失效時來保護用戶的,它并不是沒能解決潛在漏洞的借口。
CSP Evaluator地址:
https://csp-evaluator.withgoogle.com/
CSP 運用指南地址: