Content Security Policy(CSP)主要是為網頁的內容安全把關,他是設置在response header的位置,主要是用來限制網頁會讀取的外部檔案來防止XSSclickjacking和其他跨站攻擊。

  因為網站本身也可能需要讀取跨站的檔案,所以可以自行設置CSP header,通常會設置 ‘default-src’’style-src’’img-src ’’font-src’’connect-src’’frame-src ’’child-src ’’foobar-src ’’report-uri’ 等,再根據網站的需求(像是網站特效、字體、讀取送出資料),來選擇允許那些url設定'unsafe-inline''unsafe-eval''self'

  'unsafe-inline'代表允許使用inline scriptinline styles'unsafe-eval'代表允許在script裡使用eval功能,'self'代表只參考相同scheme以及相同portorigin網站。

  CSP bypass就是利用CSP header鑽漏洞試圖繞過限制,需要先搭配一個注入點,再繞過不安全的CSP header

  舉個例子的話,一種是繞過不安全的domain,假如為了將CDN上的檔案放在網站上,可能會設定成’script-src https://cdnjs.cloudflare.com’,那麼就可以利用cdnjs + AngularJS CSP bypass,讀取同樣在這個domainprototype.jsAngularJS來執行XSS等攻擊。因為雖然我們進行了限制,但是在CDN上有太多其他的script存在。

  因此CSP header該如何設置便是一個問題,即使有設定了,假如範圍過大就沒有防護力,假如範圍過小會影響網站本身運作,因此如何自行確認CSP header設置有沒有問題就十分重要。


如何發現

  如果想要自行進行檢測可以簡單的利用這個網站來檢測,這是google提供的網站

  https://csp-evaluator.withgoogle.com/

  以這個網站本身提供的unsafe policy為例,可以看到那些有危險。


  而值得注意的是有警示的部分也有列出原因,像是這個例子是 https://www.google.com會被JSONP 繞過


  而另一種方式透過弱掃通常也都會注意CSP的部分,掃出來的項目名稱通常寫成以下:



緩解方式

  CSP bypass是指被繞過讀取其他的script,而我們可以改善方式第一種解法是使用nonce,第二種解法是使用hash

  使用nonce,需要每次有新的request就產生一組新的亂數nonce值搭配inline scriptnonce值,來取代使用url路徑,但是每次request都需要產生nonce來處理,假如使用同一個或是有規律的nonce,一樣會被攻擊者拿來使用。

  使用hash,將script經過hash來使用來避免內容被竄改或被取代,但是這種方式每次要修改網頁script都需要確實產生新的hash並更新CSP header

  想了解更多產品資訊,請連至官網https://www.neithnet.com/zh/,或直接與NEITHNET資安專家聯繫:info@neithnet.com


參考資料

https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP

https://blog.huli.tw/2022/09/01/angularjs-csp-bypass-cdnjs/

https://csp-evaluator.withgoogle.com/