LavaMoat 與 Ledger 軟體供應鏈攻擊

了解 LavaMoat 如何在軟體開發週期中提供三重防護,以及如何立即保護您的應用程式免受攻擊。

6 分鐘閱讀
LavaMoat 與 Ledger 軟體供應鏈攻擊

發生了什麼事?

12 月 14 日,Ledger 的一個軟體函式庫 Ledger Connect Kit 遭受了軟體供應鏈攻擊。

此次入侵事件據稱起因於一名前員工——其仍保有發布權限——成為網路釣魚攻擊的受害者,導致其 npm 憑證遭到竊取。npm(即 Node Package Manager)是一種用於匯入開源軟體函式庫的工具,在網頁開發產業及 Web3 領域中被廣泛使用。

這次攻擊使得惡意版本的函式庫得以被發布。該函式庫透過內容傳遞網路(CDN)以即時更新的方式被納入以太坊生態系中的許多網頁應用程式,導致惡意程式碼被注入這些應用程式中。

我們如何防範?LavaMoat。

LavaMoat 是一套專門為協助解決網頁應用程式開發者所面臨的軟體供應鏈安全問題而打造的工具組。

LavaMoat 在軟體開發生命週期的三個不同節點提供防護,以抵禦供應鏈攻擊:在安裝相依套件時(匯入所有函式庫的階段)、在建置時(應用程式準備透過網際網路提供服務的階段),以及在執行時期(已建置的應用程式正在運行的階段)。

LavaMoat 的執行時期防護獨樹一幟。其他工具也可在開發過程中使用,例如 snyk.io(僅提供已知漏洞的警告),或 socket.dev(提供更全面的程式碼分析,且無需等待專家將發現回報至中央資料庫)。這些掃描工具扮演著不可或缺的角色,我們建議您使用 socket.dev 的 GitHub 整合功能。

然而,這些工具無法提供任何執行時期的保障。 因此,我們認為單獨使用它們是不夠的。

LavaMoat 的安全防護源自於僅將指定的能力委派給應用程式的相依套件。

這是什麼意思?請繼續閱讀,並參考我們的 Devcon 6 演講,深入了解 LavaMoat 的運作方式及其應用。

物件能力模型入門

您可以將一個系統想像成擁有能力:它能做的事情,例如顯示資訊、讀取本地儲存的資料,或向其他系統發出請求(如向伺服器發出網路請求,或向錢包發出交易請求),以及將這些能力委派給他人的能力。

在委派能力時,您可以提供該能力的受限版本。這稱為衰減(attenuation)

這三個要素構成了物件能力安全模型的基礎。透過此模型,您可以清楚了解誰有能力做什麼。

網頁應用程式安全性

瀏覽器在沙盒化應用程式方面做得相當不錯,也就是將應用程式相互隔離,防止它們干擾您的電腦或其他網站。

然而,瀏覽器並未為網頁應用程式開發者提供強健的基礎建構模組,以進一步沙盒化應用程式的特定部分,從而防止某些元件危及整個應用程式。

因此,當您將一個函式庫匯入應用程式時,實際上等同於將所有能力委派給該函式庫。更複雜的是,大多數 JavaScript 函式庫不僅帶入自身的程式碼,還會引入由各方作者編寫的一系列函式庫。

Ledger 攻擊的具體細節

@ledger/connect-kit-loader 函式庫是 Ledger 官方推薦的產品整合方式。這個套件是一個輕量包裝器,會從 CDN 載入其函式庫的最新版本。

雖然這意味著您的應用程式始終能使用最新版本的函式庫,但這也意味著__您實際上是將網頁應用程式的控制權委派給了 Ledger loader 函式庫,而該函式庫又將控制權委派給了 CDN 上託管的程式碼。__

您可以這樣描述這條委派鏈:

Web App → **@ledger/connect-kit-loader** → jsDelivr CDN → npm → Ledger → Ledger 前員工 → 攻擊者

即便如此,這仍是一種簡化。若放大檢視其中一個環節,例如 jsDeliver CDN,便會發現令人眼花繚亂的複雜附加服務,這些服務同樣是供應鏈的一部分,也是發動攻擊的潛在立足點。

以物件能力安全性保護應用程式

如前所述,雖然瀏覽器本身並未提供太多工具來限制應用程式子元件的能力,但 JavaScript 語言實際上非常適合這項任務。

