這個主題就相對單純,主要是針對容器鏡像做安全檢測。那之前也提過容器鏡像實際上就是一個檔案系統,裡面由檔案所組成,而這些檔案包含了作業系統套件、應用程式及套件等等。這部分的檢測只需掃描檔案系統就足夠,因此不需要將它以容器方式啟動,故算是靜態掃描的方式。
而這些檔案的安全性又分為兩類,一類是已知漏洞,這部分可以參考Day1 - 甚麼是漏洞? 談談我們與漏洞的距離吧。。可以把這些漏洞想成是因為開發者不小心做出可被利用的漏洞,常見的漏洞資料庫像是 CVE (Common Vulnerabilities and Exposures) 是一個公開的漏洞資料庫,該漏洞資料庫也會關聯到受影響的產品名稱與版本。也因此假如能夠取得容器鏡像內的軟體清單與版本,並與現有 CVE 漏洞資料庫做比對就可以得知目前容器鏡像整體的安全狀況。
另一類檔案的安全性則是惡意程式,可以參考Wiki - Malware 的資訊。惡意程式就是駭客事先撰寫好具有惡意的程式並塞入容器鏡像內,那因為惡意程式的部分我沒甚麼研究,所以之前有提過可以參考 Dagda 這個開源專案,裡面有提到 "Dagda uses ClamAV as antivirus engine for detecting trojans, viruses, malware & other malicious threats included within the docker images/containers."。
不過幾個值得注意的觀念提醒一下 :
這邊以掃描鏡像中的已知漏洞為主,這部分又分為兩種方式。第一個是產生所謂的軟體物料清單 SBOM (Software Bill of Materials),之後再對該份清單檔案進行掃描。SBOM 的相關資料可以參考鐵人賽文章 Day 29 - 軟體物料清單,交付的格式有Software package data exchange (SPDX)、CycloneDX (CDX)。第二個方式很單純則是透過軟體直接對鏡像檔案做掃描。
這邊就以 Trivy 作為掃描工具,它可以支援的對象包含 Container Image、Kubernetes,並且可以找出的弱點包含 SBOM、CVE、錯誤設定。安裝 Trivy 步驟如官網所示 :
sudo apt-get install wget apt-transport-https gnupg lsb-release ;
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | gpg --dearmor | sudo tee /usr/share/keyrings/trivy.gpg > /dev/null ;
echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list ;
sudo apt-get update ;
sudo apt-get install -y trivy ;
#試著掃描一下之前建立的 image 檔案
trivy image aeifkz/ithome_ctf:v1.0 ;
很快地就會發現有個問題,就是顯示出來的結果不夠人性化。這部分可以參考 Scanning Docker Images for Vulnerabilities: Using Trivy for Effective Security Analysis 裡面提到透過他們制定好的樣板去輸出掃描結果。
# 樣板的資料在 https://github.com/aquasecurity/trivy/blob/main/contrib/html.tpl
trivy image aeifkz/ithome_ctf:v1.0 --format template --template "@html.tpl" -o ithome_ctf.html ;
# 試著對 Distroless Container 掃描看看
trivy image gcr.io/distroless/python3 --format template --template "@html.tpl" -o distroless.html ;
雖然樣板輸出的結果是比較方便觀看,但對於管理起來並不方便。那些產品是相同的可以合併在同一格,以及最高要升版到多少等等,其實還是有很多改進的空間。
也可以針對容器產生 SBOM 清單,並且針對 SBOM 清單進行掃描,相關使用參考如下。
trivy image --format cyclonedx --output ithome_ctf.json aeifkz/ithome_ctf:v1.0 ;
# 透過 trivy sbom 指令對 SBOM 檔案進行掃描
trivy sbom ithome_ctf.json --format template --template "@html.tpl" -o ithome_ctf_sbom.html ;
因為 trivy 是針對容器鏡像內的已知漏洞做掃描,所以主要是防禦容器開放出來的服務做安全強化,所以針對前面所介紹的攻擊沒一個防得住的,因為前面的攻擊主要是針對容器啟動設定不當所導致的。
攻擊手法 | 鏡像掃描能否阻擋? |
---|---|
privileged + host pid | N |
--cap-add=ALL + host pid | N |
privileged | N |
(CVE-2022-0492) unshare + cgroup 特權逃逸手法 | N |
安裝 linux_module | N |
docker.sock 掛載 | N |
但話說回來究竟鏡像安全是否重要呢? 參考 Mitre ATT&CK Containers Matrix 的 Initial Access 階段的 Exploit Public-Facing Application 可以看出開放的應用程式會是一個需要進行防禦的點,而且它又位於整個攻擊行為的初期階段,所以有辦法進行防禦的話就能夠有效地阻斷攻擊鏈。但...畢竟也只是針對已知漏洞進行防禦,所以面對 0-day 的漏洞攻擊就沒有辦法了,也因此會需要後面其他的防禦機制進行資安強化。
作業13 : 假如今天資安策略是我只想要掃描容器內部跟應用程式有關的部分,那以 trivy 目前支援的方式是沒有辦法達到的。請各位利用Anchore Open Source Tools 裡面的 Syft 工具去產生一個應用程式的 SBOM 檔案,然後再透過 trivy 去進行掃描。
今日總結 :
本日回顧 :
次日預告 :