新聞中心
無論采用何種過程或技術(shù)手段,每個(gè)依賴性都必然存在著相互信任的關(guān)系。但是,Go 的工具和設(shè)計(jì)幫助降低了所有階段的風(fēng)險(xiǎn)。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了瓊海免費(fèi)建站歡迎大家使用!
所有構(gòu)建都已“鎖定”
外部世界的變化,例如發(fā)布依賴性的新版本,并不會(huì)影響 Go 的構(gòu)建。
與大多數(shù)軟件包管理器文件不同,Go 模塊沒有單獨(dú)的約束列表和鎖文件,但是它鎖定了某個(gè)特定的版本。任何 Go 構(gòu)建的每個(gè)依賴性的版本完全取決于主模塊的 go.mod 文件。
從 Go 1.16 開始,這種決定論就會(huì)強(qiáng)制執(zhí)行,并且在 go.mod 不完整的情況下,構(gòu)建命令(gobuild、gotest、goinstall、gorun……)將會(huì)失敗。唯一會(huì)改變 go.mod(因此也會(huì)改變構(gòu)建)的命令是 goget 和 gomodtidy。這些命令不會(huì)被自動(dòng)或在 CI 中運(yùn)行,所以對依賴樹的改變必須是故意的,并且有機(jī)會(huì)通過代碼審查。
這對安全非常重要,因?yàn)楫?dāng) CI 系統(tǒng)或新機(jī)器運(yùn)行時(shí),簽入 (checked-in) 的源碼是最終的和完整的,代碼將說明什么會(huì)被構(gòu)建,第三方?jīng)]有辦法影響它。
此外,當(dāng)用 goget 添加依賴性時(shí),由于最小版本的選擇,它的交叉依賴會(huì)按照依賴的 go.mod 文件中指定的版本添加,而不是按照最新版本。同樣的情況也發(fā)生在調(diào)用 goinstallexample.com/cmd/devtoolx@latest 的情況下,在某些生態(tài)系統(tǒng)中,它的等價(jià)物會(huì)繞過 pinning。在 Go 中,example.com/cmd/devtoolx 的最新版本將被獲取,但所有的依賴性將由其 go.mod 文件設(shè)置。
如果一個(gè)模塊被破壞,新的惡意版本被發(fā)布,在它們明確更新該依賴性之前,不會(huì)受到任何影響,這就提供了審查更改的機(jī)會(huì),并讓生態(tài)系統(tǒng)有了足夠的時(shí)間來檢測事件。
版本內(nèi)容永遠(yuǎn)不會(huì)改變
確保第三方不能影響構(gòu)建的另一個(gè)關(guān)鍵屬性是,模塊版本的內(nèi)容是不可改變的。如果攻擊者破壞了依賴性,可以重新上傳現(xiàn)有的版本,他們就可以自動(dòng)破壞所有依賴它的項(xiàng)目。
這就是 go.sum 文件的作用。它包含構(gòu)建所需的每個(gè)依賴項(xiàng)的加密哈希列表。同樣,一個(gè)不完整的 go.sum 會(huì)導(dǎo)致錯(cuò)誤,而且只有 goget 和 gomod tidy 才會(huì)修改它,所以任何對它的修改都會(huì)伴隨著故意的依賴性改變。其他的構(gòu)建被保證有一套完整的校驗(yàn)和。
這是大多數(shù)鎖文件的一個(gè)共同特征。Go 通過 Checksum Database(簡稱 sumdb)超越了它,它是一個(gè)全局性的、僅可附加的加密驗(yàn)證的 go.sum 條目列表。當(dāng) goget 需要在 go.sum 文件中添加一個(gè)條目時(shí),它從 sumdb 中獲取該條目,并對 sumdb 的完整性進(jìn)行加密證明。這不僅確保了某一模塊的每一次構(gòu)建都使用相同的依賴內(nèi)容,而且確保了每一個(gè)模塊都使用相同的依賴內(nèi)容。
sumdb 使得被破壞的依賴內(nèi)容,甚至谷歌運(yùn)營的 Go 基礎(chǔ)設(shè)施不可能用修改過的(例如 backdoored)源代碼來針對特定的依賴內(nèi)容。保證你使用的代碼與其他使用例如 example.com/modulex 的 v1.9.2 的人所使用的代碼完全一樣,并且已通過審查。
最后,我最喜歡 sumdb 的特性是:它不需要模塊作者的任何密鑰管理,并且可以無縫地與 Go 模塊的去中心化特性配合使用。
VCS 是真理的源泉
大多數(shù)項(xiàng)目是通過某種版本控制系統(tǒng)(VCS)開發(fā)的,然后在其他生態(tài)系統(tǒng)中,上傳到包存儲(chǔ)庫。這意味著有兩個(gè)賬戶可能被入侵,即 VCS 主機(jī)和包存儲(chǔ)庫,后者使用得更少,更容易被忽視。這也意味著在上傳到存儲(chǔ)庫的版本中更容易隱藏惡意代碼,尤其是在上傳過程中經(jīng)常修改源代碼的情況下,比如說將其最小化。
在 Go 中,不存在包存儲(chǔ)庫賬戶這樣的東西。包的導(dǎo)入路徑嵌入了 gomoddownload 所需要的信息,以便直接從 VCS 中獲取其模塊,其中標(biāo)簽定義了版本。
我們確實(shí)有 Go Module Mirror,但那只是一個(gè)代理。模塊作者不需要注冊賬戶,也不需要向代理上傳版本。代理使用與 go 工具相同的邏輯(事實(shí)上,代理運(yùn)行 gomoddownload)來獲取和緩存版本。由于校驗(yàn)數(shù)據(jù)庫保證給定的模塊版本只能有一個(gè)源樹,每個(gè)使用代理的人都會(huì)看到與繞過代理直接從 VCS 獲取的結(jié)果相同。(如果該版本在 VCS 中不再可用,或者其內(nèi)容發(fā)生了變化,直接獲取將導(dǎo)致錯(cuò)誤,而從代理獲取可能仍然有效,提高了可用性并保護(hù)生態(tài)系統(tǒng)免受 “左鍵”問題的影響)。
在客戶端運(yùn)行 VCS 工具會(huì)暴露出一個(gè)相當(dāng)大的攻擊面。這也是 Go Module Mirror 的另一個(gè)作用:代理上的 Go 工具在一個(gè)強(qiáng)大的沙盒內(nèi)運(yùn)行,并被配置為支持所有的 VCS 工具,而默認(rèn)的是只支持兩個(gè)主要的 VCS 系統(tǒng)(git 和 Mercurial)。任何使用代理的人仍然可以獲取使用非默認(rèn)的 VCS 系統(tǒng)發(fā)布的代碼,但攻擊者在大多數(shù)安裝中無法接觸到這些代碼。
僅構(gòu)建代碼,但不會(huì)執(zhí)行它
Go 工具鏈的一個(gè)清晰的安全設(shè)計(jì)目標(biāo)是,即使代碼是不可信和惡意的,也不能獲取或構(gòu)建代碼來執(zhí)行該代碼。這與大多數(shù)生態(tài)系統(tǒng)不同,其中許多生態(tài)系統(tǒng)對在獲取包時(shí)運(yùn)行代碼提供了一流的支持。這些“安裝后”的鉤子在在過去被用作一種最方便的攻擊方式:通過受到攻擊的依賴攻擊開發(fā)者的機(jī)器,并通過 module 作者進(jìn)行蠕蟲攻擊。
公平地說,如果你要獲取一些代碼,往往會(huì)在不久之后執(zhí)行,要么作為開發(fā)者機(jī)器上測試的一部分,要么作為生產(chǎn)中二進(jìn)制文件的一部分,所以缺乏安裝后鉤子只會(huì)減緩攻擊者。(在構(gòu)建過程中沒有安全邊界:任何有助于構(gòu)建的軟件包都可以定義一個(gè)初始函數(shù))。然而,這也是一種有意義的風(fēng)險(xiǎn)緩解,因?yàn)槟憧赡茉趫?zhí)行一個(gè)二進(jìn)制文件或測試一個(gè)包時(shí),只使用了模塊依賴的一個(gè)子集。例如,如果你在 macOS 上構(gòu)建并執(zhí)行 example.com/cmd/devtoolx,那么只有 Windows 的依賴或 example.com/cmd/othertool 的依賴就不可能危害到你的機(jī)器。
在 Go 中,不為特定構(gòu)建提供代碼的模塊對其沒有安全影響。
“一點(diǎn)復(fù)制比一點(diǎn)依賴要好”
在 Go 生態(tài)系統(tǒng)中,最后一個(gè)也許也是最重要的軟件供應(yīng)鏈風(fēng)險(xiǎn)緩解措施是最沒有技術(shù)含量的一個(gè):Go 有一種拒絕大型依賴樹的文化,寧愿復(fù)制一下也不愿意添加新的依賴。這可以追溯到 Go 的一個(gè)諺語:“一點(diǎn)復(fù)制比一點(diǎn)依賴要好”。高質(zhì)量的可重用 Go 模塊自豪地戴上了 “零依賴” 的標(biāo)簽。如果你發(fā)現(xiàn)自己需要一個(gè)庫,你很可能會(huì)發(fā)現(xiàn)它不會(huì)導(dǎo)致你依賴其他作者和所有者的幾十個(gè)模塊。
豐富的標(biāo)準(zhǔn)庫和其他模塊(golang.org/x/……的模塊)也支持這一點(diǎn),這些模塊提供了常用的高級(jí)構(gòu)建模塊,如 HTTP 棧、TLS 庫、JSON 編碼等。
所有這些意味著只需少量的依賴性就可以建立豐富、復(fù)雜的應(yīng)用程序。無論工具有多好,它都不能消除重復(fù)使用代碼的風(fēng)險(xiǎn),所以最有力的緩解措施永遠(yuǎn)是一個(gè)小的依賴樹。
分享名稱:Go 如何減少供應(yīng)鏈攻擊?
瀏覽路徑:http://www.dlmjj.cn/article/dphsess.html


咨詢
建站咨詢
