Go 如何應對供應鏈攻擊?
Go 官方博客介紹了他們應對供應鏈攻擊的緩解措施。據稱,Go 的工具鏈和設計在各個階段均包含降低攻擊風險的考慮。
所有構建都被“鎖定 (locked)”
外部變化(例如發布依賴項的新版本)不會影響 Go 構建。
與其他大多數軟件包管理器所使用的配置文件不同,Go modules 沒有單獨的約束列表和用于鎖定特定版本的 lock 文件。參與 Go 構建的每個依賴項的版本完全由主模塊的go.mod文件決定。
從 Go 1.16 開始,上述操作默認執行,如果go.mod不完整,構建命令將失敗。唯一會改變go.mod的命令是 go get和 go mod tidy。這些命令通常不會自動運行或在 CI 中運行,因此這種對依賴關系樹的改變通常都是刻意為之,可在代碼審查階段被發現。
這對于安全性非常重要,如果一個模塊被入侵并發布了一個新的惡意版本,那么在明確更新該依賴項之前,任何人都不會受到影響,從而為生態提供了審查更改和檢測事件的時間。
版本內容永不改變
確保第三方不會影響構建的另一個關鍵屬性是,module 版本的內容不可改變。因為如果破壞依賴項的攻擊者可以重新上傳現有版本,他們就可以自動破壞所有依賴該依賴項的項目。
這正是go.sum文件的用途。它包含有助于構建的每個依賴項的加密哈希列表。同樣,不完整的go.sum會導致錯誤,并且只能使用go get和go mod tidy對它進行修改。因此,對它的任何修改都會伴隨著主觀的依賴關系改變。
VCS 是事實來源
大多數項目在開發過程中都會使用版本控制系統 (VCS),在其他生態中,這些項目還需要上傳到中心軟件包倉庫 (比如 npm)。這意味著有兩個帳戶可能會受到破壞,即 VCS 主機和中心軟件包倉庫。后者使用得更少,也更容易被忽視。這也意味著更容易在上傳到倉庫的版本中隱藏惡意代碼,特別是如果源碼作為上傳的一部分被例行修改。
Go 沒有諸如中心軟件包倉庫帳戶這類東西。包的導入路徑嵌入了直接從 VCSgo mod download 獲取其模塊所需的信息,其中 VSC 上的標簽定義了 module 版本。
僅構建代碼,但不執行
Go 工具鏈有一個明確的安全設計目標:無論是獲取還是構建代碼,都不會讓該代碼執行,無論代碼是否不受信任或者惡意。
這是一種有意義的風險緩解措施,假如你正在執行一個二進制文件或測試一個只使用一個子集的包模塊的依賴。例如,如果example.com/cmd/devtoolx在 macOS 上構建和執行,那么針對 Windows 的依賴或example.com/cmd/othertool的依賴就不可能危害到你的機器。
在 Go 中,不為特定構建提供代碼的 module 對于構建沒有安全影響。
“復制勝于依賴”
最后一項(也可能是最重要)供應鏈攻擊風險緩解措施也是技術含量最低的:Go 有拒絕大型依賴樹的文化,并且更喜歡復制而不是添加新的依賴。
這可以追溯到 Go 的一句諺語:“a little copying is better than a little dependency”(復制勝于依賴)。
Go module 對自己的“零依賴”標簽非常自豪。如果開發者需要使用一個庫,他會發現這個庫不會讓他依賴其他作者和所有者的幾十個 module。
這意味著只需少量依賴項就可以構建豐富、復雜的應用程序。畢竟無論工具多好,它都無法消除重用代碼所涉及的風險,因此最強的緩解措施始終是只有一個小的依賴樹。
本文轉自OSCHINA
本文標題:Go 如何應對供應鏈攻擊?
本文地址:https://www.oschina.net/news/189878/golang-supply-chain