导语:我们发现,Java Usage Tracker中的设计缺陷/弱点可以让黑客创建任意文件,注入攻击者指定的参数并提升本地特权。
我们发现,Java Usage Tracker中的设计缺陷/弱点可以让黑客创建任意文件,注入攻击者指定的参数并提升本地特权。反过来,这些可以链接起来并用于升级权限,以便访问受影响系统中的资源,这些资源通常受到保护或限制给其他应用程序或用户。
我们通过Zero Day Initiative与Oracle合作修补了这个漏洞,这已经通过Oracle 10月的补丁更新得到了解决。因此,必须敦促用户和企业修补和更新他们的Java版本。
在这篇文章中,我们将深入研究这个缺陷如何在Windows上运行,Java Usage Tracke又是如何工作的,以及如何定义启用漏洞的条件。
Java Usage Tracker
Java有一个名为Java Usage Tracker的功能,可以跟踪它在系统中的使用方式。Java Usage Tracker具有以下功能:
· 有关Java虚拟机(JVM)的日志信息启动配置参数。
· 将数据转储到日志文件中或将其重定向到UDP服务器。
· 允许在Usage Tracker配置中指定自定义属性的日志值。
Java Usage Tracker使用名为usagetracker.properties的配置文件,该文件具有全局默认位置,具体取决于操作系统(OS)。例如,Windows的默认路径是:%ProgramData%\Oracle\Java\。全局默认路径中的usagetracker文件将跟踪系统中启动的所有JVM的使用情况。
下图显示了usagetracker.properties的示例:
图1:显示usagetracker.properties示例的快照
如图1中的第9行所示,Java Usage Tracker会将信息记录到文件global_javatracker.log中。以安装Apache Tomcat(基于Java的开源工具)为例,建立一个系统。重新启动服务后,会创建文件global_javatracker.log并附加Java使用情况跟踪数据。每次Tomcat服务启动时,新的跟踪信息都会附加到文件的末尾。
下图显示了跟踪数据的示例。请注意如何使用逗号分隔,如属性文件(分隔符配置)中所述。
图2:快照显示如何将跟踪数据附加到Tomcat中的global_javatracker.log
用户控制的参数
文件 usagetracker.properties有两个有趣的属性来控制Java Usage Tracker的行为:
· oracle.usagetracker.logToFile
· oracle.usagetracker.additionalProperties
该logTofile属性允许用户选择系统中的任意日志文件的路径。务必引起注意的是,日志文件是由受监视的JVM创建的。如果JVM运行具有高级权限,那么JVM就能够在系统的任何部分创建该文件,文件的扩展名也不受控制(也就是说,可以创建名为global_javatracker.bat的日志文件)。
即使logToFile路径可以任意设置,也无法控制文件内容,因为JVM只会从现有的非受控数据中写入值。但是,Java Usage Tracker具有从自定义属性获取值的特殊功能。additionalProperties支持包含要跟踪的任意和其他自定义属性。下图显示了一个示例:
图3:快照显示如何通过additionalProperties添加自定义属性
图4:显示重新启动Tomcat服务后如何跟踪数据的代码段
如图4所示,该行的末尾附加了一个带有null值的已配置跟踪属性com.anotherInterestingProperty = null。属性值为null,表示该属性不存在。
有两种方法可以控制Java Usage Tracker的行为:设置任意日志路径,以及设置任意自定义属性。这种组合似乎是不可利用的,但当它与其他安全漏洞或弱点结合使用时,它可以被利用。
利用自定义属性
以下是一个示例,说明如何利用自定义属性。如图5所示,第9行中的前配置文件将强制Java Usage Tracker创建.bat文件,然后添加自定义属性: ping 172.0.1.1>。相应的生成文件是global_javatracker.bat,如图5所示。
图5:显示global_javatracker.bat中自定义属性的快照
图6:显示正在执行的global_javatracker.bat的屏幕截图
请注意附加属性ping 172.0.1.1> = null。如果执行批处理文件global_javatracker.bat,它将显示错误消息:“ VM start”无法识别。发生此错误的原因是Java Usage Tracker的属性文件仅生成一行,由配置(逗号分隔符)com.oracle.usagetracker.separator =,设置。
将分隔符更改为“新行”会生成不同的跟踪日志(图8)。
图7:带有“新行”分隔符的Java Usage Tracker(突出显示)
图8:使用新行分隔符后生成的跟踪日志
图8显示了新行中的所有值,最后一行包含ping 172.0.1.1> = null。运行global_javatracker.bat将导致执行ping 172.0.1.1> = null,但由于双引号,该命令无法识别。但是,也是有机会执行它的,因为围绕每个属性值的双引号可以由另一个配置控制:com.oracle.usagetracker.quote =“。
例如,让我们创建一个空的com.oracle.usagetracker.quote配置,如图9所示。
图9:显示具有空配置的com.oracle.usagetracker.quote的快照
图10:使用空配置从com.oracle.usagetracker.quote生成的跟踪日志
运行global_javatracker.bat将执行命令ping 172.0.1.1> = null。如图10中命令提示符(cmd)图像的末尾所示,创建了一个“null”文件。
到这个阶段,Java Usage Tracker可以实现:
· 可以随意在文件系统中的任意位置创建文件。
· 可以随意创建文本脚本文件。该示例使用批处理文件,但它也可用于创建其他文件类型。
· 可以用来注入任意命令(或与脚本文件相关的任何其他文本)。
上述组合以及脚本文件可以在系统中的任何地方执行/创建,但是,要成功的利用它,则有以下条件:
· 应在关键位置创建恶意文件(即自动启动脚本)。
· 要访问关键位置,具有高权限的进程应创建恶意文件。
这两个条件实际上都可以实现。例如,可以为非特权用户创建Java Usage Tracker的配置(usagetracker.properties),并且为具有更高特权的进程创建恶意日志文件(usage tracker日志)。
Java Usage Tracker日志文件创建
当驻留在全局配置路径中(即Windows中的%ProgramData%\Oracle\Java)时,将在系统中启动JVM时读取Java Usage Tracker日志文件。我们再以默认的Tomcat安装为例,安装Tomcat并使用全局usagetracker.properties后,将在重新启动Tomcat后创建跟踪器日志(图11)。
如图12所示,该文件由Tomcat服务创建,默认情况下作为System运行。由于Tomcat服务作为System运行,因此可以在任意位置创建恶意文件global_javatracker.bat。但是,配置文件usagetracker.properties必须由非特权用户创建。
图11:安装Tomcat后创建的跟踪器日志
图12:显示Tomcat创建的日志文件的快照(突出显示)
本地权限升级
Java Usage Tracker的全局配置文件是在默认路径%ProgramData%\Oracle\Java\中创建的。此位置和初始内容是在Java安装期间创建的,但也是在执行Java命令时创建的——比如说java -c。
默认权限%ProgramData%允许系统的“用户”创建文件。创建Oracle/Java路径时,将继承默认权限。
图13显示了%ProgramData%\Oracle\Java\的权限,这可能是自从创建Java使用跟踪程序以来,影响Java版本最多的。
图13:显示为%ProgramData%\Oracle\Java\授予的权限的屏幕截图
举个例子,具有低权限的用户可以创建恶意配置文件usagetracker.properties,Tomcat服务器可以在系统的任何位置创建批处理文件,因为它以“系统”权限运行。批处理文件可以包括写入启动脚本的位置等例程。
结论
综上所述,可以通过多种方式使用Java Usage Tracker功能来升级权限。我们的研究仅在Microsoft Windows环境中进行了测试,但在其他系统上也有可能会很容易受到攻击。
导致权限升级的攻击可能会使用一系列弱设计漏洞,这些缺陷可被视为不同的漏洞:
· 任意文件类型创建:这可以通过 oracle.usagetracker.logToFile路径完成。例如,可以像批处理文件一样创建可编写脚本的文件。
· 参数注入:这可以通过 oracle.usagetracker.additionalProperties配置来执行。
· 本地特权提升:这可以通过%ProgramData%/Oracle/Java中的弱权限来完成。