Google如何利用內容安全策略緩解Web漏洞
跨站指令碼攻擊(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/