藏在純文字檔的Jenkins外掛漏洞

Jenkins是一套被廣泛使用的開源自動化伺服器,讓 DevOps 開發人員可以有效率且可靠地建構、測試和部署軟體。為了讓 Jenkins 的模組化架構發揮最大作用,開發人員會用外掛程式來擴充核心功能,好擴展建構時的腳本功能。在本文撰寫時,Jenkins的外掛程式索引裡有超過1,600個社群貢獻的外掛程式。其中有些外掛程式會儲存未加密的純文字帳密。一旦發生資料外洩,網路犯罪分子就可能在組織不知情下取得這些資料。

Jenkins在7月11日8月7日發布了資安通報,其中就包括了用純文字儲存帳密的問題。我們會在本文裡討論此漏洞會怎麼被利用以及受到影響的外掛程式:

CVE編號 外掛程式名稱 更新版本備註
CVE-2019-10348 Gogs Gogs外掛程式版本1.0.15
CVE-2019-10350 Port Allocator 當前版本可能不安全。外掛程式可以使用。主動安全警告:用純文字格式儲存帳密
CVE-2019-10351 Caliper CI 主動安全警告:用純文字格式儲存帳密
CVE-2019-10378 TestLink 目前版本跟舊版本可能都不安全。主動安全警告:用純文字格式儲存帳密
CVE-2019-10385 eggPlant 外掛程式已停用

表1. Jenkins外掛程式出現的洩密漏洞

要注意的是,直到本文撰寫時,Port Allocator、TestLink和Caliper CI外掛程式的漏洞都尚未修復。eggPlant外掛程式的現今版本已被停用且不安全。

取得儲存的帳密

Jenkins外掛程式的漏洞可被用來竊取敏感的使用者帳密。當有延伸讀取權限或能存取主檔案系統的使用者帳密外洩,攻擊者就能夠存取其他整合的服務 – 特別是當使用者在不同平台或服務使用相同的密碼時。

外掛程式設定通常用XML檔案格式儲存在$JENKINS_HOME根目錄內,該檔案定義了每個外掛程式都必需的結構和設置。在其他時候,外掛程式設定會儲存成作業設定的一部分,如$JENKINS_HOME/jobs/new-job/config.xml。如果帳密是外掛程式設定的一部分,它們應該被加密儲存,但Gogs、Port Allocator、Caliper CI、TestLink和eggPlant等外掛程式並非這樣做。

它們以未加密的純文字格式儲存帳密:

A screenshot of a social media postDescription automatically generated

圖1. 純文字儲存的API token

儲存帳密的正確方法是用第三方帳密程式,就像是Credentials外掛程式,然後透過設定檔內credentialsId參照。根據規模和其他需求,也可以使用Secret(也是加密儲存)來儲存帳密。

可以讀取設定檔的使用者只會看到參照用的credentialsId。實際帳密儲存在別的地方。

A screenshot of a cell phoneDescription automatically generated

圖2. credentialsID參照

預設建議外掛列表內的Credentials外掛程式被用來儲存加密帳密。以下描述了帳密儲存詳細資訊。

A screenshot of a cell phoneDescription automatically generated

圖3. 使用Jenkins Credentials參照儲存帳密

此外掛程式將加密過的帳密儲存在$JENKINS_HOME/credentials.xml

A screenshot of a social media postDescription automatically generated

圖4. 加密帳密儲存的範例

在上面的範例中,密碼用base64編碼儲存在大括號內,base64是用來編碼二進位資料好在只處理文字資料的平台上進行編碼、儲存和傳輸)。我們使用base64解碼器後可以看到有某些無法列印的字元被編碼。

實際上,加密過的密碼及後設資料被一起用base64進行編碼。

解密用的金鑰被寫入每個Jenkins instance。好消息是每次安裝Jenkins都會有不同的金鑰。金鑰被加密儲存在$JENKINS_HOME/secrets/hudson.util.Secret。沒有單一主金鑰可以打開所有instance。hudson.util.Secret檔案是用主金鑰產生的金鑰以AES加密 – 也是每次安裝Jenkins都不同。

所以很重要的是必須保護好$JENKINS_HOME/secrets目錄不被任意存取,才不會讓儲存的帳密暴露出來。在主節點上執行作業或建置導致的活動可能會影響到Jenkins整體的安全性,如安裝外掛程式、建立新作業及讀取和取得帳密與其他私密資料。在主節點上運行的作業還會讓較低權限的使用者帳戶取得管理員權限,讓它可以用shell命令印出所有密碼檔。

安全建議

用純文字格式儲存帳密會對組織造成直接的威脅。同時管理員還必須記得,有權限存取 $JENKINS_HOME/secrets目錄的使用者也可以存取儲存的帳密。$JENKINS_HOME/hudson.util.Secret$JENKINS_HOME/secrets/master.key是用來解密儲存的密碼,如果洩露會導致儲存的密碼被解密。

跟任何的DevOps工具一樣,Jenkins應該要考慮到安全性。Jenkins預設並不會執行安全檢查。因此,Jenkins建議使用者要遵循最佳實作,包括對使用者進行身份認證、要求存取控制,不要在主節點上建置成更大的系統。如果必須在主節點上執行作業,Jenkins建議使用Job Restrictions外掛程式,可以根據使用者權限來限制作業執行或節點設定。

企業可以利用趨勢科技的DevOps安全解決方案,透過API將安全性融入開發流程,進而改善開發週期並減少人為接觸和錯誤。這樣的安全解決方案還可以透過快速得到安全回饋來減少開發時程和工作流中斷,並且保護映像檔、容器和主機。

@原文出處:Hiding in Plain Text: Jenkins Plugin Vulnerabilities 作者:David Fiser(資深網路威脅研究員)