自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

安全 應(yīng)用安全
現(xiàn)代軟件工程是協(xié)作性的,并且基于對(duì)開(kāi)源軟件的重用。這就使目標(biāo)暴露在供應(yīng)鏈攻擊之下,而軟件項(xiàng)目則會(huì)因?yàn)槠湟蕾囆员黄茐亩獾焦簟?

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

所有構(gòu)建都已“鎖定”

外部世界的變化,例如發(fā)布依賴性的新版本,并不會(huì)影響 Go 的構(gòu)建。

與大多數(shù)軟件包管理器文件不同,Go 模塊沒(méi)有單獨(dú)的約束列表和鎖文件,但是它鎖定了某個(gè)特定的版本。任何 Go 構(gòu)建的每個(gè)依賴性的版本完全取決于主模塊的 go.mod 文件。

從 Go 1.16 開(kāi)始,這種決定論就會(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)行,所以對(duì)依賴樹(shù)的改變必須是故意的,并且有機(jī)會(huì)通過(guò)代碼審查。

這對(duì)安全非常重要,因?yàn)楫?dāng) CI 系統(tǒng)或新機(jī)器運(yùn)行時(shí),簽入 (checked-in) 的源碼是最終的和完整的,代碼將說(shuō)明什么會(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ì)繞過(guò) pinning。在 Go 中,example.com/cmd/devtoolx 的最新版本將被獲取,但所有的依賴性將由其 go.mod 文件設(shè)置。

如果一個(gè)模塊被破壞,新的惡意版本被發(fā)布,在它們明確更新該依賴性之前,不會(huì)受到任何影響,這就提供了審查更改的機(jī)會(huì),并讓生態(tài)系統(tǒng)有了足夠的時(shí)間來(lái)檢測(cè)事件。

版本內(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ì)修改它,所以任何對(duì)它的修改都會(huì)伴隨著故意的依賴性改變。其他的構(gòu)建被保證有一套完整的校驗(yàn)和。

這是大多數(shù)鎖文件的一個(gè)共同特征。Go 通過(guò) Checksum Database(簡(jiǎn)稱 sumdb)超越了它,它是一個(gè)全局性的、僅可附加的加密驗(yàn)證的 go.sum 條目列表。當(dāng) goget 需要在 go.sum 文件中添加一個(gè)條目時(shí),它從 sumdb 中獲取該條目,并對(duì) sumdb 的完整性進(jìn)行加密證明。這不僅確保了某一模塊的每一次構(gòu)建都使用相同的依賴內(nèi)容,而且確保了每一個(gè)模塊都使用相同的依賴內(nèi)容。

sumdb 使得被破壞的依賴內(nèi)容,甚至谷歌運(yùn)營(yíng)的 Go 基礎(chǔ)設(shè)施不可能用修改過(guò)的(例如 backdoored)源代碼來(lái)針對(duì)特定的依賴內(nèi)容。保證你使用的代碼與其他使用例如 example.com/modulex 的 v1.9.2 的人所使用的代碼完全一樣,并且已通過(guò)審查。

最后,我最喜歡 sumdb 的特性是:它不需要模塊作者的任何密鑰管理,并且可以無(wú)縫地與 Go 模塊的去中心化特性配合使用。

VCS 是真理的源泉

大多數(shù)項(xiàng)目是通過(guò)某種版本控制系統(tǒng)(VCS)開(kāi)發(fā)的,然后在其他生態(tài)系統(tǒng)中,上傳到包存儲(chǔ)庫(kù)。這意味著有兩個(gè)賬戶可能被入侵,即 VCS 主機(jī)和包存儲(chǔ)庫(kù),后者使用得更少,更容易被忽視。這也意味著在上傳到存儲(chǔ)庫(kù)的版本中更容易隱藏惡意代碼,尤其是在上傳過(guò)程中經(jīng)常修改源代碼的情況下,比如說(shuō)將其最小化。

在 Go 中,不存在包存儲(chǔ)庫(kù)賬戶這樣的東西。包的導(dǎo)入路徑嵌入了 gomoddownload 所需要的信息,以便直接從 VCS 中獲取其模塊,其中標(biāo)簽定義了版本。

我們確實(shí)有 Go Module Mirror,但那只是一個(gè)代理。模塊作者不需要注冊(cè)賬戶,也不需要向代理上傳版本。代理使用與 go 工具相同的邏輯(事實(shí)上,代理運(yùn)行 gomoddownload)來(lái)獲取和緩存版本。由于校驗(yàn)數(shù)據(jù)庫(kù)保證給定的模塊版本只能有一個(gè)源樹(shù),每個(gè)使用代理的人都會(huì)看到與繞過(guò)代理直接從 VCS 獲取的結(jié)果相同。(如果該版本在 VCS 中不再可用,或者其內(nèi)容發(fā)生了變化,直接獲取將導(dǎo)致錯(cuò)誤,而從代理獲取可能仍然有效,提高了可用性并保護(hù)生態(tài)系統(tǒng)免受 “左鍵”問(wèn)題的影響)。

在客戶端運(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ù)安裝中無(wú)法接觸到這些代碼。

