從脆弱性到勝利:捍衛(wèi)您的CI/CD管道
自動(dòng)化的持續(xù)集成/持續(xù)交付(CI/CD)流水線被用來(lái)加快開(kāi)發(fā)速度。擁有可以觸發(fā)或預(yù)定的流水線,可自動(dòng)接收代碼、合并代碼、構(gòu)建代碼、測(cè)試代碼并自動(dòng)交付,這真是太棒了。然而,由于這些流水線通常需要訪問(wèn)互聯(lián)網(wǎng)以下載依賴項(xiàng),并且需要訪問(wèn)各種機(jī)密信息以上傳至生產(chǎn)環(huán)境,這意味著一旦這樣的流水線遭到入侵,攻擊者就有很多選擇來(lái)破壞您的操作、竊取信息或機(jī)密信息。
本文介紹的所有故事都涉及知名的CI/CD工具的違規(guī)事件。大多數(shù)公司依賴這些工具,這意味著與其他軟件供應(yīng)鏈攻擊一樣,所有惡意行為者只需攻擊一個(gè)目標(biāo),就可以獲得廣泛的影響范圍。
接下來(lái),讓我們來(lái)看一下過(guò)去幾年中幾個(gè)突出的故事,展示了這種攻擊向量固有的漏洞。在文章結(jié)束時(shí),我將確保提供一些建議來(lái)加固和保護(hù)您的流水線,無(wú)論您使用的是什么工具。
自動(dòng)化的持續(xù)集成/持續(xù)交付(CI/CD)流水線被用來(lái)加快開(kāi)發(fā)速度。自動(dòng)觸發(fā)或預(yù)定的流水線能夠自動(dòng)接收代碼、合并代碼、構(gòu)建代碼、測(cè)試代碼并自動(dòng)交付。然而,這些流水線通常以速度和易用性為目標(biāo),并不一定會(huì)考慮到安全性。由于流水線通常需要訪問(wèn)互聯(lián)網(wǎng)以下載依賴項(xiàng),并且需要訪問(wèn)各種機(jī)密信息以上傳到生產(chǎn)環(huán)境,一旦流水線遭到入侵,攻擊者就有多種選擇來(lái)破壞您的操作、竊取信息或機(jī)密信息。
本文中介紹的所有故事都描述了著名CI/CD工具遭受的入侵事件。大多數(shù)公司依賴這些工具,這意味著與其他軟件供應(yīng)鏈攻擊一樣,惡意行為者只需攻擊單個(gè)目標(biāo)就能造成廣泛影響。
讓我們回顧一下過(guò)去幾年中幾個(gè)突出事件,展示了這種攻擊方式的固有漏洞。文章結(jié)尾,我將提供一些建議,以加強(qiáng)和保護(hù)您的流水線,無(wú)論您使用的是哪種工具。
CircleCI的入侵事件
在2023年1月,持續(xù)集成和交付平臺(tái)CircleCI公開(kāi)披露了一起安全入侵事件,攻擊者成功未經(jīng)授權(quán)地訪問(wèn)了公司的基礎(chǔ)設(shè)施。攻擊是由一封釣魚(yú)郵件發(fā)起的,欺騙了一名員工以分享他們的憑據(jù),攻擊者利用這些憑據(jù)訪問(wèn)了公司的系統(tǒng)。該員工使用了雙重認(rèn)證,但攻擊者在員工登錄系統(tǒng)后抓取了一個(gè)會(huì)話Cookie,使他們能夠冒充該員工,并最終升級(jí)訪問(wèn)了CircleCI的一部分生產(chǎn)系統(tǒng)。
攻擊者訪問(wèn)了一些客戶數(shù)據(jù),包括姓名、郵箱地址和賬單信息。公司報(bào)告稱沒(méi)有訪問(wèn)到任何代碼或知識(shí)產(chǎn)權(quán),并且沒(méi)有客戶報(bào)告到他們賬戶或數(shù)據(jù)的任何未經(jīng)授權(quán)的訪問(wèn)。
CircleCI迅速做出了應(yīng)對(duì),展開(kāi)了調(diào)查,并與執(zhí)法部門和網(wǎng)絡(luò)安全專家合作,確定了攻擊的范圍,并修復(fù)了導(dǎo)致攻擊發(fā)生的漏洞。該公司還重置了所有員工和客戶的憑據(jù),并實(shí)施了其他安全措施,例如加強(qiáng)系統(tǒng)的監(jiān)控。
DevOps受到干擾:Argo CD的安全入侵事件
Argo CD是一款用于將應(yīng)用程序持續(xù)部署到Kubernetes集群的熱門開(kāi)源工具。2022年2月,發(fā)現(xiàn)了Argo CD中的一個(gè)新漏洞,該漏洞允許未經(jīng)身份驗(yàn)證的用戶訪問(wèn)由該工具管理的Kubernetes應(yīng)用程序的敏感信息。該漏洞是由Argo CD的API服務(wù)器配置錯(cuò)誤引起的,該錯(cuò)誤允許未經(jīng)授權(quán)的用戶執(zhí)行API請(qǐng)求并檢索諸如密鑰、配置和應(yīng)用程序元數(shù)據(jù)等信息。只要攻擊者有權(quán)限創(chuàng)建或更新應(yīng)用程序并知道或能夠猜測(cè)包含有效YAML的文件的完整路徑,他們就可以創(chuàng)建惡意的Helm圖表,并繼續(xù)在值中使用YAML文件,直到找到通常不可訪問(wèn)的重要數(shù)據(jù)。
此漏洞被評(píng)定為CVSS分?jǐn)?shù)7.5(高危),影響著包括2.1.4版本在內(nèi)的Argo CD的所有版本。Argo CD在2.1.5版本中發(fā)布了針對(duì)該漏洞的補(bǔ)丁,建議用戶盡快升級(jí)到該版本。
此漏洞被認(rèn)為特別令人擔(dān)憂,因?yàn)锳rgo CD通常用于管理生產(chǎn)環(huán)境中的關(guān)鍵應(yīng)用程序和基礎(chǔ)架構(gòu)。敏感信息的泄漏可能允許攻擊者訪問(wèn)敏感數(shù)據(jù)或采取其他惡意行動(dòng),從而影響應(yīng)用程序的可用性或安全性。
解開(kāi)Codecov入侵的謎團(tuán):經(jīng)驗(yàn)教訓(xùn)
Codecov是一款用于跟蹤和分析代碼覆蓋率的工具,用于CI/CD流水線中,使開(kāi)發(fā)人員能夠衡量和分析他們的測(cè)試的有效性。根據(jù)Codecov的安全更新所述:
“2021年4月1日星期四,我們得知有人未經(jīng)我們的許可,未經(jīng)授權(quán)地訪問(wèn)了我們的Bash Uploader腳本,并進(jìn)行了修改。攻擊者之所以能夠獲得訪問(wèn)權(quán)限,是因?yàn)镃odecov的Docker鏡像創(chuàng)建過(guò)程中存在的錯(cuò)誤,導(dǎo)致攻擊者能夠提取修改我們的Bash Uploader腳本所需的憑證?!?/p>
Bash Uploader由客戶用于將他們的代碼覆蓋率報(bào)告上傳到Codecov平臺(tái)。使用這種訪問(wèn)權(quán)限,攻擊者修改了Bash上傳腳本,添加了惡意代碼,該代碼可以在上傳過(guò)程中從用戶系統(tǒng)中收集環(huán)境變量、驗(yàn)證令牌和其他敏感數(shù)據(jù)。然后,這些數(shù)據(jù)被發(fā)送到攻擊者控制的遠(yuǎn)程服務(wù)器。
Codecov確認(rèn)該入侵事件影響了大約1%的客戶群體,其中包括技術(shù)、金融和醫(yī)療保健行業(yè)的重要公司。該公司確認(rèn),在入侵期間沒(méi)有更改任何客戶代碼或代碼覆蓋率報(bào)告,但用戶驗(yàn)證令牌和其他敏感信息可能已受到威脅。
Codecov立即采取行動(dòng)刪除了惡意代碼,并提醒受影響的客戶重置其驗(yàn)證令牌并采取其他安全措施。該公司還展開(kāi)了對(duì)這一事件的調(diào)查,并與執(zhí)法部門和網(wǎng)絡(luò)安全專家合作,確定了攻擊的來(lái)源。
如何保護(hù)您的流水線?
如上所述,CI/CD流水線是為了速度和自動(dòng)化而構(gòu)建的,并不一定在設(shè)計(jì)時(shí)考慮到安全性。三家大型知名公司都遭受了某種類型的攻擊,可能導(dǎo)致客戶信息曝光,這表明您自己的流水線和數(shù)據(jù)的漏洞性。
無(wú)論您使用的是何種工具或CI/CD平臺(tái),您可以采取一些措施來(lái)提高安全性并在惡意攻擊者成功訪問(wèn)流水線或網(wǎng)絡(luò)時(shí)減少潛在的損害。
威脅建模:威脅建模是一種結(jié)構(gòu)化的方法,用于識(shí)別對(duì)系統(tǒng)或應(yīng)用程序可能構(gòu)成的安全威脅,并設(shè)計(jì)相應(yīng)的對(duì)策來(lái)減輕這些威脅。作為一種練習(xí),假設(shè)有人入侵了您的流水線。他們現(xiàn)在可以訪問(wèn)哪些環(huán)境?他們可以看到和使用哪些密鑰?他們可以修改您的代碼嗎?影響測(cè)試嗎?從web上提取文件或運(yùn)行逆向shell嗎?即使您認(rèn)為已對(duì)流水線進(jìn)行了清理并正確分割了網(wǎng)絡(luò)訪問(wèn)權(quán)限,勾起一下惡意行為的想象力,然后檢查一下,以便您了解最糟糕的情況。您可能會(huì)驚訝地發(fā)現(xiàn)您的流水線平臺(tái)或工具中隱藏著哪些在明顯情況下的開(kāi)放密鑰和訪問(wèn)選項(xiàng)。
網(wǎng)絡(luò)分割:網(wǎng)絡(luò)分割是將較大的網(wǎng)絡(luò)劃分為更小、更安全的子網(wǎng)絡(luò)或段的實(shí)踐,每個(gè)子網(wǎng)絡(luò)或段都有自己的安全控制和策略。網(wǎng)絡(luò)分割的目的是通過(guò)限制潛在安全入侵的范圍并將攻擊的潛在影響最小化來(lái)增加整體網(wǎng)絡(luò)的安全性。將網(wǎng)絡(luò)分割成較小的段限制了攻擊者的橫向移動(dòng),并降低了未經(jīng)授權(quán)的訪問(wèn)或數(shù)據(jù)泄漏的風(fēng)險(xiǎn)。
伴隨著釣魚(yú)攻擊日益普及,您的開(kāi)發(fā)人員或其他員工可能成為此類騙局的受害者,畢竟我們都是人類。假設(shè)您的開(kāi)發(fā)人員的憑據(jù)可能會(huì)被惡意行為者利用,這意味著您需要確保絕大多數(shù)開(kāi)發(fā)人員不具備足夠的權(quán)限,使他們能夠單獨(dú)地竊取機(jī)密信息、向生產(chǎn)鏡像中加入惡意代碼、或者只需推送自己版本的生產(chǎn)代碼而無(wú)人可阻攔。確保每個(gè)人只具備完成工作所需的最低限度的權(quán)限是一項(xiàng)耗時(shí)的工作,讓每個(gè)人都擁有管理員權(quán)限并就此作罷是非常誘人的。不要被黑暗面所吸引 - 遵循最小權(quán)限和零信任原則。
監(jiān)控和警報(bào):繼續(xù)上述內(nèi)容,即使對(duì)開(kāi)發(fā)人員進(jìn)行了深入的訓(xùn)練,以提高他們防范網(wǎng)絡(luò)釣魚(yú)和其他社會(huì)工程攻擊的意識(shí),安全入侵仍然可能發(fā)生。您并不知道何時(shí)或以何種方式發(fā)生入侵,但您應(yīng)該做好隨時(shí)發(fā)現(xiàn)的準(zhǔn)備。由于大多數(shù)流水線環(huán)境是臨時(shí)的,這意味著一旦工作完成,除非您自己創(chuàng)建這些跡象,否則不會(huì)留下?tīng)?zhēng)論發(fā)生的證據(jù)。
確保對(duì)流水線中發(fā)生的所有事情進(jìn)行記錄,包括每次PR、合并、構(gòu)建和測(cè)試。確保用戶信息也被記錄下來(lái),以便在需要時(shí)進(jìn)行審查。對(duì)配置文件或環(huán)境本身的任何更改也應(yīng)記錄下來(lái)。目標(biāo)是能夠?qū)θ肭诌M(jìn)行清晰的事后調(diào)查。事先確定哪些事件應(yīng)產(chǎn)生警報(bào),并確保正確的人員接收到這些警報(bào)。注意不要洪水般地發(fā)送無(wú)用或錯(cuò)誤的警報(bào) - 這會(huì)導(dǎo)致人們因接收到無(wú)用或錯(cuò)誤的警報(bào)而忽略它們,或在推遲處理時(shí)故意忽略警報(bào)。顯然,這些日志中不應(yīng)包含任何開(kāi)放密鑰或密碼 - 這導(dǎo)致下一個(gè)重點(diǎn):
密鑰管理:確保使用某種密鑰管理工具。至少,這將使您能夠在發(fā)生入侵時(shí)更容易輪換密鑰和密碼。還應(yīng)該做一些工作,將在系統(tǒng)上進(jìn)行的任何記錄中的流數(shù)據(jù)和訪問(wèn)密鑰屏蔽。任何未經(jīng)授權(quán)的人員都不應(yīng)該能夠訪問(wèn)這些信息,他們絕對(duì)不應(yīng)該能夠更改它們。
隨著組織越來(lái)越多地依賴基于云的服務(wù)、容器化應(yīng)用程序和其他分布式環(huán)境,這些環(huán)境要求在不同的系統(tǒng)和應(yīng)用程序之間安全共享和管理密鑰,因此加強(qiáng)密鑰管理變得日益重要。
結(jié)合最小權(quán)限的RBAC原則:基于角色的訪問(wèn)控制(Role-Based Access Control,RBAC)的原則是根據(jù)用戶在組織中的分配角色或工作職責(zé)來(lái)授予他們對(duì)系統(tǒng)資源的訪問(wèn)權(quán)限。在RBAC中,用戶被分配角色,該角色定義了他們對(duì)各種系統(tǒng)資源(如文件、文件夾或應(yīng)用程序)的權(quán)限和訪問(wèn)權(quán)。另一方面,最小權(quán)限的原則是授予用戶至少權(quán)限和訪問(wèn)特權(quán),以執(zhí)行他們的工作職能所需的最低級(jí)別。這意味著用戶只能訪問(wèn)他們完成特定任務(wù)所需的資源,并且沒(méi)有其他權(quán)限。RBAC和最小權(quán)限原則通常一起作為互補(bǔ)的安全原則使用。在RBAC中,用戶被分配的角色具有訪問(wèn)所需資源的適當(dāng)級(jí)別,最小權(quán)限原則確保用戶只能訪問(wèn)執(zhí)行特定任務(wù)所需的最低級(jí)別的資源。
這兩個(gè)原則共同有助于維護(hù)一個(gè)安全且良好管理的系統(tǒng),風(fēng)險(xiǎn)最小,未經(jīng)授權(quán)的訪問(wèn)或數(shù)據(jù)泄漏的風(fēng)險(xiǎn)較小。作為額外的安全措施,您還可以設(shè)置特定系統(tǒng)關(guān)鍵操作需要多個(gè)用戶授權(quán)的機(jī)制。需要注意的是,由于這種做法可能會(huì)顯著降低開(kāi)發(fā)工作速度,因此應(yīng)謹(jǐn)慎使用。但對(duì)于關(guān)鍵更新,例如刪除主要分支或修改依賴關(guān)系列表,至少需要兩個(gè)擁有適當(dāng)訪問(wèn)權(quán)限的人批準(zhǔn)該更新。
展望未來(lái)
沒(méi)有人會(huì)停止使用CI/CD和其他自動(dòng)化工具來(lái)加快工作進(jìn)程。我們生活在一個(gè)不斷追求更快代碼更新的世界中。我們只需要確保以安全意識(shí)的方式進(jìn)行,并不會(huì)在追求速度的同時(shí)危及我們的代碼和生產(chǎn)環(huán)境。
您可以做的最重要的事情之一就是認(rèn)真思考,未經(jīng)授權(quán)的人員如果獲取了訪問(wèn)權(quán)限會(huì)發(fā)生什么。一旦您意識(shí)到危險(xiǎn)和流水線和網(wǎng)絡(luò)中的不同薄弱點(diǎn),相信您能夠采取正確的步驟來(lái)彌補(bǔ)潛在的漏洞。