本文來自嘶吼網(wǎng),作者/gejigeji。
最近,趨勢科技的研究人員分析了幾種可被濫用來攻擊供應(yīng)鏈的攻擊載體的概念證明,其中一種便是針對開發(fā)者的供應(yīng)鏈攻擊,該證明重點關(guān)注了本地集成開發(fā)環(huán)境(IDE),考慮當(dāng)項目或生成被錯誤地“信任”時,通過注入命令執(zhí)行惡意生成腳本的情況。
在本文中,我們將關(guān)注供應(yīng)鏈的一個特定部分——開發(fā)者本身。要找到針對開發(fā)者的合適攻擊模型,我們必須首先了解誰是開發(fā)者、他們的工作流程和日常工具。我們還將重點放在開發(fā)者和他們各自的工具如何被濫用來破壞供應(yīng)鏈。
誰是“開發(fā)者”?
按照字面理解,將開發(fā)者定義為開發(fā)計算機(jī)軟件的人。在安全研究人員的理解中,則是寫代碼的人。這包括流行的編程或腳本語言,如Java、JavaScript、TypeScript、Go、Python、C/c++和許多其他語言,包括基礎(chǔ)設(shè)施或容器部署定義,如Dockerfile、Kubernetes、Terraform HCL等。僅從這個描述來看,該定義就涵蓋了IT行業(yè)的各個部分,包括編寫代碼的每個人、安全研究人員等等。
盡管工作流本身可能因開發(fā)者和公司的不同而有所不同,但根據(jù)開發(fā)者如何使用集成開發(fā)者環(huán)境(IDE),它很可能屬于以下類別之一:
1.本地IDE:開發(fā)者在自己的設(shè)備上本地安裝了IDE。在這種情況下,開發(fā)者有兩個選擇:
1.1將代碼拉入或推送到遠(yuǎn)程存儲庫,并在本地執(zhí)行生成和調(diào)試;
1.2將更改提交到遠(yuǎn)程存儲庫,觸發(fā)持續(xù)集成/持續(xù)交付(CI/CD)事件,并導(dǎo)致質(zhì)量保證(QA)評估,甚至部署到生產(chǎn)環(huán)境中。
2.云IDE:開發(fā)者使用云服務(wù)托管的IDE,如AWS Cloud9、Visual Studio Online、GitHub代碼空間和許多其他當(dāng)今可用的平臺。在這種情況下,開發(fā)者設(shè)備就像網(wǎng)關(guān)一樣工作,通常通過瀏覽器訪問IDE,主要的代碼執(zhí)行是在云服務(wù)提供者內(nèi)部的云IDE的遠(yuǎn)程主機(jī)中執(zhí)行的。
由于開發(fā)者涵蓋多個職業(yè),一些工作流可能會從列表中排除一些項目。例如,本文的概念證明很可能不會建立一個完整的CI/CD管道。然而,大多數(shù)工作流將包括使用IDE進(jìn)行開發(fā)。在這篇文章中,我們將重點放在本地IDE上。
本地IDE的示例
當(dāng)使用本地IDE時,其中一個示例是開發(fā)者將代碼拉到本地計算機(jī)上。該代碼被進(jìn)一步編譯為二進(jìn)制格式,以便執(zhí)行。對以前的貢獻(xiàn)者編寫的代碼有一種隱含的信任,因為大多數(shù)開發(fā)者認(rèn)為代碼庫可能不會被污染,因為它可以按預(yù)期工作。這種信任不僅存在于源代碼本身中,還存在于生成腳本、庫、依賴項和其他項目文件中。這就引出了第一個攻擊場景:將惡意操作注入到項目文件或生成腳本中。
作為開發(fā)者,在執(zhí)行遠(yuǎn)程代碼之前,是否有必要在拉入遠(yuǎn)程代碼之后閱讀生成腳本?
研究人員通過向生成腳本或項目文件注入惡意生成命令(如果適用的話)來測試各種流行的IDE和編程語言。以下是測試的IDE版本的結(jié)果:
Eclipse 2022-09Apache NetBeans 16PyCharm 2022.2.4IntelliJ IDEA 2022.03Visual Studio 2022Visual Studio Code 1.73.1
當(dāng)我們考慮通用攻擊模型時,還必須包括每個非受控輸入。這包括源代碼及其文件,并包括生成前和生成后腳本和IDE擴(kuò)展(如果適用的話)。我們之前在2020年的一篇文章中寫過可能存在惡意IDE擴(kuò)展的危險。
IDE攻擊模型
我們?yōu)槊總€IDE定義了以下場景,以驗證可能的攻擊模型:
開發(fā)者在線從不受信任的存儲庫中拉入代碼;
開發(fā)者在IDE中打開一個項目;
開發(fā)者試圖編譯或生成項目;
使用Visual Studio代碼
從Visual Studio Code 1.57版(2021年5月發(fā)布)開始,代碼編輯器引入了Workspace Trust的概念。此功能通過防止代碼從不受信任的文件和存儲庫執(zhí)行,幫助開發(fā)者安全地瀏覽和編輯代碼,而不考慮源代碼或作者。這可能是由于當(dāng)時第三方擴(kuò)展漏洞的數(shù)量不斷增加,當(dāng)被濫用時,在打開不受信任的文件時,可能會允許遠(yuǎn)程代碼執(zhí)行(RCE)。這個概念很簡單:除非工作區(qū)是可信的,否則它不允許任何(生成/調(diào)試)任務(wù)或某些擴(kuò)展功能運(yùn)行。這就可以將責(zé)任轉(zhuǎn)移到開發(fā)者身上,并提示他們是否要信任下載的代碼。
這里要強(qiáng)調(diào)的是,不要盲目地信任每一個工作區(qū)。
Visual Studio代碼工作區(qū)信任對話框
開發(fā)者應(yīng)該尋找和考慮哪些代碼不應(yīng)該被信任的可疑跡象?在其他示例中,應(yīng)該引起開發(fā)者警惕的跡象包括:
較低的下載量;
論壇上共享的項目;
灰色區(qū)域;
一般未經(jīng)證實的來源;
未知的人;
在執(zhí)行IDE任務(wù)之前,應(yīng)通過審計項目目錄中的文件以查找可疑或惡意命令來驗證.vscode/tasks.json文件,尤其是從未知源下載時。
惡意生成任務(wù)的示例
惡意命令可以隱藏在tasks.json文件下并偽裝成生成命令。當(dāng)開發(fā)者試圖生成之前盲目信任的項目時,開發(fā)者設(shè)備將執(zhí)行遠(yuǎn)程代碼,這可能是惡意的。攻擊者還可以通過在常規(guī)生成命令之間隱藏惡意命令,使有效負(fù)載更為隱蔽,這將減少開發(fā)者的懷疑。
在模擬中,我們通過Pastebin在遠(yuǎn)程服務(wù)器上放置了一個腳本。這是一種被一些攻擊者濫用的方法,將其惡意有效載荷發(fā)送到受感染的設(shè)備中。這項技術(shù)對攻擊者的好處是可以遠(yuǎn)程更改有效載荷。例如,在成功感染后,可以將有效負(fù)載更改為無害的內(nèi)容。
使用Visual Studio
Visual Studio是Microsoft用于.NET和C++開發(fā)的專有IDE,它沒有工作區(qū)信任功能。因此,開發(fā)者在加載不受信任的項目文件和執(zhí)行生成時應(yīng)該格外小心。惡意的生成前或生成后任務(wù)可能會被注入到文件中,從而導(dǎo)致從生成開始就執(zhí)行不必要的執(zhí)行。
Visual Studio項目文件預(yù)生成任務(wù)命令示例
嵌入預(yù)生成PowerShell執(zhí)行的概念驗證示例
使用其他IDE
在Eclipse IDE中,仍然可以注入生成命令。因此,文件是不同的。首先,ExternalToolBuilder的生成命令必須在.project文件中指定,參考在.externaltoolbuilders文件夾中定義實際執(zhí)行命令的另一個文件。通過將多個生成命令鏈接在一起,我們可以實現(xiàn)與Visual Studio Code中相同的多個命令執(zhí)行。
.project文件節(jié)鏈接生成執(zhí)行規(guī)范的示例
生成事件外部命令規(guī)范
由于使用外部生成工具的項目文件注入適用于基本IDE的范圍,因此它僅適用于實際代碼編譯為二進(jìn)制文件的語言。這包括Java和C/c++,但不包括像PHP這樣的語言,因為不執(zhí)行生成。
NetBeans IDE主要用于Java開發(fā),盡管它還通過第三方擴(kuò)展支持PHP、HTML5、JavaScript或C/C++開發(fā)。Java開發(fā)項目可以利用Maven、Gradle或Ant作為其依賴關(guān)系管理和生成自動化工具。因此,項目和生成定義可能不同。然而,所有這些工具都支持將第三方流程作為生成前或生成后操作來執(zhí)行。在這種情況下,攻擊者可以注入惡意代碼,并希望開發(fā)者不會注意到并不情愿地執(zhí)行。
對于Ant,注入可以在nbproject/build-impl.xml文件中完成,方法是將以下代碼片段添加到一個合適的目標(biāo)標(biāo)記中:
Ant的注入點和觸發(fā)生成時的命令執(zhí)行示例
當(dāng)開發(fā)者使用Maven作為生成工具時,可以通過更改項目文件夾中的pom.xml來實現(xiàn)相同的目標(biāo)。這一次,在生成標(biāo)記中使用了org.codehaus.mojo插件。所使用的語法類似于Ant所使用的語法。
Maven第三方執(zhí)行示例
對于Gradle,Groovy語言腳本用于位于app/build.gradle內(nèi)部的生成定義,并且對所選任務(wù)內(nèi)的字符串調(diào)用execute()函數(shù)將觸發(fā)代碼執(zhí)行。
Gradle第三方執(zhí)行示例
盡管“打開項目”對話框有一個“信任項目生成腳本”選項,但其功能僅對Gradle項目有效。如果未選中,它將阻止Gradle腳本啟動,因此,當(dāng)加載項目作為CVE-2020-11986修復(fù)時,代碼執(zhí)行是可能的。盡管如此,當(dāng)用戶決定手動執(zhí)行生成時,不會顯示進(jìn)一步的對話框,并且生成被認(rèn)為是可信的。
NetBeans中的“信任項目生成腳本”復(fù)選框
IntelliJ IDEA是另一個用于Java、Kotlin、Groovy和其他基于Java虛擬機(jī)(JVM)的語言開發(fā)的IDE。它還支持Ant生成腳本。加載包含Ant生成腳本的項目會觸發(fā)一個對話框警告,提示它可能會執(zhí)行潛在的惡意代碼,如果它不是來自可信的源,建議使用安全模式。當(dāng)開發(fā)者試圖在安全模式下執(zhí)行生成時,IDE會警告用戶該操作只能在可信模式下完成。
IntelliJ IDEA顯示潛在惡意生成腳本的警告
IntelliJ IDEA生成安全模式生成警告
PyCharm是用于Python開發(fā)的IDE。Python腳本通常不會在執(zhí)行之前編譯。然而,開發(fā)者仍然可以指定自定義運(yùn)行/調(diào)試配置,允許在實際腳本執(zhí)行之前執(zhí)行第三方二進(jìn)制文件。這可能用于腳本數(shù)據(jù)輸入準(zhǔn)備。
運(yùn)行執(zhí)行前的外部工具
該操作在項目內(nèi)部被參考。但是,實際的可執(zhí)行規(guī)范存儲在不同的位置,更具體地說,存儲在~/.config/JetBrains/PyCharmXXXX/tools/External Tools.xml。正如我們所看到的,該文件存儲在用戶主目錄中,保護(hù)它不受攻擊模型場景的影響,因為它需要修改本地文件系統(tǒng)。
運(yùn)行前任務(wù)參考
運(yùn)行前任務(wù)定義
總結(jié)
研究人員使用執(zhí)行惡意生成腳本的攻擊場景評估了所有已識別的IDE,向這些生成腳本中注入惡意命令是可能的。如上所述,一些IDE明確警告開發(fā)者惡意操作的可能性,除非項目配置將其標(biāo)記為明確可信,否則不允許執(zhí)行任務(wù)。另一方面,一些IDE使用這樣的假設(shè),即當(dāng)開發(fā)者打開一個項目或?qū)⑵鋸?fù)制到他的工作區(qū)時,它會自動被信任,并且不需要任何進(jìn)一步的操作。
無論我們使用什么IDE,總會權(quán)衡安全性和可用性。開發(fā)者不應(yīng)該盲目地相信互聯(lián)網(wǎng)上的每一個開源項目。在執(zhí)行任何生成操作之前,開發(fā)者至少應(yīng)該知道他們有可能成為目標(biāo)并審查生成腳本。
我們還想強(qiáng)調(diào),上述攻擊場景不僅限于本地IDE,而且安全重要性在于所使用的工作流和工作區(qū)信任本身,無論開發(fā)者在容器或支持在線IDE的VM中執(zhí)行實際生成/編譯的情況如何。一旦工作區(qū)被標(biāo)記為可信,并且生成腳本被修改,它可能會在環(huán)境中觸發(fā)不需要的代碼執(zhí)行,并導(dǎo)致IDE具有訪問權(quán)限。以下是開發(fā)者可以記住的一些最佳安全實踐:
使用安全配置的CI/CD平臺,在具有適當(dāng)?shù)幕诮巧脑L問控制(RBAC)的外部設(shè)備或服務(wù)上執(zhí)行生成,只有授權(quán)人員才能更改生成腳本;
在集成到項目之前,檢查外部源代碼和生成腳本;
避免在審計之前盲目使用開箱即用的解決方案,特別是當(dāng)這些解決方案在社區(qū)中沒有廣泛使用或來自未經(jīng)核實的來源時;
定期跟蹤變更并進(jìn)行審查。
本文翻譯自:https://www.trendmicro.com/en_us/research/23/a/attacking-the-supply-chain-developer.html