Cloudflare已修復(fù)其免費(fèi)開(kāi)源CDNJS中的一個(gè)嚴(yán)重漏洞,該漏洞可能影響互聯(lián)網(wǎng)上12.7%的網(wǎng)站。
CDNJS為數(shù)百萬(wàn)網(wǎng)站提供超過(guò)4000個(gè)JavaScript和CSS庫(kù),這些庫(kù)公開(kāi)存儲(chǔ)在GitHub上,使其成為第二大JavaScript CDN。
該漏洞利用包括使用GitHub和npm將數(shù)據(jù)包發(fā)布到Cloudflare的CDNJS,以觸發(fā)路徑遍歷漏洞,并最終遠(yuǎn)程執(zhí)行代碼。
如果被利用,該漏洞將導(dǎo)致CDNJS基礎(chǔ)設(shè)施的完全攻擊。
從“ZIP Slip”到遠(yuǎn)程代碼執(zhí)行
本周,安全研究員RyotaK解釋了他如何在研究供應(yīng)鏈攻擊的同時(shí)找到一種方法來(lái)完全攻擊Cloudflare的CDNJS網(wǎng)絡(luò)。
CDN的全稱是Content Delivery Network,即內(nèi)容分發(fā)網(wǎng)絡(luò)。其基本思路是盡可能避開(kāi)互聯(lián)網(wǎng)上有可能影響數(shù)據(jù)傳輸速度和穩(wěn)定性的瓶頸和環(huán)節(jié),使內(nèi)容傳輸?shù)母?、更穩(wěn)定。在維護(hù)互聯(lián)網(wǎng)的安全性、完整性和可用性方面發(fā)揮著關(guān)鍵作用,因?yàn)榻^大多數(shù)網(wǎng)站都依賴這些服務(wù)來(lái)加載流行的JavaScript庫(kù)和CSS腳本。
CDN可能成為攻擊者的目標(biāo)選擇,因?yàn)槿绻艿焦?,攻擊?huì)對(duì)許多網(wǎng)站、在線商店及其客戶產(chǎn)生深遠(yuǎn)的影響。
在瀏覽cdnjs.com時(shí),RyotaK注意到對(duì)于CDNJS中尚不存在的庫(kù),他可以建議通過(guò)CDNJS的GitHub存儲(chǔ)庫(kù)添加一個(gè)新庫(kù)。
用戶可以請(qǐng)求將包發(fā)布到CDNJS的GitHub存儲(chǔ)庫(kù)
在探索了這個(gè)GitHub存儲(chǔ)庫(kù)以及共同使CDNJS生態(tài)系統(tǒng)工作的相鄰存儲(chǔ)庫(kù)之后,RyotaK找到了一種方法來(lái)誘使服務(wù)器執(zhí)行任意代碼。
特別是,研究人員研究了cdnjs/bot-ansible和cdnjs/tools中存在的腳本,包括一個(gè)自動(dòng)更新腳本,有助于自動(dòng)檢索庫(kù)更新。
這些腳本會(huì)定期使用其開(kāi)發(fā)者在相應(yīng)npm注冊(cè)表上發(fā)布的較新版本的軟件庫(kù)更新CDNJS服務(wù)器。
換句話說(shuō),對(duì)于發(fā)布到CDNJS的GitHub存儲(chǔ)庫(kù)的每個(gè)庫(kù),其更新版本將從鏈接的npm注冊(cè)表下載,并且npm版本也由庫(kù)開(kāi)發(fā)者維護(hù)。
RyotaK想知道,如果他發(fā)布到CDNJS的庫(kù)在對(duì)應(yīng)的npm版本中包含路徑遍歷漏洞,會(huì)發(fā)生什么。注意,npm包是以TGZ(.tar.gz)檔案的形式發(fā)布的,可以很容易地使用隱藏在其中的路徑遍歷漏洞來(lái)制作。
研究人員首先使用GitHub向CDNJS發(fā)布了一個(gè)名為hey-sven的測(cè)試庫(kù),然后開(kāi)始在npm注冊(cè)表上發(fā)布更新版本的“hey-sven”。
在發(fā)布到npm的較新的“hey-sven”版本中,最終將由CDNJS的更新機(jī)器人處理,研究人員在看起來(lái)很奇怪的路徑上注入了Bash腳本。
這些不同的路徑只不過(guò)是隱藏在ZIP/TGZ檔案中的路徑遍歷漏洞,這個(gè)概念在2018年以“ZIP Slip”方式爆發(fā)了。
2018年6月5日,Snky安全團(tuán)隊(duì)公布了一個(gè)名為Zip Slip的漏洞。這是一個(gè)廣泛存在的文件覆蓋漏洞,通過(guò)這個(gè)漏洞,攻擊者可以利用一個(gè)特制的Zip壓縮文件,從路徑遍歷覆蓋任意文件,繼而遠(yuǎn)程命令執(zhí)行,發(fā)起攻擊。Zip Slip是以目錄遍歷的一種形式,通過(guò)從存檔中提取文件來(lái)進(jìn)行攻擊。目錄遍歷漏洞的前提是攻擊者可以訪問(wèn)文件系統(tǒng)中應(yīng)該駐留的目標(biāo)文件夾之外的部分文件系統(tǒng)。然后,攻擊者可以覆蓋可執(zhí)行文件并遠(yuǎn)程調(diào)用它們,或者等待系統(tǒng)或用戶調(diào)用它們,從而實(shí)現(xiàn)受害者機(jī)器上的遠(yuǎn)程命令執(zhí)行。此漏洞還可能通過(guò)覆蓋配置文件或其他敏感資源而造成損害,并且可能會(huì)在客戶端(用戶)機(jī)器和服務(wù)器上受到攻擊。
攻擊者主要可以利用保存目錄遍歷文件名的特制檔案文件(例如../../evil.sh)觸發(fā)Zip Slip漏洞。該漏洞已影響許多存檔的格式,包括tar、jar、war、cpio、apk、rar和7z等大量的壓縮文件。
目前Zip Slip漏洞已經(jīng)影響了包括阿里巴巴、Google、Oracle、Eclipse、HP、Amazon、Apache、Pivotal、Linkedin等企業(yè)的數(shù)千個(gè)項(xiàng)目,以及Java、Ruby、.Net、Go等多種語(yǔ)言生態(tài)系統(tǒng),其中Java受到的攻擊尤為嚴(yán)重,主要是因?yàn)樗鼪](méi)有中央倉(cāng)庫(kù)提供高級(jí)別歸檔(如Zip)文件處理。缺乏這樣的庫(kù)導(dǎo)致易受攻擊的代碼片段被手工制作,并在諸如Stack Overflow等開(kāi)發(fā)者社區(qū)中共享。
“hey-sven”庫(kù)的npm 1.0.1和1.0.2版本包含路徑遍歷漏洞
一旦CDNJS服務(wù)器處理了精心制作的“hey-sven”npm檔案,這些Bash腳本的內(nèi)容將在服務(wù)器上執(zhí)行。
但是,研究人員不想意外覆蓋現(xiàn)有腳本,因此在概念驗(yàn)證(PoC)測(cè)試期間,他首先使用符號(hào)鏈接漏洞讀取他即將覆蓋的文件的內(nèi)容。
由于Git在默認(rèn)情況下支持符號(hào)鏈接,所以可以通過(guò)在Git存儲(chǔ)庫(kù)中添加符號(hào)鏈接來(lái)從cdnjs庫(kù)更新服務(wù)器中讀取任意文件。如果定期執(zhí)行的腳本文件被覆蓋執(zhí)行任意命令,自動(dòng)更新功能可能會(huì)被攻擊,所以研究人員決定先檢查任意文件讀取。
一旦攻擊者精心制作的PoC擊中服務(wù)器,RyotaK就能夠意外地將敏感機(jī)密(例如GITHUB_REPO_API_KEY和WORKERS_KV_API_TOKEN)轉(zhuǎn)儲(chǔ)到CDN提供的腳本中,網(wǎng)址為https://cdnjs.cloudflare.com/...
初始符號(hào)鏈接PoC的輸出為研究人員提供了密鑰
GITHUB_REPO_API_KEY是一個(gè)授予寫(xiě)作權(quán)限的API密鑰,使攻擊者能夠修改CDNJS上的任何庫(kù)甚至篡改cdnjs.com網(wǎng)站本身。
另一方面,WORKERS_KV_API_TOKEN秘密可用于篡改存在于Cloudflare Workers緩存中的庫(kù)。
通過(guò)組合這些權(quán)限,CDNJS的核心部分,例如CDNJS的原始數(shù)據(jù)、KV緩存,甚至CDNJS網(wǎng)站,都可以完全被篡改。
Cloudflare發(fā)布了許多修復(fù)程序以修復(fù)漏洞
研究人員于2021年4月6日通過(guò)HackerOne的漏洞披露計(jì)劃向Cloudflare報(bào)告了此漏洞,并看到Cloudflare的團(tuán)隊(duì)在數(shù)小時(shí)內(nèi)應(yīng)用了間歇性修復(fù)。
BleepingComputer看到的初始修復(fù)旨在解決符號(hào)鏈接漏洞:
Cloudflare的CDNJS(GitHub)應(yīng)用的初始修復(fù)
然而,根據(jù)研究人員的說(shuō)法,由于CDNJS生態(tài)系統(tǒng)的復(fù)雜性,在接下來(lái)的幾周內(nèi)對(duì)不同的存儲(chǔ)庫(kù)應(yīng)用了一系列更具體的修復(fù)。
RyotaK與BleepingComputer分享了第一個(gè)修復(fù)以拒絕Git存儲(chǔ)庫(kù)中的符號(hào)鏈接為中心,但它只修復(fù)了部分問(wèn)題。
修復(fù)人員首先試圖拒絕符號(hào)鏈接,但注意到機(jī)器人當(dāng)前的設(shè)計(jì)太危險(xiǎn)了。因此他們隔離了最危險(xiǎn)的功能。
對(duì)于其他功能,修復(fù)人員應(yīng)用了AppArmors。
Application Armor或AppArmor是一種安全功能,它使用預(yù)定義的配置文件限制在基于Unix的環(huán)境上運(yùn)行的程序的功能,以便程序不會(huì)無(wú)意中超出其預(yù)期的訪問(wèn)范圍。
研究人員還與Cloudflare部署的BleepingComputer共享了一系列修復(fù)程序,以保護(hù)自動(dòng)機(jī)器人處理更新的庫(kù):
Cloudflare對(duì)CDNJS進(jìn)行了多項(xiàng)更改以解決該漏洞
雖然這個(gè)漏洞可以在沒(méi)有任何特殊處理的情況下被利用,但它可能會(huì)影響許多網(wǎng)站。鑒于供應(yīng)鏈中存在許多漏洞,這些漏洞很容易被利用但影響很大。
正如BleepingComputer先前報(bào)道的那樣,影響數(shù)千家在線商店的Magecart供應(yīng)鏈攻擊源于對(duì)Volusion的CDN基礎(chǔ)設(shè)施的攻擊。
本文翻譯自:https://www.bleepingcomputer.com/news/security/critical-cloudflare-cdn-flaw-allowed-compromise-of-12-percent-of-all-sites/