僅構(gòu)建代碼,但不會(huì)執(zhí)行它

Go 工具鏈的一個(gè)清晰的安全設(shè)計(jì)目標(biāo)是,即使代碼是不可信和惡意的,也不能獲取或構(gòu)建代碼來(lái)執(zhí)行該代碼。這與大多數(shù)生態(tài)系統(tǒng)不同,其中許多生態(tài)系統(tǒng)對(duì)在獲取包時(shí)運(yùn)行代碼提供了一流的支持。這些“安裝后”的鉤子在在過(guò)去被用作一種最方便的攻擊方式:通過(guò)受到攻擊的依賴攻擊開(kāi)發(fā)者的機(jī)器,并通過(guò) module 作者進(jìn)行蠕蟲(chóng)攻擊。

公平地說(shuō),如果你要獲取一些代碼,往往會(huì)在不久之后執(zhí)行,要么作為開(kāi)發(fā)者機(jī)器上測(cè)試的一部分,要么作為生產(chǎn)中二進(jìn)制文件的一部分,所以缺乏安裝后鉤子只會(huì)減緩攻擊者。(在構(gòu)建過(guò)程中沒(méi)有安全邊界:任何有助于構(gòu)建的軟件包都可以定義一個(gè)初始函數(shù))。然而,這也是一種有意義的風(fēng)險(xiǎn)緩解,因?yàn)槟憧赡茉趫?zhí)行一個(gè)二進(jìn)制文件或測(cè)試一個(gè)包時(shí),只使用了模塊依賴的一個(gè)子集。例如,如果你在 macOS 上構(gòu)建并執(zhí)行 example.com/cmd/devtoolx,那么只有 Windows 的依賴或 example.com/cmd/othertool 的依賴就不可能危害到你的機(jī)器。

在 Go 中,不為特定構(gòu)建提供代碼的模塊對(duì)其沒(méi)有安全影響。

“一點(diǎn)復(fù)制比一點(diǎn)依賴要好”

在 Go 生態(tài)系統(tǒng)中,最后一個(gè)也許也是最重要的軟件供應(yīng)鏈風(fēng)險(xiǎn)緩解措施是最沒(méi)有技術(shù)含量的一個(gè):Go 有一種拒絕大型依賴樹(shù)的文化,寧愿復(fù)制一下也不愿意添加新的依賴。這可以追溯到 Go 的一個(gè)諺語(yǔ):“一點(diǎn)復(fù)制比一點(diǎn)依賴要好”。高質(zhì)量的可重用 Go 模塊自豪地戴上了 “零依賴” 的標(biāo)簽。如果你發(fā)現(xiàn)自己需要一個(gè)庫(kù),你很可能會(huì)發(fā)現(xiàn)它不會(huì)導(dǎo)致你依賴其他作者和所有者的幾十個(gè)模塊。

豐富的標(biāo)準(zhǔn)庫(kù)和其他模塊(golang.org/x/……的模塊)也支持這一點(diǎn),這些模塊提供了常用的高級(jí)構(gòu)建模塊,如 HTTP 棧、TLS 庫(kù)、JSON 編碼等。

所有這些意味著只需少量的依賴性就可以建立豐富、復(fù)雜的應(yīng)用程序。無(wú)論工具有多好,它都不能消除重復(fù)使用代碼的風(fēng)險(xiǎn),所以最有力的緩解措施永遠(yuǎn)是一個(gè)小的依賴樹(shù)。

責(zé)任編輯:華軒 來(lái)源: AI前線
相關(guān)推薦

2022-04-06 10:12:51

Go供應(yīng)鏈攻擊風(fēng)險(xiǎn)

2022-08-08 10:48:21

安全供應(yīng)鏈IT

2021-04-25 15:49:06

拜登黑客攻擊

2023-02-23 07:52:20

2022-02-21 10:12:20

供應(yīng)鏈攻擊網(wǎng)絡(luò)攻擊

2021-09-12 14:38:41

SolarWinds供應(yīng)鏈攻擊Autodesk

2020-06-01 08:45:17

GitHub代碼開(kāi)發(fā)者

2022-03-14 14:37:53

網(wǎng)絡(luò)攻擊供應(yīng)鏈攻擊漏洞

2021-09-16 14:59:18

供應(yīng)鏈攻擊漏洞網(wǎng)絡(luò)攻擊

2020-12-24 11:09:44

VMwareCiscoSolarWinds

2021-05-11 11:11:00

漏洞網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊

2022-10-26 10:55:35

2022-06-02 14:11:42

區(qū)塊鏈藥品供應(yīng)鏈數(shù)據(jù)

2022-11-14 10:32:56

供應(yīng)鏈技術(shù)

2023-01-11 00:05:58

2021-08-31 16:22:14

供應(yīng)鏈攻擊網(wǎng)絡(luò)攻擊零信任

2021-01-25 12:49:14

區(qū)塊鏈物流運(yùn)輸

2017-03-07 10:46:05

供應(yīng)鏈大數(shù)據(jù)堆疊

2024-03-26 11:01:10

人工智能機(jī)器學(xué)習(xí)

2022-02-21 13:32:02

區(qū)塊鏈供應(yīng)鏈技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)