Windows Java Usage Tracker本地提權漏洞分析(CVE-2018-3211)
前言
近期,我們發現了一個Java Usage Tracker中的設計缺陷,可導致攻擊者建立任意檔案,注入指定引數,並實現本地許可權提升。反之,該漏洞可以用於許可權提升,從而使攻擊者可以訪問受漏洞影響系統中的資源,這些資源通常受到保護,或僅限於特定應用程式或使用者才有權訪問。
我們通過Zero Day Initiative,與Oracle合作修復了這一漏洞,該漏洞已經在Oracle的2018年10月更新中實現修復。因此,需要敦促個人使用者及企業儘快更新他們的Java版本。
在本文中,我們將深入研究這一漏洞在Windows上的出現原因、Java Usage Tracker的工作原理以及實現漏洞利用所必要的條件。
Oracle安全更新公告: ofollow" rel="nofollow,noindex" target="_blank">https://www.oracle.com/technetwork/security-advisory/cpuoct2018-4428296.html 。
Java Usage Tracker
在Java中,有一個名為JavaUsage Tracker的功能,用於跟蹤系統中Java的使用方式。Java Usage Tracker具有以下功能:
1、通過啟動配置引數,記錄有關Java虛擬機器(JVM)的日誌資訊。 2、將資料轉儲到日誌檔案中,或將其重定向到UDP伺服器。 3、允許Usage Tracker配置中指定自定義屬性的日誌值。
Java Usage Tracker的配置檔名稱為usagetracker.properties。該檔案位於全域性預設位置,這一位置根據作業系統的不同而有所不同。例如,Windows的預設路徑是%ProgramData%\Oracle\Java\。全域性預設路徑中的usagetracker檔案將跟蹤系統中所有啟動的JVM的使用情況。
下圖展示了一個usagetracker.properties的樣例:
在上圖的第9行中,我們可以看到,JavaUsage Tracker會將日誌資訊記錄到檔案global_javatracker.log中。以安裝Apache Tomcat(基於Java的開源工具)的系統為例,重新啟動服務後,將建立檔案global_javatracker.log,並在其中寫入Java使用情況跟蹤資料。每次,在Tomcat服務啟動時,都會向該日誌檔案中寫入新的跟蹤資訊。
下圖是跟蹤資料的示例,請注意這裡是如何使用逗號分隔兩個不同值的,是在屬性檔案(分隔符配置)中定義。
使用者控制的引數
在檔案usagetracker.properties中,有兩個屬性控制Java Usage Tracker的行為,分別是:
oracle.usagetracker.logToFile oracle.usagetracker.additionalProperties
logTofile屬性允許使用者選擇系統中的任意路徑來儲存日誌檔案。需要注意的是,日誌檔案是由被監控的JVM建立的。如果JVM以提升後的許可權執行,那麼JVM就能夠在系統的任何地方建立該檔案,檔案的副檔名也不受控制(也就是說,可以建立名為global_javatracker.bat的日誌檔案)。
儘管logToFile路徑可以任意設定,但無法控制檔案內容。因為JVM只會從現有的資料(無法修改)中寫入值。然而,Java Usage Tracker具有從自定義屬性獲取值的特殊功能。 additionalProperties可以包含要跟蹤的任意和其他自定義屬性,如下所示。
如何通過additionalProperties新增自定義屬性:
重新啟動Tomcat服務後,如何跟蹤資料的程式碼段:
如上圖所示,該行的末尾附加了一個帶有null值的已配置跟蹤屬性com.anotherInterestingProperty= null。其值為null,表明該屬性不存在。有兩種方法可以控制Java Usage Tracker的行為:設定任意日誌路徑,或者設定任意自定義屬性。目前,這個功能似乎是不能被利用的,但是如果結合了其他安全漏洞,就能夠被攻擊者利用。
藉助自定義屬性實現漏洞利用
下面,我們詳細說明如何藉助自定義屬性實現漏洞利用。先前配置檔案中的第9行會使得Java Usage Tracker強制建立.bat檔案,然後新增自定義屬性ping 172.0.1.1 >。其生成了檔案global_javatracker.bat,如下圖所示。
global_javatracker.bat中自定義屬性:
global_javatracker.bat正在被執行:
在這裡,需要注意附加屬性ping 172.0.1.1 >= null。當我們執行批處理檔案global_javatracker.bat時,會顯示錯誤訊息“VM start”無法識別。發生此錯誤的原因在於,Java Usage Tracker的屬性檔案僅生成一行,並且其分隔符是根據配置中的com.oracle.usagetracker.separator=, 來決定的,使用了逗號作為分隔符。
那麼,如果將分隔符更改為“new line”(新的一行),將會生成完全不同的跟蹤日誌。
帶有“new line”分隔符的JavaUsage Tracker:
使用“new line”分隔符後,生成的跟蹤日誌:
上圖中的最後一行,包含ping 172.0.1.1 >= null。如果執行global_javatracker.bat,那麼就會導致執行ping172.0.1.1> = null命令。但是,由於帶有雙引號,所以該命令無法識別。但是,我們還有機會執行該命令,因為每個屬性值的雙引號,可以通過修改另一個配置com.oracle.usagetracker.quote =”來實現替換。
舉例來說,我們建立一個內容為空的com.oracle.usagetracker.quote配置,如下圖所示。
內容為空的com.oracle.usagetracker.quote:
使用空配置從com.oracle.usagetracker.quote生成的跟蹤日誌:
執行global_javatracker.bat,將會執行命令ping 172.0.1.1> = null。如上圖中命令提示符最後的提示所示,建立了一個“null”檔案。
至此,我們可以利用Java Usage Tracker實現以下操作:
1、 在檔案系統的任意位置建立檔案。 2、建立指令碼檔案,儘管我們在示例中建立了批處理檔案,但實際上也可用於建立其他型別的檔案。 3、注入任意命令(或與指令碼檔案相關的任何其他文字)。
攻擊者可以在系統的任意位置執行或建立上述內容,或可編寫指令碼的檔案。但是,如果攻擊者想要成功利用這個漏洞做一些事情,還需要兩個條件:
1、需要在關鍵位置(比如:自動啟動指令碼)中建立惡意檔案。 2、需要有權訪問關鍵位置,應該由高許可權的程序建立惡意檔案。
實際上,這兩個條件都可以實現。舉例來說,可以為非特權使用者建立Java UsageTracker配置(usagetracker.properties),具有更高特權的程序負責建立惡意日誌檔案(Usage Tracker日誌)。
建立Java Usage Tracker日誌檔案
如果儲存到全域性配置路徑中(例如Windows的%ProgramData%\Oracle\Java),在系統啟動JVM時,就會讀取Java Usage Tracker日誌檔案。接下來,我們再以預設Tomcat安裝為例。在安裝Tomcat,並使用全域性usagetracker.properties之後,跟蹤日誌會在Tomcat重新啟動後建立(如下圖所示)。實際上,該檔案是由Tomcat服務建立的,預設情況下會由System執行。
目前,Tomcat服務已經由System執行,因此就可以在任意位置建立惡意檔案global_javatracker.bat。但是,配置檔案usagetracker.properties還必須由非特權使用者建立。
安裝Tomcat後,建立的跟蹤日誌:
Tomcat建立的日誌檔案:
本地許可權提升
Java Usage Tracker的全域性配置檔案,都建立在預設路徑%ProgramData%\Oracle\Java\中。此路徑中的內容,一部分是在Java安裝期間建立的,也有一部分是在執行Java命令時建立的(例如java –c)。
預設情況下,%ProgramData%路徑只允許系統的“Users”建立檔案。當Oracle或Java路徑被建立時,也會繼承上級路徑的預設許可權。下圖是%ProgramData%\Oracle\Java\許可權的截圖:
我們舉例來進一步說明這個漏洞。具有低許可權的使用者,可以建立惡意配置檔案usagetracker.properties。由於Tomcat服務以“System”的許可權執行,因此它可以在系統的任何位置建立批處理檔案。在批處理檔案中,可以包括將指令碼寫入到啟動項位置之類的例程。
總結
目前,攻擊者可以通過多種方式,濫用Java Usage Tracker的功能來實現許可權提升。我們的研究僅在Windows環境中進行了測試,但其他作業系統也可能受到該漏洞的影響。
攻擊者為實現許可權提升,可能會組合利用一些漏洞,這些漏洞包括:
1、任意檔案型別建立:該漏洞可以通過oracle.usagetracker.logToFile路徑實現。例如,可以建立一些類似於批處理檔案的指令碼。
2、引數注入:通過oracle.usagetracker.additionalProperties配置來實現。
3、本地許可權提升:通過%ProgramData%/Oracle/Java中的弱許可權來實現。
參考連結
*本文作者:eridanus96,轉載請註明來自FreeBuf.COM