Go 如何應(yīng)對供應(yīng)鏈攻擊?

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

































