一. 概述
Docker提供了一種快速、靈活和可移植的方式來構(gòu)建和交付應(yīng)用程序,Docker鏡像倉庫使得用戶能夠更加方便地存儲和共享Docker鏡像。然而,鏡像泄露敏感信息事件屢有發(fā)生,因此,在使用Docker鏡像倉庫過程中,我們應(yīng)該始終關(guān)注其安全性,并且采取必要的措施以保護(hù)敏感信息和數(shù)據(jù)的安全。
Docker鏡像倉庫分為公共鏡像倉庫和私有鏡像倉庫,公共鏡像倉庫主要是由一些官方機(jī)構(gòu)提供給用戶免費(fèi)使用的存儲和共享Docker鏡像的平臺,常見的公共鏡像倉庫有Docker Hub,阿里云鏡像倉庫、Google鏡像倉庫等,都包含了廣泛的公共鏡像供用戶使用。私有鏡像倉庫是用戶自己搭建用于存儲和共享Docker鏡像的平臺。用戶可以在私有鏡像倉庫中存儲自己的鏡像,并控制訪問權(quán)限,使其只能被特定的用戶或組織使用。常見的私有鏡像倉庫有Harbor和Docker Registry,其中Harbor提供了企業(yè)級的鏡像倉庫管理功能,包括鏡像復(fù)制、安全掃描等功能。
本文主要對公共鏡像倉庫Docker Hub、私有鏡像倉庫Harbor、Docker Registry的數(shù)據(jù)泄露風(fēng)險(xiǎn)進(jìn)行了分析。
文中涉及到的技術(shù)僅供教學(xué)、研究使用,禁止用于非法用途,文中所涉及漏洞驗(yàn)證,均使用本地服務(wù)器。
二. Docker Hub鏡像泄露分析
2.1Docker Hub鏡像密鑰泄露情況
今年7月,德國亞琛工業(yè)大學(xué)(RWTH-Aachen University)的研究人員在Docker Hub上發(fā)現(xiàn)了數(shù)萬個暴露了敏感數(shù)據(jù)、源代碼的鏡像[1]。他們在分析了337171個鏡像,包含了1647300層的復(fù)雜數(shù)據(jù)集后,最終在28621個鏡像(占比8.5%)中發(fā)現(xiàn)了52107個有效的私鑰和3158個API密鑰。
圖1 研究人員最終獲取的敏感信息匯總
從圖1中可以看出,私鑰的泄露可能會導(dǎo)致中間人攻擊、身份偽造等后果,主要私鑰類型有PEM Private Key、PEM Private Key Block等。API敏感信息主要包括公有云服務(wù)憑證、金融支付憑證、社交媒體憑證和物聯(lián)網(wǎng)憑證,其中泄露的公有云服務(wù)憑證類型的包括了阿里云、亞馬遜云、Azure等多個大型公有云服務(wù),金融支付憑證則包含了亞馬遜MWS、Bitfinex、Coinbase等大型國外交易網(wǎng)站或加密貨幣的交易憑證,社交媒體的憑證主要包含了Facebook和Twitter,物聯(lián)網(wǎng)設(shè)備的憑證數(shù)量相對較少,但也可能會導(dǎo)致物聯(lián)網(wǎng)設(shè)備數(shù)據(jù)被竊取的嚴(yán)重后果,例如汽車位置信息的跟蹤定位。
2.2 暴露敏感信息分析
另外,德國亞琛工業(yè)大學(xué)的研究人員還對暴露的敏感信息進(jìn)行了分析,確定其實(shí)際用途進(jìn)而了解所暴露的攻擊面的大小。結(jié)果根據(jù)泄露的密鑰發(fā)現(xiàn)了22082個證書,其中還包括7546個私有簽名證書和1060個公共CA簽名證書,研究者對這些CA證書進(jìn)行了深入分析后,發(fā)現(xiàn)仍有141份證書有效。
圖2 Docker Hub泄露信息類型匯總
研究人員進(jìn)一步通過Censys數(shù)據(jù)庫[2]對密鑰進(jìn)行分析,發(fā)現(xiàn)了存在275269個主機(jī)使用了這些泄露的密鑰。如圖2所示,其中包括了可能傳輸物聯(lián)網(wǎng)敏感數(shù)據(jù)的MQTT資產(chǎn)以及AMQP資產(chǎn),存儲重要敏感數(shù)據(jù)的FTP資產(chǎn)、PostgreSQL資產(chǎn)和MYSQL資產(chǎn),還包括上萬臺用于SMTP、POP3、IMAP等郵件系統(tǒng)服務(wù)器。
對于SSH服務(wù)器和Kubernetes服務(wù)器,泄露的密鑰可能會帶來遠(yuǎn)程惡意shell訪問、僵尸網(wǎng)絡(luò)擴(kuò)張等威脅。
(備注:基于白帽原則研究人員并未對暴露的服務(wù)驗(yàn)證其密鑰)
Docker Hub免費(fèi)版只支持公開鏡像的托管,因此只能使用其公共鏡像倉庫的功能。如果用戶缺乏安全意識,將帶有敏感信息的鏡像上傳至公共鏡像倉庫,將導(dǎo)致鏡像和敏感信息泄露的風(fēng)險(xiǎn)。因此,建議避免將存儲敏感信息的鏡像上傳至Docker Hub公共鏡像倉庫,而是選擇自建Harbor或Docker Registry私有鏡像倉庫。同時,使用自建私有鏡像倉庫時也需要注意安全性。接下來的內(nèi)容將分析私有鏡像倉庫的安全性。
三. Harbor鏡像泄露分析
3.1 Harbor組件公網(wǎng)暴露情況
截至2023年11月,在Shodan上可以檢測到12379個暴露的Harbor資產(chǎn),如圖3所示,其中檢測到國內(nèi)3377個Harbor資產(chǎn),國外9002個資產(chǎn),值得一提的是,在2022年4月,國內(nèi)的Harbor資產(chǎn)暴露數(shù)量僅為2557[4],在近一年半的時間內(nèi)增長了820個,增長率為32%。這些資產(chǎn)都是暴露在公網(wǎng)上,且大量資產(chǎn)都處于存活狀態(tài)。
圖3 Harbor資產(chǎn)在Shodan上掃描的結(jié)果
3.2 鏡像泄露風(fēng)險(xiǎn)分析
既然Harbor在公網(wǎng)上暴露了這么多資產(chǎn),且暴露資產(chǎn)的數(shù)量增長如此迅猛,公網(wǎng)上的Harbor資產(chǎn)是否也存在鏡像泄露風(fēng)險(xiǎn)呢?本文將逐步進(jìn)行分析。
3.2.1 CVE-2022-46463導(dǎo)致鏡像泄露過程驗(yàn)證
提到Harbor鏡像泄露風(fēng)險(xiǎn),不得不說其近年來頻頻爆出漏洞,如CVE-2022-46463,NVD對該漏洞的描述如圖4所示[5],我們可以得出攻擊者可在無認(rèn)證情況下,訪問公開和私有的鏡像倉庫。
圖4 NVD對CVE-2022-46463的描述
雖然圖4的公告中明確指出了該漏洞所影響的范圍是2.5.3以下的版本,但經(jīng)過實(shí)際安裝測試,筆者發(fā)現(xiàn)截至2023年11月,Harbor最新Release版本2.9.1,以及之前發(fā)布的2.8.4及更老的版本,依然還存在該鏡像泄露風(fēng)險(xiǎn)。利用該Harbor特性獲取鏡像信息的驗(yàn)證過程如下:
首先在服務(wù)器上安裝harbor目前的最新release版本2.9.1,如圖5所示。
圖5 測試環(huán)境的Harbor版本為2.9.1
之后任意上傳測試鏡像至Harbor,并將其設(shè)置為公開,如圖6、圖7所示。
圖6 將測試鏡像打標(biāo)簽,并上傳到Harbor
圖7 Harbor上可以查詢到該鏡像
最后,在另外一臺服務(wù)器上,依然可以現(xiàn)通過Harbor的API接口獲取服務(wù)器上存儲的鏡像信息,再進(jìn)一步獲取某個鏡像的digest等具體信息后,可以組裝出該鏡像的拉取命令,并對該鏡像進(jìn)行拉取,結(jié)果成功拉取了該測試鏡像。具體過程如圖8到圖10所示。
圖8 通過CVE-2022-46463發(fā)現(xiàn)了上傳的鏡像倉庫名稱
圖9 通過Harbor的API接口進(jìn)一步獲取該鏡像的digest
圖10 通過鏡像的digest組裝出鏡像拉取命令,并成功拉取該鏡像
上述過程是在沒有任何認(rèn)證前提下,從目前最新Release版本(2.9.1)Harbor項(xiàng)目中獲取鏡像信息的過程,可以看出我們能夠獲取Harbor私有倉庫中被設(shè)置為“公開”的鏡像倉庫的信息,甚至能夠進(jìn)行拉取。
行文至此,想必讀者一定會好奇,為何如此嚴(yán)重的漏洞,官方遲遲不修復(fù)呢?
3.2.2 “假漏洞”烏龍事件
細(xì)心一點(diǎn)的讀者可以發(fā)現(xiàn),NVD對該漏洞的描述(如圖4)中最后的NOTE對該漏洞做出了補(bǔ)充說明:即官方認(rèn)為這個“漏洞”是Harbor的一個特性。
官方具體的回應(yīng)如圖11所示。
圖11 Harbor官方對此漏洞的回復(fù)
官方回應(yīng)明確指出,他們不認(rèn)為公開的CVE-2022-46463是Harbor的一個漏洞,而是Harbor官方文檔中所明確定義的特性之一,即用戶可以設(shè)置一些鏡像為公開,該特性導(dǎo)致Harbor上的所有被設(shè)置為公開的項(xiàng)目都通過相應(yīng)的API接口被列舉,獲取詳細(xì)信息,甚至被拉取。
筆者在測試過程中,確實(shí)發(fā)現(xiàn)在新建項(xiàng)目時可以對項(xiàng)目的訪問級別進(jìn)行勾選,如圖12所示。
圖12 新建項(xiàng)目界面
而且,在訪問級別后面的說明也對項(xiàng)目公開做出了詳細(xì)且明確的描述,當(dāng)項(xiàng)目設(shè)置為公開時,任何人都有該項(xiàng)目下的讀權(quán)限,且命令行用戶不需要“docker login”就可拉取該項(xiàng)目下的鏡像。
測試過程中,如果用戶不對項(xiàng)目訪問級別勾選“公開”項(xiàng),則只有項(xiàng)目設(shè)置所屬賬戶和admin賬戶可以看到此類項(xiàng)目,因而所有未認(rèn)證的用戶均無法通過API或前端查詢到任何信息,如圖13所示。
圖13 未認(rèn)證用戶無法通過API獲取到該項(xiàng)目的任何信息
盡管該項(xiàng)目對“公開”的描述已經(jīng)很詳實(shí),但由于Harbor的前端界面需要登錄認(rèn)證,針對使用Harbor不熟悉的用戶在操作時仍有可能會誤用該功能,從而使包含敏感信息的鏡像倉庫對所有人開放,而用戶的初衷可能只是對認(rèn)證用戶開放。
通過上述實(shí)驗(yàn)可以看出,幾乎所有版本的Harbor都存在通過特定方式獲取鏡像的風(fēng)險(xiǎn),這可能導(dǎo)致敏感信息泄露。因此,在使用Harbor進(jìn)行鏡像管理時,特別是在部署在公網(wǎng)上的情況下,建議用戶先熟悉Harbor的使用方式和特性,并嚴(yán)格控制鏡像倉庫的公開范圍。同時,重視對鏡像倉庫中的敏感信息和相關(guān)配置信息的管理,以避免因公開包含敏感信息的鏡像而導(dǎo)致敏感信息泄露的風(fēng)險(xiǎn)。
四. Docker Registry鏡像泄露分析
4.1 Docker Registry組件公網(wǎng)暴露情況
截至2023年11月,在Shodan上可以檢測到12920個暴露的Docker Registry資產(chǎn),如圖14所示,其中檢測到國內(nèi)2902個Harbor資產(chǎn),國外10018個。
圖14 Docker Registry資產(chǎn)在Shodan上掃描的結(jié)果
4.2 鏡像泄露風(fēng)險(xiǎn)分析
由于Docker Registry私有倉庫的認(rèn)證機(jī)制在默認(rèn)情況下并不會開啟,因而攻擊者可以直接調(diào)用官方提供的API接口[6]獲取私有鏡像倉庫的列表和版本信息,進(jìn)而可獲取鏡像的詳細(xì)信息,最終導(dǎo)致鏡像泄露的風(fēng)險(xiǎn)。以上筆者進(jìn)行了驗(yàn)證,過程如下:
當(dāng)使用命令docker run -p 5000:5000 –restart=always –name registry -v /var/lib/registry:/var/lib/registry -d registry進(jìn)行Docker Registry私有倉庫的構(gòu)建時,默認(rèn)不會開啟認(rèn)證服務(wù)。若該鏡像倉庫服務(wù)暴露在公網(wǎng)時,任意用戶可以通過官方API對鏡像列表進(jìn)行獲取,如圖15所示。
圖15 通過API對資產(chǎn)的鏡像倉庫列表進(jìn)行讀取
在獲取到鏡像倉庫列表后,進(jìn)一步通過官方API獲取tag信息,如圖16所示。
圖16 通過API獲取鏡像倉庫的tag列表
通過獲取倉庫名稱和tag,我們不僅可以獲取鏡像構(gòu)建的詳細(xì)信息,還能夠根據(jù)名稱和tag信息組合出鏡像拉取命令并進(jìn)行拉取,如圖17所示。
圖17 組合出來的鏡像倉庫拉取代碼
若要開啟認(rèn)證服務(wù),則需要先創(chuàng)建Docker Registry認(rèn)證文件目錄和認(rèn)證文件,并使用Apache的htpasswd來創(chuàng)建加密文件,容器的啟動方式如圖18所示。
圖18 開啟認(rèn)證服務(wù)時的Docker Registry啟動方式(示例)
當(dāng)給Docker Registry添加了認(rèn)證機(jī)制后,再通過其API接口獲取鏡像列表時將返回未認(rèn)證的提示,如圖19所示,因此添加認(rèn)證機(jī)制的Docker Registry將可以對私有鏡像倉庫進(jìn)行保護(hù)。
圖19 具有認(rèn)證機(jī)制的Docker Registry將可以對私有鏡像倉庫進(jìn)行保護(hù)
由此得出,雖然Docker Registry的安裝部署和使用起來非常方便,但是直接使用Docker Registry身份認(rèn)證服務(wù)的默認(rèn)配置并不安全。而且由于Docker Registry沒有前端界面,缺少Harbor中直觀的用戶認(rèn)證與配置方式,導(dǎo)致用戶在使用Docker Registry時,不安全配置的可能性較大。
筆者建議在使用Docker Registry進(jìn)行私人鏡像管理時,應(yīng)首先開啟其認(rèn)證機(jī)制后再進(jìn)行鏡像的傳輸,從而避免鏡像信息的泄露。
五. 總結(jié)
本篇文章主要介紹和分析了公共鏡像倉庫Docker Hub中鏡像和敏感信息泄露情況,以及Harbor、Docker Registry兩個私有鏡像倉庫中鏡像和敏感信息的泄露風(fēng)險(xiǎn)。
近年來云上數(shù)據(jù)泄露事件屢見不鮮,公有鏡像倉庫泄露大量密鑰已是事實(shí),私有鏡像倉庫的安全風(fēng)險(xiǎn)依然存在,因此,建議大家在使用鏡像倉庫過程中密切關(guān)注其安全性,并且采取必要的措施以保護(hù)敏感信息和數(shù)據(jù)的安全,在構(gòu)建鏡像時,避免直接將密鑰設(shè)置在環(huán)境變量中,避免在鏡像中直接添加包含源代碼、敏感配置信息等。
參考文獻(xiàn)
[1] Thousands of images on Docker Hub leak auth secrets, private keys (bleepingcomputer.com)https://www.bleepingcomputer.com/news/security/thousands-of-images-on-docker-hub-leak-auth-secrets-private-keys/
[2] https://search.censys.io/
[3] https://www.docker.com/pricing/
[4] 云原生服務(wù)風(fēng)險(xiǎn)測繪分析(二):Harbor – 綠盟科技技術(shù)博客 (nsfocus.net)
[5] https://nvd.nist.gov/vuln/detail/CVE-2022-46463
[6] https://docs.docker.com/registry/
來源:綠盟科技研究通訊