2024 年 6 月 25 日,Sansec 安全研究和惡意軟體團隊宣布,一個流行的JavaScript polyfill 專案已被一家被認定為中國公司的外國參與者接管,該專案將惡意程式碼嵌入從其CDN 來源取得的JavaScript 資產中: cdn.polyfill.io 。 Sansec 聲稱超過 100,000 個網站因這次 Polyfill 攻擊而受到影響,其中包括 Intuit 等上市公司。

惡意 Polyfill 函式庫發生了什麼事?


Andrew Betts 是polyfill Web 服務的原始作者。該專案允許根據使用者代理或其他屬性將 JavaScript 填充庫自動注入到網站中。 Andrews 的聲明可以追溯到 2 月份,當時他們警告不要參與cdn.polyfill.io官方網站。

據我們所知,npm 上沒有特定的 polyfill 函式庫是該特定惡意行為者註入惡意程式碼活動的一部分。也就是說,跨不同軟體生態系統的函式庫(例如 Magento 專案等內容管理系統)可能包含引入來自cdn.polyfill.io的 JavaScript 程式碼的靜態腳本導入的程式碼。特別是,我們檢測到了 CVE-2024-38526,這是 PyPI 註冊表上pdoc庫的安全性報告,該註冊表為 Python 專案提供 API 文件。如果使用指令pdoc --math產生文件,則將包含來自polyfill.io JavaScript 文件的連結。 pdoc庫的這項行為已在pdoc版本14.5.1中修復,我們敦促用戶盡快升級。

什麼是 JavaScript 填色?


JavaScript Polyfill 通常是專門建置的一段程式碼,可在本機不支援它的舊瀏覽器上提供現代功能。從歷史上看,polyfill 對於旨在建立跨不同瀏覽器版本無縫執行的應用程式的 Web 開發人員至關重要。它們充當橋樑,使較舊的瀏覽器能夠執行較新的 JavaScript 功能,從而確保無論瀏覽器的年齡或功能如何,都能提供一致的使用者體驗。

在 Web 開發的早期,瀏覽器以不同的速度發展,導致環境分散,相同的程式碼可能無法在所有平台上統一運作。一般來說,對瀏覽器 API 的支援不會得到同等支援。由於無法控制最終使用者可用的瀏覽器版本,開發人員無法保證在瀏覽器中執行 JavaScript 程式碼時可用的 API 相同。因此,polyfills 透過引入 polyfill 程式庫來解決這個問題,讓開發人員編寫現代 JavaScript 程式碼,而不必擔心相容性問題。例如,像Array.prototype.includesPromise這樣的方法在 Internet Explorer 等舊版瀏覽器中不受支援。不過,開發人員可以透過瀏覽器中載入的 polyfill 程式庫來提供這些功能。

JavaScript CDN 在 polyfill 函式庫中的作用


內容交付網路 (CDN) 是一個由全球部署的分散式伺服器組成的系統,可根據使用者的地理位置向使用者交付 Web 內容。在 JavaScript 填充庫的背景下,CDN 透過在全球範圍內有效地託管和服務這些庫而發揮著至關重要的作用。透過利用 CDN,開發人員可以確保將其 Polyfill 快速可靠地交付給用戶,從而最大限度地減少延遲並縮短載入時間。使用 CDN 也有助於開發人員避免捆綁 JavaScript 程式庫。

您可能遇到的 CDN 的一般用例是使用基於雲端的指標和應用程式效能,例如 Google Analytics,它正式建議您將以下程式碼新增至您的網站:


{
 "vars" : {
 "gtag\_id": "<GA\_MEASUREMENT\_ID>",
 "config" : {
 "<GA\_MEASUREMENT\_ID>": { "groups": "default" }
 }
 }
}

在惡意 Polyfill 接手的情況下, cdn.polyfill.io是一個廣泛使用的 CDN,它會根據傳入請求的 HTTP 標頭動態提供 Polyfill。這意味著根據使用者的瀏覽器和版本提供適當的polyfill,確保最佳相容性。

CDN 上託管的 Polyfill 的安全風險


使用 CDN 上託管的 Polyfill 會帶來重大的安全風險,主要是因為在應用程式上下文中可能存在任意 JavaScript 程式碼執行的可能性。此風險通常被報告為給定 Web 應用程式的跨站點腳本 (XSS) 漏洞。

當從 CDN 取得 Polyfill 庫時,應用程式會依賴外部伺服器的完整性和安全性。正如 CDN 來源本身一樣。如果 CDN 或託管庫受到損害,如最近對cdn.polyfill.io的攻擊所示,新受到損害的程式碼可以在使用者的瀏覽器中註入並執行。此類惡意程式碼可以執行各種邪惡活動,例如將使用者重新導向到網路釣魚網站、竊取敏感資訊,甚至進一步傳播惡意軟體。就瀏覽器安全性而言,此類 XSS 漏洞是最嚴重的後果。

Snyk 如何偵測 CDN 上易受攻擊的 JavaScript 函式庫?


除了偵測專案清單和專案依賴項中的不安全程式碼和易受攻擊的第三方程式庫之外, Snyk VS Code 擴充功能還支援偵測使用靜態腳本匯入語句匯入的易受攻擊的程式庫。

例如,如果從 CDN 匯入的lodash庫使用易受攻擊的版本範圍或已知包含惡意程式碼,Snyk 將附加內聯註釋,以引起開發人員對安全風險的注意。

防範 CDN 供應鏈攻擊


最近對 JavaScript polyfill 專案的攻擊凸顯了支援整個 Web 生態系統資源的至關重要性,而 CDN 是其中的重要組成部分。供應鏈安全問題通常圍繞著 PyPI 和 npm 等開源套件註冊中心,但 JavaScript polyfill 攻擊提醒我們,CDN 也是一個令人難以置信的網路建構塊。

以下是您應該考慮的一些最佳實踐,以幫助防範此類攻擊:

  • 使用受信任的 CDN:僅使用來自信譽良好的提供者的 CDN。例如,Cloudflare 以其強大的安全措施和可靠性而聞名。

  • 監控依賴關係:定期審核和監控所有第三方腳本和依賴關係。

  • 子資源完整性:子資源完整性 (SRI) 等工具可以幫助確保 CDN 交付的內容不被篡改,並且可以固定到經過審核且已知不存在惡意或其他不良行為的預期版本/雜湊。

  • 內容安全策略 (CSP):實作強大的 CSP 以限制可以載入腳本的來源。這可以防止惡意腳本被執行。由於 Polyfill 通常包含在應用程式載入的關鍵路徑中,因此它們以與頁面上任何其他 JavaScript 相同的權限執行,這使得它們成為旨在利用這種信任的攻擊者的主要目標。這種風險凸顯了使用安全且信譽良好的 CDN、實施內容安全策略 (CSP) 等強大的安全措施以及定期審核第三方依賴項以防範此類漏洞的重要性。

  • 定期更新:使所有庫和依賴項保持最新。許多攻擊利用了已在後續版本中修補的已知漏洞。

  • 替代解決方案:評估您的專案是否仍需要 Polyfill。隨著瀏覽器的現代化,polyfill 提供的許多功能現在都得到了原生支援。高度考慮使用您自己的專案資產來供應依賴項,而不是依賴 CDN 等第三方提供者。


原文出處:https://dev.to/snyk/polyfill-supply-chain-attack-embeds-malware-in-javascript-cdn-assets-55d6


共有 0 則留言