漏洞攻擊
Jenkins Args4j CVE-2024-23897:檔案暴露在外,密碼陷入危險
全球熱門的開放原始碼自動化伺服器 Jenkins 被發現了一個檔案讀取漏洞,也就是 CVE-2024-23897。
Jenkins 這套熱門的開放原始碼自動化伺服器,被發現了一個代號為 CVE-2024-23897 的檔案讀取漏洞。Jenkins 使用了一個內建的指令列介面 (Command-Line Interface,簡稱 CLI) 來輔助來自腳本或指令列環境的互動,該介面使用了 args4j 函式庫來處理 CLI 指令,用於解析 Jenkins 控制器的指令列參數與選項。而漏洞就存在於這個函式庫內,可能讓未認證使用者讀取檔案系統內任何檔案的前幾行。不僅如此,已認證使用者還可進一步讀取整個檔案。
有鑑於該漏洞的高嚴重性,我們強烈建議盡快採取行動來保障 Jenkins 安裝環境的安全。
- 功能:expandAtFiles
- 說明:這個指令解析器會自動將用來指定檔案路徑參數的「@」前導字元替換成該檔案的內容。
- 預設啟用:是
- 受影響的版本:Jenkins 2.441 與更早版本、LTS 2.426.2 與更早版本。
- 說明:駭客可讀取 Jenkins 控制器檔案系統上的任意檔案,字元編碼則採用 Jenkins 控制器處理程序預設的字元編碼。
- 權限衝擊:擁有整體/讀取 (Overall/Read) 權限的駭客可讀取整個檔案,沒有整體/讀取權限的駭客則可讀取檔案的前幾行。可讀取的確切行數視使用的 CLI 指令而定。
- 非營利資安機構 ShadowServer 已發現有超過 45,000 個尚未修補的 Jenkins 執行個體受到影響。
- ShadowServer 儀表板
除了讀取檔案之外:從遠端執行程式碼的可能性
圖 1 顯示可「讀取任意檔案」的問題所衍生出的一些可能性,其中包括了「從遠端執行程式碼」(RCE)。關於這點,請參閱 Jenkins 公告網頁以獲得更多資訊。
近期攻擊
趨勢科技在分析過程中發現了多個來自不同地區的攻擊案例,根據 Shadowserver 的資料顯示,其中絕大多數的來源 IP 位址都位於荷蘭。此外,大部分攻擊的目標都位於南非 (圖 3)。
我們觀察到的攻擊事件大多使用概念驗證 (POC) 掃描器。此外,我們也發現有人在積極買賣從遠端執行程式碼的漏洞攻擊手法,更確切地說,我們發現有人在銷售可讓攻擊者未經授權就能從遠端執行程式碼的 CVE-2024-23897 漏洞攻擊手法 (不過這些所謂的漏洞攻擊手法有可能是捏造的)。
漏洞分析
CVE-2024-23897 漏洞可經由 HTTP、WebSocket 和 Secure Shell (SSH) 來發動攻擊,前兩者的成功率最高。
HTTP 端點預設需要發送兩次 POST 請求。第一次要發送「上傳」請求以及相關的指令和參數,第二次則是發送「下載」請求,用來執行前述指令並取得輸出結果。
在收到任何一個請求時,接收端會依序呼叫以下方法:
CliCrumbExecution 方法負責執行端點驗證,FullDuplexHttpService 方法負責處理請求並傳送回應 (請注意,此處使用 PlainCLIProtocol 來發送請求)。最後,使用 CmdLineParser 方法 (此方法會用到含有漏洞的 args4j 函式庫) 來解析 CLI 輸入參數。
Jenkins PlainCLIProtocol
Jenkins PlainCLIprotcol 是一個 Java 類別,它使用了一種特殊的二進位格式,由不同的操作代碼 (opcode) 和一系列訊框 (frame) 所組成。
每個操作代碼都有一個名為「clientSide」的布林值屬性,代表這是從用戶端發送到伺服器 (true) 或是從伺服器發送至用戶端 (false)。這些操作代碼用於指定用戶端與伺服器在 CLI 通訊協定當中能夠交換的各種不同操作。
Jenkins 二進位格式
Jenkins 使用一種以一系列訊框為基礎的特殊二進位格式。圖 8 顯示 Jenkins 的二進位格式 (由 Alex Williams 提供):
在這通訊協定的二進位格式當中,每一個訊框前面都有一個整數代表訊息長度,然後緊接著是一個位元組的操作代碼,最後是實際的資料。
以下說明使用此二進位格式的一個訊息當中的各個資料欄位:
長度欄位 (4 個位元組):此欄位代表訊息的長度,不含長度欄位本身與操作代碼。這是一個經過編碼的 32 位元帶正負號整數,採用網路位元組順序 (big-endian)。
操作代碼欄位 (1 個位元組):這是訊息的操作代碼 (opcode)。
資料欄位:這是前項操作代碼所需的實際資料。
含有漏洞的程式碼
含有漏洞的程式碼存在於 Args4j 函式庫當中。
正常使用下的作用
正常來說,「@」字元在 Jenkins-cli 當中是用來指定一個包含 bearer token (持有者金鑰) 的檔案,或者從檔案取得 username:password (使用者名稱:密碼)。
使用已認證的指令來呼叫 Jenkins-cli 可產生以下輸出結果:
使用「@」字元在 -auth 參數中指定 password.txt 檔案會得到以下結果:
漏洞發生情境
直接傳入「@」來當作某個 Jenkins-cli 指令的參數,就會產生如圖 13 的錯誤訊息。
如圖片中看到的,錯誤訊息當中暴露了一些資料,因為「version」這個指令並不需要任何參數 (註:所以後方的「@/etc/passwd」參數是多餘,也因此會觸發漏洞)。
資訊暴露的多寡隨指令所需的參數而定,例如,如果參數需要指定一份清單作為輸入,就有可能暴露更多的資料:
$ java -jar jenkins-cli.jar -s http://172.17.0[.]1:8080/ -auth admin:pass reload-job @/etc/passwd
我們最近在研究時發現 reload-job 可用來替代常用的 connect-node 作為讀取多行內容的指令。
其他可用的指令還有 delete-job、delete-node、disconnect-node、offline-node 以及 online-node。
其他攻擊途徑:未認證使用者
指令 | 詳細說明 |
---|---|
help | 將工作加入檢視當中。 |
who-am-i | 回報登入憑證和權限。 |
restart | 重新啟動 Jenkins。 |
shutdown | 立即關閉 Jenkins 伺服器。 |
enable-job | 啟用一個工作。 |
表 1:未認證使用者可用的其他攻擊途徑。
其他攻擊途徑:認證使用者
指令 | 詳細說明 |
---|---|
add-job-to-view | 將工作加入檢視當中。 |
build | 建構一個工作,可選擇是否要等候工作完成。 |
cancel-quiet-down | 取消 quiet-down 指令的效果。 |
clear-queue | 清除建構 (build) 佇列。 |
connect-node | 重新連接節點。 |
console | 擷取某個建構 (build) 的主控台輸出。 |
copy-job | 複製一個工作。 |
create-credentials-by-xml | 透過 XML 來產生登入憑證。 |
create-credentials-domain-by-xml | 透過 XML 來產生登入憑證網域。 |
create-job | 從 stdin 讀取組態設定 XML 檔案來建立一個新的工作。 |
表 2:認證使用者的其他攻擊途徑。
經由 Windows 發送攻擊請求
在此攻擊情境下,也就是從 Windows 電腦發送一個請求到一台 Jenkins Linux 伺服器,我們可以看到其編碼方式將辨識為 windows-1252。
經由 Linux 發送攻擊請求
如果是從 Linux 電腦發送請求到 Jenkins Linux 伺服器,那麼看到的編碼方式就是 UTF-8。
經由 WebSocket 發送攻擊請求
使用 WebSocket 發送的攻擊請求會遮蔽資料,結果就是使用者的輸入看不到。
結論
Jenkins 已在 2.442 版以及 LTS 2.426.3 當中修正了 CVE-2024-23897 漏洞,將出問題的指令解析器停用。強烈建議使用者應盡速套用此次更新,以避免任何潛在的資安事件發生。
趨勢科技解決方案
以下是趨勢科技客戶可用來偵測及防範 CVE-2024-23897 漏洞的趨勢科技防護:
Trend Vision One Endpoint Security、Trend Cloud One - Workload and Endpoint Security、Deep Security 與 Vulnerability Protection IPS 規則
- 1011966 - Jenkins Arbitrary File Read Vulnerability Over HTTP (CVE-2024-23897)
- 1011976 - Jenkins Arbitrary File Read Vulnerability Over WebSocket (CVE-2024-23897)
Trend Micro Cloud One - Network Security 與 TippingPoint 過濾規則
- 43766: HTTP: Jenkins CI Server Arbitrary File Read Vulnerability
Trend Vision One Network Sensor 與 Trend Micro Deep Discovery Inspector (DDI) 規則
- 4997 - CVE-2024-23897 - Jenkins Authentication Bypass Exploit - HTTP (Request)