Mozilla表示,Firefox不僅描繪網路上的網頁,也附帶許多內建的頁面,通常稱為about:pages。由於about:pages也可能遭受程式碼注入攻擊。於是,Mozilla重新編寫Firefox所有的行內事件處理器,並將其中的JavaScript程式碼移到45種about: pages的打包檔案中,以部署內容安全政策,確保被注入的JavaScript無法執行。

Mozilla安全團隊於本周揭露,他們已藉由移除Firefox程式碼中的行內腳本(inline scripts)與eval()及類似的各種函數,以防範程式碼注射攻擊。

所謂的行內腳本,是指被嵌入在HTML文件中,而非自外部檔案載入的腳本程式。Mozilla內容安全技術負責人Christoph Kerschbaumer解釋,Firefox不僅描繪網路上的網頁,也附帶許多內建的頁面,通常稱為about:pages,這類的頁面可用來揭露瀏覽器的內部狀態,最明顯的about:config提供了一個API,可用來檢查與更新設定及偏好,讓Firefox用戶得以根據特定需求來打造Firefox實例。

由於about:pages也是透過HTML及JavaScript來實現,因此它們與一般的網頁有著同樣的安全模型,也無法免疫於程式碼注入攻擊。假設駭客能夠把程式碼注入about:pages中,駭客也許也能執行所注入的程式碼,意謂著駭客將可代表使用者執行任何行動。

於是,Mozilla重新編寫Firefox所有的行內事件處理器,並將所有的行內JavaScript程式碼移到45種about: pages的打包檔案中,以讓Mozilla能夠部署強大的內容安全政策,確保被注入的JavaScript無法執行。

如此一來,JavaScript程式碼只能在透過內部的chrome: protocol時,自打包的資源中載入才能執行。封鎖了about: pages中任何的行內腳本,等於限制了執行任意程式碼的攻擊表面,也替對抗程式碼注入攻擊提供了第一道防線。

至於JavaScript函數eval(),或是其它類似的new Function、setTimeout()/setInterval()也都是既強大又危險的函數,它能夠在與函數一致的安全脈絡下,解析與執行任意字串,它允許執行程式碼在運行時產生,或是存放在諸如DOM的非腳本區域,然而,eval()帶來了重要的程式碼注入攻擊表面,促使Mozilla決定禁用它。

因此Mozilla改寫了系統特權脈絡及Firefox程式庫的父程序中,所有使用eval()或其它類似函數的段落,並加入了斷言,以禁止在系統權限的腳本脈絡中,使用相關函數。

目前Mozilla仍會在極少數、自程式庫之外調用eval()的狀態下放行該函數,但未來將繼續密切觀察與審核未知的eval() 實例,以強化Firefox的安全性。


Advertisement

更多 iThome相關內容