軟件供應(yīng)鏈攻擊的特征是向軟件包中注入惡意代碼,以破壞供應(yīng)鏈下游的相關(guān)系統(tǒng)。近年來,許多供應(yīng)鏈攻擊在軟件開發(fā)過程中充分利用了開放源代碼的使用, 這是由依賴項管理器(dependency managers)提供的,它在整個軟件生命周期中自動解析,下載和安裝數(shù)百個開放源代碼包,從而促進(jìn)了供應(yīng)鏈攻擊。
本文介紹了174個惡意軟件包的數(shù)據(jù)集,這些數(shù)據(jù)包在開源軟件供應(yīng)鏈的真實攻擊中使用,并通過流行的軟件包存儲庫npm、PyPI和RubyGems分發(fā),對2015年11月至2019年11月的軟件包進(jìn)行了手動收集和分析。
本文還提出了兩種通用攻擊樹,以提供有關(guān)將惡意代碼注入下游用戶的依賴樹以及在不同時間和不同條件下執(zhí)行此類代碼的技術(shù)的結(jié)構(gòu)化概述。這項工作旨在促進(jìn)開源和研究社區(qū)在未來發(fā)展的預(yù)防和保障措施。
01Introduction
通常,軟件供應(yīng)鏈攻擊旨在將惡意代碼注入到軟件產(chǎn)品中。攻擊者經(jīng)常篡改給定供應(yīng)商的最終產(chǎn)品,以使其帶有有效的數(shù)字簽名,因為該數(shù)字簽名是由相應(yīng)的供應(yīng)商簽名的,并且可以由最終用戶通過受信任的分發(fā)渠道(例如分銷商)獲得,即網(wǎng)站下載或更新。
此類供應(yīng)鏈攻擊的一個突出例子是NotPetya,這是一種被隱藏在流行的烏克蘭會計軟件的惡意更新中的勒索軟件。2017年,NotPetya目標(biāo)是烏克蘭公司,但也打擊了全球的公司,造成了數(shù)十億美元的損失,據(jù)說是當(dāng)今已知的最具破壞性的網(wǎng)絡(luò)攻擊之一。同年,可從供應(yīng)商的官方網(wǎng)站下載惡意版本的CCleaner(一種適用于Microsoft Windows系統(tǒng)的流行維護(hù)工具),并且超過一個月沒有被發(fā)現(xiàn)。在此期間,它被下載了約230萬次。
供應(yīng)鏈攻擊的另一種形式是將惡意代碼注入到軟件供應(yīng)商產(chǎn)品的依賴項中。這種攻擊媒介已經(jīng)由Elias Levy在2003年進(jìn)行了預(yù)測,并且近年來隨著該方案的出現(xiàn),出現(xiàn)了許多實際攻擊。這種攻擊成為可能,因為現(xiàn)代軟件項目通常依賴于多個開源程序包,這些程序包本身引入了許多可傳遞的依賴關(guān)系。這種攻擊濫用了開發(fā)人員對托管在常用服務(wù)器上的軟件包的真實性和完整性的信任,并濫用了鼓勵這種做法的自動構(gòu)建系統(tǒng)。
數(shù)千個開源軟件項目可能需要單個開源軟件包,這使得開源軟件包成為軟件供應(yīng)鏈攻擊的非常有吸引力的目標(biāo)。最近對npm軟件包event-stream的攻擊表明了此類攻擊的潛在范圍:只需通過要求原始開發(fā)人員接管其維護(hù)工作,即可將所謂的攻擊者授予顯著npm軟件包的所有權(quán)。當(dāng)時,event-stream還被另外1600個軟件包使用,平均每周被下載150萬次。
開源軟件供應(yīng)鏈攻擊可與易受攻擊的開源軟件包的問題相提并論,后者可能會將其漏洞傳遞給相關(guān)的軟件項目,這屬于OWASP 前10應(yīng)用程序安全風(fēng)險之一。但是,在供應(yīng)鏈攻擊的情況下,會故意注入惡意代碼,攻擊者會采用混淆和規(guī)避技術(shù)來避免被人或程序分析工具檢測到。
02Methodology
相關(guān)工作主要涉及易受攻擊的程序包,這些程序包包含偶然引入的設(shè)計缺陷或代碼錯誤,沒有惡意。但由于疏忽大意,可能構(gòu)成潛在的安全風(fēng)險。與此相反,惡意軟件包包含故意的設(shè)計缺陷或代碼錯誤,這些缺陷或代碼錯誤在軟件生命周期中被謹(jǐn)慎的加以利用或觸發(fā)。
區(qū)分易受攻擊的軟件包和惡意軟件包很重要。如前所述,易受攻擊的軟件包可能包含設(shè)計缺陷或代碼錯誤,這些缺陷或代碼錯誤是無意間但由于疏忽而意外引入的,并且可能構(gòu)成潛在的安全風(fēng)險。
從技術(shù)上講,惡意和易受攻擊的編碼可能相似甚至相同,因此,主要區(qū)別在于攻擊者的意圖。這項工作有兩個方面的作用:使用攻擊樹對可能的攻擊進(jìn)行系統(tǒng)描述,以及在實際攻擊中使用的惡意軟件包數(shù)據(jù)集。攻擊樹能夠表示對系統(tǒng)的攻擊。攻擊的主要目標(biāo)用作根節(jié)點,子節(jié)點代表實現(xiàn)該目標(biāo)的可能方法。
第一個攻擊樹的目的是將惡意代碼注入下游用戶的軟件供應(yīng)鏈,而第二個攻擊樹的目的是在不同情況下觸發(fā)其惡意行為。手動分析每個惡意軟件包和信息源,并在提供足夠信息的情況下將其映射到每個攻擊樹的節(jié)點。如果不存在擬合節(jié)點,則添加一個新節(jié)點。這種迭代方法確保攻擊樹的節(jié)點代表現(xiàn)實的攻擊向量。但是,該方法的缺點是這些樹不完整,因為它們不反映尚未觀察到或未描述的攻擊媒介。
在此期間,對漏洞數(shù)據(jù)庫Snyk、特定于語言的安全建議和研究博客進(jìn)行了審查,以確定惡意包和可能的攻擊向量。注意,這些來源僅提及軟件包的名稱和受影響的版本,因此,實際的惡意代碼必須從其他來源下載。但是,這種惡意程序包通常在相應(yīng)編程語言的標(biāo)準(zhǔn)程序包存儲庫中不再可用,例如npm或PyPI。
相反,在可能的情況下,它們是從不推薦使用的鏡像,互聯(lián)網(wǎng)檔案和公共研究資料庫中檢索到的。如果可以檢索到惡意軟件包的代碼,則會對其進(jìn)行手動分析和分類。這樣做是為了確認(rèn)軟件包的惡意軟件,將其映射到現(xiàn)有的攻擊樹或在必要時進(jìn)行擴(kuò)展。軟件包的惡意版本的發(fā)布日期根據(jù)Libraries.io(該服務(wù)可監(jiān)視所有主要軟件包存儲庫中軟件包的發(fā)布)而定。咨詢和公共事件報告可用于對惡意程序包進(jìn)行公開披露。
03Threat Analysis and Attack Trees
本節(jié)從高層次介紹與開源軟件開發(fā)項目相關(guān)的活動和系統(tǒng)開始,并以兩個攻擊樹為結(jié)尾。本屆的攻擊樹是基于在野觀察到的實際惡意軟件包以及安全研究人員和從業(yè)人員描述的潛在攻擊和弱點以迭代方式創(chuàng)建的。
通常,攻擊樹允許對針對任何類型的系統(tǒng)的攻擊進(jìn)行系統(tǒng)的描述。因此,給定樹的根節(jié)點對應(yīng)于攻擊者的頂級目標(biāo),子節(jié)點代表實現(xiàn)此目標(biāo)的替代方法。攻擊樹的頂級目標(biāo)是將惡意代碼注入軟件供應(yīng)鏈,從而注入開發(fā)項目的依存關(guān)系,并在不同情況下觸發(fā)該惡意代碼。
A、開源開發(fā)項目
在如上圖所示的典型開發(fā)環(huán)境中,維護(hù)者是開發(fā)項目的成員,他們管理所描述的系統(tǒng),提供,審查和批準(zhǔn)文稿,定義和觸發(fā)構(gòu)建過程。開源項目還從貢獻(xiàn)者那里獲得代碼貢獻(xiàn),維護(hù)者可以對其進(jìn)行審查并合并到項目的代碼庫中。
構(gòu)建過程(build process)將攝取項目的源代碼和其他資源,并且其目標(biāo)是產(chǎn)生軟件工件。這些工件隨后被發(fā)布,以使它們可供最終用戶和其他開發(fā)項目使用。
項目資源位于版本控制系統(tǒng)(VCS)中,例如Git,并將其復(fù)制到構(gòu)建系統(tǒng)的本地文件系統(tǒng)中。在這些資源中有直接依賴項的聲明,在構(gòu)建過程開始時,依賴項管理器會對其進(jìn)行分析,以建立具有所有直接和傳遞性依賴項的完整依賴項樹。由于在構(gòu)建期間(例如,在編譯時或在測試執(zhí)行期間)都需要它們,因此它們是從軟件包存儲庫中下載的,這些存儲庫包括用于Python的PyPI,用于Node.js的npm或用于Java的Maven Central。
在成功構(gòu)建的最后,程序代碼和其他資源被組合到一個或多個構(gòu)建工件中,這些工件可能會被簽名并最終發(fā)布。要么是諸如應(yīng)用商店之類的分發(fā)平臺,以便最終用戶可以使用它們,要么將其打包為其他開發(fā)項目的存儲庫。
這樣的項目環(huán)境受眾多信任邊界的約束,并且許多威脅都針對各自的數(shù)據(jù)流,數(shù)據(jù)存儲和流程。即使僅考慮單個軟件項目的環(huán)境,管理這些威脅也可能具有挑戰(zhàn)性。當(dāng)考慮具有數(shù)十個或數(shù)百個依賴項的供應(yīng)鏈時,要注意每個單獨的依賴項都存在這樣的環(huán)境。顯然,此類項目的組合攻擊面比完全由內(nèi)部開發(fā)的軟件要大得多。
從攻擊者的角度出發(fā),惡意行為者打算通過感染一個或多個上游開源軟件包來損害軟件項目的構(gòu)建或運行時環(huán)境的安全性,每個上游開源軟件包均在與上圖相當(dāng)?shù)沫h(huán)境中開發(fā)。在以下各節(jié)中,將通過兩個攻擊樹來描述實現(xiàn)此目標(biāo)的方法,這兩個攻擊樹提供了有關(guān)攻擊路徑的結(jié)構(gòu)化概述,這些攻擊路徑用于將惡意代碼注入下游用戶的依賴樹并在不同時間或不同條件下觸發(fā)其執(zhí)行。
B、注入惡意代碼
上圖所示的攻擊樹的最高目標(biāo)是將惡意代碼注入到下游軟件包的依賴樹中。因此,一旦具有惡意代碼的軟件包在分發(fā)平臺(例如,分發(fā)平臺)上可用,就可以實現(xiàn)該目標(biāo)。軟件包存儲庫成為一個或多個其他軟件包的直接或傳遞依賴項。這樣,這種類型的代碼注入不同于其他注入攻擊,其中許多攻擊在應(yīng)用程序運行時利用安全漏洞,例如,安全漏洞。由于缺乏用戶輸入清理功能而可能導(dǎo)致緩沖區(qū)溢出攻擊。要將軟件包注入依賴樹中,攻擊者可能會采用兩種可能的策略,即感染現(xiàn)有軟件包或提交新軟件包。
顯然,使用其他人未使用的名稱開發(fā)和發(fā)布新的惡意程序包可以避免干擾其他合法項目維護(hù)者。但是,此類程序包必須由下游用戶發(fā)現(xiàn)并引用,以便最終進(jìn)入受害者程序包的依賴關(guān)系樹中。這可以通過使用與現(xiàn)有軟件包名稱類似的名稱(搶注)或通過開發(fā)和推廣木馬病毒來實現(xiàn)。攻擊者還可能借此機(jī)會重用由其原始的合法維護(hù)者撤回的現(xiàn)有項目,程序包或用戶帳戶的標(biāo)識符(免費使用)。
第二種策略是感染已經(jīng)具有用戶、貢獻(xiàn)者和維護(hù)者的現(xiàn)有軟件包。攻擊者可能出于各種原因選擇軟件包,例如大量或特定的下游用戶組。但是,到目前為止收集的數(shù)據(jù)尚無法驗證相應(yīng)的假設(shè)。一旦攻擊者選擇了要感染的軟件包,就可以將惡意代碼注入到源中,在構(gòu)建過程中或注入到軟件包存儲庫中。
開源項目通過社區(qū)的貢獻(xiàn)來生存和奮斗,因此,攻擊者可以模仿良性的項目貢獻(xiàn)者。例如,攻擊者可能通過創(chuàng)建帶有錯誤修復(fù)或看似有用的功能或依賴項的拉取請求(PR)來假裝解決現(xiàn)有問題。后者可以用來創(chuàng)建對使用先前描述的技術(shù)從頭創(chuàng)建的攻擊者-控制器程序包的依賴關(guān)系。無論如何,此PR必須由合法的項目維護(hù)者批準(zhǔn)并合并到主代碼分支中。或者攻擊者可能會通過使用脆弱或受到破壞的憑據(jù)或?qū)Π踩舾械腁PI令牌將攻擊者的全部惡意代碼提交給項目的代碼庫。
此外,攻擊者可以通過社會工程成為維護(hù)者。在任何情況下,無論惡意代碼如何添加到源中,無論在哪里進(jìn)行構(gòu)建,它都將在下一個發(fā)行版本中成為正式軟件包的一部分。與對構(gòu)建系統(tǒng)和軟件包存儲庫的攻擊相比,VCS中的惡意代碼更易于手動或自動查看提交或整個存儲庫。
構(gòu)建系統(tǒng)的折衷通常需要篡改在整個構(gòu)建過程中使用的資源,例如編譯器,構(gòu)建插件或網(wǎng)絡(luò)服務(wù)(例如代理或DNS服務(wù)器)。如果構(gòu)建系統(tǒng)(無論是開發(fā)人員的工作站還是Jenkins之類的構(gòu)建服務(wù)器)容易受到漏洞攻擊,或者如果通信渠道不安全以致攻擊者可以操縱從存儲庫中下載軟件包,這些資源可能會受到損害。目標(biāo)軟件包的發(fā)布版本也可以在共享的構(gòu)建系統(tǒng)上運行,因此可以被多個項目使用。
根據(jù)設(shè)置的不同,此類構(gòu)建過程可能不是孤立運行的,因此,包緩存或構(gòu)建插件之類的資源會在不同項目的構(gòu)建之間共享。在這種情況下,攻擊者可能會在其控制下的惡意構(gòu)建項目期間破壞共享資源,從而使目標(biāo)項目在以后的時間點受到破壞。
即使是流行的軟件包系統(tǒng)信息庫,也仍然會遭受簡單但嚴(yán)重的安全漏洞。盡管所有其他攻擊媒介都試圖將惡意代碼注入到單個程序包中,但利用程序包存儲庫中的漏洞本身會使帶有其所有程序包的整個存儲庫處于危險之中。
類似于在源代碼中注入代碼,攻擊者可能會使用脆弱或受到破壞的憑據(jù)或通過社會工程獲得維護(hù)者授權(quán),以發(fā)布合法版本的惡意版本。由于前者已被用于多種攻擊中,因此諸如核心基礎(chǔ)設(shè)施(Core Infrastructure Initiative)的徽章計劃之類的計劃向項目維護(hù)者提供了正式建議,以啟用雙因素身份驗證。
此外,攻擊者可能會將惡意程序包版本上載到原始維護(hù)者未提供的備用存儲庫或存儲庫鏡像,并等待受害者從那里獲取依賴關(guān)系。據(jù)說此類存儲庫和鏡像不那么受歡迎,攻擊取決于受害者的配置,例如查詢依賴關(guān)系或使用鏡像的存儲庫順序。
C、執(zhí)行惡意代碼
一旦某個項目的依賴關(guān)系樹中存在惡意代碼,上圖所示的攻擊樹就具有在不同條件下觸發(fā)惡意代碼的頂級目標(biāo)。這樣的條件可以用來逃避對特定用戶和系統(tǒng)的檢測和/或目標(biāo)攻擊。
惡意代碼可能在受感染的軟件包及其下游用戶的不同生命周期階段觸發(fā)。如果測試用例中包含惡意代碼,則攻擊主要針對被感染程序包的貢獻(xiàn)者和維護(hù)者,他們在其開發(fā)人員工作站和構(gòu)建系統(tǒng)上運行此類測試。
在許多記錄的攻擊中,惡意代碼被包含在安裝腳本里,安裝腳本在軟件包安裝期間由下游用戶或其依賴關(guān)系管理器自動執(zhí)行。此類安裝腳本適用于Python和Node.js,可用于執(zhí)行安裝前或安裝后活動。安裝腳本中的惡意代碼使下游程序包的提供者和維護(hù)者及其最終用戶受到威脅。惡意代碼也可能在下游程序包的運行時觸發(fā),這要求將其作為受害者程序包的常規(guī)控制流的一部分進(jìn)行調(diào)用。
在Python中,這可以通過在init .py中包含惡意代碼來實現(xiàn),該惡意代碼通過import語句調(diào)用。在JavaScript中,這可以通過猴子補(bǔ)丁(monkey-patching)等現(xiàn)有方法來實現(xiàn)。細(xì)化此目標(biāo)可以輕松涵蓋各個編程語言,程序包管理器等的細(xì)節(jié)。
與生命周期階段無關(guān),惡意行為的執(zhí)行可能總是觸發(fā)(無條件的)或僅在滿足某些條件時(有條件的執(zhí)行)觸發(fā)。對于任何其他惡意軟件,條件執(zhí)行會使惡意開源軟件包的動態(tài)檢測復(fù)雜化,因為在沙箱環(huán)境中可能無法理解或滿足相應(yīng)條件。以應(yīng)用程序狀態(tài)為條件的執(zhí)行是逃避檢測的常見手段,例如在測試環(huán)境或?qū)S玫膼阂廛浖治錾诚渲小M瑯樱鱾€構(gòu)建系統(tǒng)的細(xì)節(jié)可能會包含在各自的子目標(biāo)中,例如Jenkins環(huán)境變量的存在表明惡意代碼是在構(gòu)建期間而不是在生產(chǎn)環(huán)境中觸發(fā)的。
此外,條件可能與特定的受害者包有關(guān),例如檢查特定的應(yīng)用程序狀態(tài),例如加密錢包的余額。大量重復(fù)使用開放源代碼軟件包可能導(dǎo)致以下事實:惡意軟件包最終出現(xiàn)在許多下游軟件包的依賴關(guān)系樹中。如果攻擊者只對某些軟件包感興趣,則它們可能會在手邊給定依賴關(guān)系樹的節(jié)點上限制代碼執(zhí)行。此外,所使用的操作系統(tǒng)可以作為條件。
05Description of the Dataset
總共可以識別469個惡意軟件包。此外,還發(fā)現(xiàn)了59個可被確認(rèn)為POC的軟件包(由研究人員發(fā)布),因此不再進(jìn)行進(jìn)一步檢查。最終,能夠為174個軟件包獲得至少一個受影響的版本。Npm的惡意軟件包成功下載率為109/374(29.14%),PyPI為28/44(63.64%),RubyGems為37/41(90.24%)和Maven Central為0/10(0.00%)。
A、組成和結(jié)構(gòu)
該數(shù)據(jù)集包含在npm上發(fā)布的62.6%的程序包,因此是用JavaScript為Node.js編寫的。其余的軟件包通過PyPI(16.1%,Python)和RubyGems(21.3%,Ruby)發(fā)布。不幸的是,無法下載針對Android開發(fā)人員的惡意Java軟件包。對于PHP,根本無法識別任何惡意軟件包。
完整的數(shù)據(jù)集可在GitHub上免費獲得:https://dasfreak.github.io/Backstabbers-Knife-Collection。出于道德原因,僅在有正當(dāng)理由的情況下才允許訪問。數(shù)據(jù)集的結(jié)構(gòu)如下:package-manager/package-name/version/package.file。惡意軟件包在第一級由其原始軟件包管理器分組。此外,一個軟件包的多個受影響版本會在相應(yīng)軟件包名稱下。事件流受影響版本示例:npm/event-stream/3.3.6/event-stream-3.3.6.tgz。
B、時間方面
上圖可視化了收集到的軟件包的發(fā)布日期,范圍從2015年11月到2019年11月。發(fā)布和披露日期是根據(jù)軟件包的上載時間和相應(yīng)通報的發(fā)布日期來標(biāo)識的,這些通報將相應(yīng)版本標(biāo)識為惡意。顯然,已發(fā)布的惡意軟件包數(shù)量呈增長趨勢。雖然已知用于PyPI的惡意程序包可以追溯到2015年,并且此后一直在增加,但npm在2017年獲得了大量惡意程序包,而RubyGems上的惡意程序包在2019年經(jīng)歷了最高點。
上圖顯示在被公開報告之前,平均有209天的惡意軟件包可用(min=-1,max= 1216,ρ= 258,x= 67)。盡管知道npm/eslint-scope/3.7.2的感染,但由于開發(fā)人員的重新打包策略,該軟件包仍在使用中。npm/rpc-websocket/0.7.7最大值達(dá)到了1,216天,它接管了一個廢棄的軟件包,很長時間沒有被發(fā)現(xiàn)。
總的來說,這表明軟件包傾向于長期可用。雖然PyPI的平均在線時間最高,但該時間段的npm變化最大,而RubyGems傾向于更及時地檢測到惡意軟件包。
C、惡意行為的觸發(fā)
程序包的惡意行為可能在與程序包交互的不同點觸發(fā)。最典型地,可以安裝、測試或執(zhí)行軟件包。每個軟件包存儲庫的分離如下圖所示。它說明了在安裝過程中對任意代碼的錯誤處理會產(chǎn)生使用最多的感染媒介。
顯然,大多數(shù)惡意軟件包(56%)會在安裝時啟動其例程。這可以由軟件包存儲庫的安裝命令觸發(fā),例如npm install
與此相反,Ruby沒有實現(xiàn)這種安裝邏輯,Ruby中不存在該情況的軟件包。因此,在RubyGems上找到的所有包都將運行時用作觸發(fā)器。總體而言,有43%的程序包在程序運行時(即從其他函數(shù)調(diào)用時)暴露了其惡意行為。
對于1%的軟件包,測試程序被用作觸發(fā)器。調(diào)用npm/ladder-text-js/1.0.0的測試?yán)虒?zhí)行sudo rm-rf / *,這可能會刪除所有文件。
D、有條件的執(zhí)行
如上圖所示,有41%的軟件包在檢查條件之前會觸發(fā)進(jìn)一步的執(zhí)行。這可能取決于應(yīng)用程序的狀態(tài),例如檢查主應(yīng)用程序是否處于生產(chǎn)模式(例如RubyGems/paranoid2/1.1.6),域名的可解析性(例如npm/logsymbles/2.2.0)或加密錢包中包含的金額(例如npm/flatmap- stream/0.1.1)。
其他技術(shù)是檢查依賴關(guān)系樹中是否存在另一個軟件包(例如npm/load-from-cwd-or-npm/3.0.2)或該軟件包是否在某個操作系統(tǒng)上執(zhí)行(例如PyPI / libpeshka / 0.6)。
在PyPI和RubyGems上發(fā)布的大多數(shù)軟件包都是無條件執(zhí)行的。對于npm,條件執(zhí)行和無條件執(zhí)行的比率幾乎相等。
E、注入惡意軟件包
在上圖中,很明顯,大多數(shù)(61%)惡意軟件包都是通過域名搶注來模仿現(xiàn)有軟件包的名稱的。對該現(xiàn)象的更深入分析顯示,平均搶注程序包到目標(biāo)的Levenshtein距離為2.3(,,min= 0,max= 11,ρ= 2.05,x= 1.0)。在某些情況下,可以從其他軟件包存儲庫中獲得搶注目標(biāo)。完全相同名稱的Linux軟件包系統(tǒng)信息庫apt。例如python-sqlite就是這種情況。在以kafka-python為目標(biāo)的pythonkafka的情況下,最大距離為11。常用的技術(shù)是添加或刪除連字符,省略單個字母或交換經(jīng)常被錯誤鍵入的字母。經(jīng)常被針對的單詞是,,color”或與之對應(yīng)的英式英語單詞,,color”。
第二種最常見的注入方法是感染現(xiàn)有包裝。這通常可以通過存儲庫系統(tǒng)的憑據(jù)受損(例如npm/eslint-scope/3.7.2)來實現(xiàn)。在大多數(shù)情況下,無法回顧確切的感染技術(shù)。這是因為相關(guān)的來源通常會從版本控制系統(tǒng)中刪除,或者沒有進(jìn)一步公開有關(guān)注入的詳細(xì)信息。因此,這些軟件包被列為感染現(xiàn)有軟件包。
另一種注入技術(shù)是創(chuàng)建一個新軟件包,其中僅包含木馬惡意軟件包。在這些軟件包中找不到有意義的拼寫搶注目標(biāo)。這些軟件包可以與受感染的現(xiàn)有軟件包結(jié)合使用,也可以獨立使用。
F、主要目標(biāo)
如下圖所示,大多數(shù)軟件包都針對數(shù)據(jù)滲透。通常,感興趣的數(shù)據(jù)是/etc/passwd,~/.ssh/*,~/.npmrc或~/.bash歷史記錄的內(nèi)容。此外,惡意程序包試圖泄漏環(huán)境變量(其中可能包含訪問令牌)和常規(guī)系統(tǒng)信息。另一個流行的目標(biāo)是語音和文本聊天應(yīng)用程序Discord的令牌。Discord用戶的帳戶可能會鏈接到信用卡信息,因此可用于財務(wù)欺詐。
此外,有34%的軟件包充當(dāng)Dropper來下載第二階段的有效負(fù)載。另有5%的用戶利用后門(即反彈shell)到遠(yuǎn)程服務(wù)器,并等待進(jìn)一步的說明。3%的目的是通過用fork炸彈和文件刪除(例如npm/destroyer-of-worlds/1.0.0)耗盡資源或破壞其他軟件包的功能(npm/load-from-cwd-or-npm/3.0.2)。3%將財務(wù)收益作為主要目標(biāo),如在后臺運行加密礦工(npm/hooka-tools / 1.0.0)或直接竊取加密貨幣(例如pip/colourama/0.1.6)。另外,可能會發(fā)生上述目標(biāo)的組合。
G、目標(biāo)操作系統(tǒng)
為了識別目標(biāo)操作系統(tǒng),對源代碼進(jìn)行了手動分析,以獲得可能像if platform.system() is “Windows”一樣構(gòu)造的提示,例如使用PyPI/openvc/1.0.0 或者通過依賴僅在某些OS上可用的資源而隱含的。這些資源可能是包含敏感信息的文件,如.bashrc等(npm/font-scrubber/1.2.2)或可執(zhí)行文件,如/bin/sh(npm/rpc-websocket/0.7.11)。
對針對其目標(biāo)操作系統(tǒng)(OS)的軟件包的分析表明,大多數(shù)軟件包(53%)是不可知的,即不依賴于操作系統(tǒng)特定的功能。該分析是對程序包的初始可見代碼進(jìn)行的,因此第二階段有效負(fù)載的目標(biāo)OS仍然未知。但是,由于構(gòu)建環(huán)境通常是在此類OS上運行的,因此與Unix類似的系統(tǒng)似乎比Windows和macOS更具針對性。
只有一種已知的macOS案例是目標(biāo),其中軟件包npm/angluar-cli/0.0.1通過刪除和修改macOS的McAfee病毒掃描程序?qū)acOS進(jìn)行拒絕服務(wù)攻擊。
H、混淆
惡意行為者經(jīng)常試圖掩蓋其代碼的存在,即阻礙其被肉眼看到。在數(shù)據(jù)集中將近一半的軟件包(49%)采用了某種混淆處理。大多數(shù)情況下,使用不同的編碼(Base64或Hex)來掩蓋惡意功能或可疑變量(例如域名)的存在。
良性軟件包經(jīng)常使用的一種壓縮源代碼并節(jié)省帶寬的技術(shù)是最小化的。但是,這對于惡意行為者來說是一個機(jī)會,可以潛入人類無法讀取的額外代碼(例如npm/tensorplow/1.0.0)。隱藏變量的另一種方法是使用字符串采樣。這需要一個看似隨機(jī)的字符串,該字符串用于通過逐個字母的選擇來重建有意義的字符串(例如npm/ember-power-timepicker/1.0.8)。
在一種情況下,惡意功能被加密隱藏。軟件包npm/flatmap-stream/0.1.1利用AES256和目標(biāo)軟件包的簡短描述作為解密密鑰。這樣,惡意行為僅在目標(biāo)軟件包使用時才暴露出來。此外,存在上述技術(shù)的組合。
I、群集
為了推斷攻擊活動的存在,對所有軟件包進(jìn)行了分析,以重新使用惡意代碼或依賴關(guān)系。這樣,有可能識別出21個群集,至少有兩個程序包具有相同的惡意代碼,或者由攻擊者控制的程序包依賴于另一個具有實際惡意代碼的程序包,這些群集至少有兩個。總共174個軟件包中的157個(占90%)屬于一個集群。平均而言,群集包括7.28個程序包(min= 2,max= 36,ρ= 8.96,x = 3)。
對一個群集中的包裝的出版物發(fā)布日期進(jìn)行交叉比較發(fā)現(xiàn),發(fā)布之間的平均時間間隔為42天,618(min=140,max= 353天,1102,ρ= 78天,010,x = 7天,1551)。最大的集群形成在crossenv的36個軟件包,平均時間間隔為5.98天。它分兩期發(fā)布,2017年7月19日在15分鐘內(nèi)發(fā)布了11個軟件包,2017年8月1日在30分鐘內(nèi)發(fā)布了另外25個軟件包。
發(fā)布日期間隔為353天的集群由兩個軟件包PyPI/jeilyfish /0.7.0和PyPI/python3-dateutil /2.9.1組成。第一次發(fā)布于18/12/11 12:26 AM,其中包含的代碼可以下載腳本以從Windows計算機(jī)中竊取SSH和GPG密鑰。直到第二個軟件包在19/29/19 11:43 AM發(fā)布之后很長時間都未被檢測到,該軟件包本身并不包含惡意代碼,但引用了第一個軟件包。在19/12/19 05:53 PM被報告并刪除了該群集。
盡管大多數(shù)群集只包含一個軟件包存儲庫中的軟件包,但是可以找到一個群集,其中主要包含npm中的軟件包,以及RubyGems中的RubyGems/active-support/5.2.0。這意味著存在攻擊活動,或者至少技術(shù)跨多個軟件包存儲庫流動。
J、兩個惡意軟件包的代碼審查
根據(jù)對代碼相似性的手動評估,上圖的npm/jqeury/3.3.1(左)和RubyGems/active-support/5.2.0(右)都屬于同一集群,即使它們發(fā)布在不同的存儲庫中。
06Conclution
從攻擊者的角度來看,程序包存儲庫代表了可靠且可擴(kuò)展的惡意軟件分發(fā)渠道。到目前為止,Node.js(npm)和Python(PyPI)的存儲庫是惡意軟件包的主要目標(biāo),這可能是由于在軟件包安裝過程中可以輕松觸發(fā)惡意代碼這一事實。已經(jīng)存在許多可以由不同利益相關(guān)者實施的對策,例如面向開放源代碼維護(hù)者的多因素身份驗證,面向開放源代碼用戶的版本固定和禁用安裝腳本,或者隔離構(gòu)建過程和增強(qiáng)構(gòu)建服務(wù)器。
但是,盡管提高了利益相關(guān)者的普遍意識,這種對策必須更易于訪問,并且在可能的情況下默認(rèn)實施,以防止開源軟件供應(yīng)鏈攻擊。
A、結(jié)果
從觀察到的案例和相關(guān)工作中得出了兩個攻擊樹。一種用于將惡意程序包注入開源生態(tài)系統(tǒng),另一種用于執(zhí)行惡意代碼。這些攻擊樹可對過去和將來的攻擊進(jìn)行系統(tǒng)描述。能夠創(chuàng)建第一個手動管理的惡意開源軟件包的數(shù)據(jù)集,該數(shù)據(jù)包已在現(xiàn)實世界的攻擊中使用。從2015年11月到2019年11月,它包含174個惡意軟件包(npm 62.6%,PyPI 16.1%,RubyGems 21.3%)。
手動分析顯示,大多數(shù)軟件包(56%)會在安裝時觸發(fā)其惡意行為,另有41%使用進(jìn)一步的條件確定是否運行。超過一半的軟件包(61%)利用域名搶注將自身注入到生態(tài)系統(tǒng)中,而數(shù)據(jù)泄露是最常見的目標(biāo)(55%)。這些軟件包通常與操作系統(tǒng)無關(guān)(53%),并且經(jīng)常采用混淆處理(49%)來隱藏自身。最終可以通過不同的編程語言,通過重用的代碼來檢測惡意軟件包的多個群集。
B、未來的工作
希望有新的技術(shù)和工具來掃描整個程序包存儲庫中的可疑程序包,例如根據(jù)觀察發(fā)現(xiàn)惡意代碼可在同一廣告系列的程序包甚至語言之間重復(fù)使用。在這種情況下,手動管理和標(biāo)記的數(shù)據(jù)集允許有監(jiān)督的學(xué)習(xí)方法,這些方法支持對惡意軟件包的自動化和整個存儲庫范圍內(nèi)的搜索。此外,關(guān)于現(xiàn)有和新的緩解策略,本文提出的數(shù)據(jù)集可作為基準(zhǔn)。
審核編輯 :李倩
-
開源軟件
+關(guān)注
關(guān)注
0文章
212瀏覽量
16252 -
源代碼
+關(guān)注
關(guān)注
96文章
2953瀏覽量
68280 -
供應(yīng)鏈
+關(guān)注
關(guān)注
3文章
1713瀏覽量
39950
原文標(biāo)題:開源軟件供應(yīng)鏈攻擊回顧
文章出處:【微信號:談思實驗室,微信公眾號:談思實驗室】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
萬里紅推出供應(yīng)鏈軟件安全解決方案
安博電子:全鏈路品控體系賦能供應(yīng)鏈安全

安富利:供應(yīng)鏈強(qiáng)則企業(yè)強(qiáng)

一文探索物流CEO大屏及供應(yīng)鏈大屏是如何做好雙11保障

天馬微電子榮獲全球汽車供應(yīng)鏈生態(tài)伙伴獎
AI大模型在工業(yè)領(lǐng)域的供應(yīng)鏈管理方向的應(yīng)用

RFID技術(shù)在PC組件供應(yīng)鏈管理中的應(yīng)用

東軟獲《電信和互聯(lián)網(wǎng)軟件供應(yīng)鏈安全能力成熟度模型》第三等級認(rèn)證
天合光能入選國家級數(shù)字化供應(yīng)鏈案例
同星智能即將亮相第六屆汽車新供應(yīng)鏈大會

利用Minitab應(yīng)對供應(yīng)鏈中斷問題
2024開源和軟件安全沙龍啟幕,基調(diào)聽云加入3S-Lab軟件供應(yīng)鏈安全實驗室

智能制造裝備行業(yè)的供應(yīng)鏈特點分析

活動回顧 艾體寶 開源軟件供應(yīng)鏈安全的最佳實踐 線下研討會圓滿落幕!

供應(yīng)鏈場景使用ClickHouse最佳實踐

評論