CVE-2022-43781漏洞介绍
Atlassian Bitbucket Server和Atlassian Bitbucket Data Center都是澳大利亚Atlassian公司的产品。Atlassian Bitbucket Server是一款Git代码托管解决方案。该方案能够管理并审查代码,具有差异视图、JIRA集成和构建集成等功能。Atlassian Bitbucket Data Center是Atlassian Bitbucket的数据中心版本。
Atlassian Bitbucket Server和Bitbucket Data Center存在安全漏洞,该漏洞源于具有用户名控制权限的攻击者可以通过环境变量实现命令注入导致在系统上执行任意代码。
CVE-2022-43781漏洞原理分析
在这个漏洞中,NuProcessBuilder的实现逻辑被用来执行有缺陷的处理,这与之前的CVE-2022-36804漏洞有着显著的相似性。关键点在于,创建进程时所使用的环境变量和命令参数是通过一个数组复制的,而数组的分隔标志是NULL字符。CVE-2022-36804漏洞通过插入NULL字符来切断命令行参数,实现向Git参数中注入恶意代码,从而达到远程代码执行(RCE)。而在这次的漏洞中,同样采用了NULL字符截断的策略,不过是针对环境变量的截断,进而注入与Git相关的环境变量以实现RCE。
特别是在处理与repos相关的命令时,系统会调用Git命令。例如,在创建repos之前,需要先设置一系列相关的环境变量。这一过程主要发生在com.atlassian.bitbucket.internal.process.nu.NuNioProcessHelper
类的run
方法中,该方法负责调用applyConfigurers
方法,以应用配置并创建所需的进程参数。
在执行applyConfigurers
方法时,系统按顺序调用了两个主要配置器:DefaultNioProcessConfigurer
和RemoteUserNioProcessConfigurer
。这两个配置器共同作用于进程配置,每个承担着特定的设置和调整功能,以确保进程的正确初始化和执行。这种配置方法展现了系统在处理进程创建时的细致和层次化的管理策略。
主要重点关注第二个RemoteUserNioProcessConfigurer配置器,其configure方法如下
在此过程中,updateEnvironment
函数的主要职责是刷新环境变量,具体操作是捕获并存储当前的用户名。这个用户名随后被赋值给REMOTE_USER
变量,并嵌入环境变量之中。进而,在初始化执行Git命令的进程时,系统的环境映射中已经预设了当前用户的身份信息。
然后调用prepareEnvironment()将其转化为一个String数组.
在此系统中,根据操作系统的不同,会创建一个LinuxProcess
对象,并随后调用其run
方法。在开始实际执行(call)之前,系统会进行一项重要的预处理步骤,即prepareProcess
,用于设定进程的相关属性。这个步骤涵盖了环境变量数组的传入。特别值得注意的是,系统在这一环节使用toEnvironmentBlock()
方法,将字符串数组(String array)转换为字节数组(byte array),这是整个过程中的一个关键转换点。
在处理数组拷贝的过程中,系统采用了System.arraycopy
方法,这里的关键是以NULL字符作为数组元素之间的分隔符。这正是CVE-2022-36804漏洞利用的关键点。在此环境中,可控制的变量是用户名。若在用户名中插入NULL字符,那么在数组拷贝完成后,得到的环境变量数组中会额外出现一个注入的变量。例如,使用用户名poc%00a=c
进行测试,可以观察到在拷贝后的字节数组中,REMOTE_USER
变量后会新增一个a=c
的键值对。这种方法揭示了在环境变量设置过程中潜在的安全风险。
现在能注入执行Git命令的环境变量之后则还需要找到一个可以利用的git环境变量,从Git的文档中对各个环境变量有说明文档,其中GIT_EXTERNAL_DIFF环境变量的说明如下
当该环境变量被设置时,只要执行git diff命令则Git还会去调用该环境变量指定的程序. 所以最后的利用思路就很简单了,注入GIT_EXTERNAL_DIFF环境变量,执行diff操作,触发cmd.exe或者bash等执行命令即可.