JavaScript 在謹慎處理下,允許您建立「隔間(Compartments)」,以限制程式碼可存取的內容。請參閱 Agoric 的 Hardened Javascript 專案,了解隔間的實作方式。

MetaMask 的 LavaMoat 供應鏈安全系統與 MetaMask Snaps 外掛系統均以隔間為基礎,以實現程式碼封閉性。

LavaMoat 能否防止 Ledger 供應鏈攻擊?

問 LavaMoat 是否能防止這次攻擊,有點像是問桌鋸的觸碰停止功能,在您抓著鋸子跳下懸崖時是否有用——是的,跳下去之後您的手指很可能仍然完好無缺。

從原則上來說,@ledgerhq/connect-kit-loader 的運作方式迫使應用程式開發者放棄許多既有的安全最佳實踐。但並非毫無希望。

讓 LavaMoat(及其他供應鏈安全工具)發揮最大效用的最佳方式,是直接使用 @ledgerhq/connect-kit,而不是將所有控制權交給 loader。

LavaMoat 的設計初衷是緩解類似 Copay 錢包駭客事件(又稱「event-stream 事件」)的攻擊,並能有效防護此類攻擊。那麼,LavaMoat 面對這次不同性質的攻擊表現如何?

答案很遺憾,仍是那句老話:「視情況而定」。由於 LavaMoat 整合於應用程式執行時期的方式,它是一款面向應用程式開發者而非函式庫開發者的工具。這意味著,雖然部分網頁應用程式可以透過 LavaMoat 保護自身,但未使用 LavaMoat 的應用程式仍然存在漏洞。

此外,LavaMoat 僅執行開發者所指定的政策。若您設定了不安全的政策,LavaMoat 將無法保護您。

讓我們來看看,使用了 LavaMoat 的應用程式如何能從這次攻擊中得到保護。

LavaMoat 使用政策檔案來決定相依套件應獲得哪些能力(以全域平台 API 的形式)。為了簡化這個過程,您可以讓 LavaMoat 分析一個套件,並自動判斷該套件運行所需的內容。這稱為靜態分析(static analysis)

雖然靜態分析在理解程式碼意圖方面並不完美,但 LavaMoat 僅將靜態分析用於便利性目的,以協助您生成政策檔案,而不會在執行時期以靜態分析來執行政策。生成的政策隨後由開發者審查、調整並核准。

針對最初的問題,其中一個答案是:是的,LavaMoat 可以保護您的應用程式及使用者免受供應鏈攻擊,方法是防止套件在執行時期載入新程式碼。若您已正確設定,並使用了不要求過度強大能力的相依套件,它便能保護您。

另一個答案是:不能。若您將 LavaMoat 設定為允許 **@ledgerhq/connect-kit-loader** 正常運作,並允許其注入 script 標籤以在 LavaMoat 執行時期之外執行任意程式碼,則此次攻擊仍然會成功。 這是 LavaMoat 在向下相容性與更安全系統之間所做的取捨。LavaMoat 具有高度靈活性,以實現最大相容性,讓您無需從頭重寫應用程式即可導入。應用程式開發者仍有責任設定合理的政策並選擇合理的相依套件。LavaMoat 允許您選擇性地提供全域瀏覽器 API,但某些全域 API 所包含的權限過於強大,無法安全地授予第三方套件。我們正在研究幾種進一步限制這些權限的方法,但要讓工具對那些不努力限制自身控制權的套件也能直接適用,是一項艱鉅的挑戰。

LavaMoat 的其中一項功能稱為 Scuttling,它會干擾由 @ledgerhq/connect-kit-loader 載入的惡意套件及原始套件。Scuttling 會移除在 LavaMoat 沙盒外執行的程式碼對能力的存取權。這將從一開始就阻止您使用不安全的 @ledgerhq/connect-kit-loader,並推動您直接使用並自行掌控 @ledgerhq/connect-kit 的更新流程,確保您對應用程式中執行的程式碼保有完全控制權。

LavaMoat 雖非萬靈丹,但它在您原本毫無掌控力的地方賦予您控制權與可見度。LavaMoat 應只是您安全策略中的工具之一。

以下是您現在就能採取的行動,以防禦明日可能發生的攻擊:

AI 翻譯。可能包含錯誤。請務必核實資訊。

評價此翻譯