Jenkins Git client插件RCE漏洞CVE-2019-10392复现示例分析
Jenkins是一款流行的自动化构建工具,拥有庞大的插件生态系统。其中Git client插件是Jenkins上主流的Git集成插件,能够管理Git库并支持分支、标签等功能。2019年4月,Git client插件曝出了一处严重的远程代码执行漏洞(CVE-2019-10392),恶意攻击者可以通过构造恶意的GIT仓库地址来向Jenkins服务发送恶意代码,并实现RCE攻击。本文将会分析该漏洞的复现过程和攻击原理。
漏洞复现
首先,我们需要在一台Jenkins环境的机器上安装Git client插件。插件安装完成之后,我们可以在Jenkins界面上看到Git client插件的安装路径和版本号:
接下来,我们需要准备一份恶意的Git仓库,利用“remote”参数向Jenkins发送恶意代码。我们可以利用“python -m http.server”启动本地HTTP服务,并将恶意的Git仓库放置在该目录下。在恶意的Git仓库中,创建一个空白的“hooks”目录,并在该目录下放置我们准备好的“post-checkout”脚本。脚本内容如下:
#!/bin/bash
touch /tmp/success
脚本的功能非常简单,当用户拉取该Git仓库时,脚本会自动向/tmp目录下写入一个名为“success”的文件。
接下来我们就可以构造恶意的GIT仓库URL并HACKING了。Jenkins Git client插件在处理Git仓库的地址时,不会对URL进行正确的输入检查,我们可以构造一个带有“;”,“&”等特殊字符的URL请求来触发代码执行。URL 的格式如下:
git://[正在运行的Jenkins的IP]/test.git;[命令输入]
在其中,[正在运行的Jenkins的IP]是当前Jenkins运行环境的IP地址,[命令输入]是该漏洞的攻击命令。
例如,我们可以构造以下的漏洞攻击Payload(请注意,以下攻击Payload仅供学习和测试使用,请勿用于非法用途):
git://127.0.0.1/test.git;touch /tmp/hack_success
上述Payload会在/tmp目录下写入一个名为hack_success的文件,如果我们可以在Jenkins环境中看到该文件,则说明我们成功利用该漏洞实现了RCE攻击。
漏洞原理分析
Jenkins Git client插件漏洞的原因在于,该插件在解析Git仓库地址时,将该地址通过Java的Runtime.getRuntime().exec()函数执行,但是未对该仓库地址进行充分的验证和过滤,导致攻击者能够通过构造恶意的Git仓库地址向Jenkins内部发送恶意代码。
具体来说,当用户向Jenkins提交一个带有恶意代码的Git仓库请求时,Jenkins Git client插件的GitClient类会进行对该Git仓库地址的处理,在经过必要的反序列化和参数解析后,GitClient会将Git仓库地址传递给CliGitAPIImpl类的使用,CliGitAPIImpl类进而通过JGit库中的Git类执行命令。
由于Git接口的设计,JGit库中的Git类会将Git仓库的URL作为参数通过exec()函数执行,而exec()函数中的参数是字符串类型,因此如果恶意的Git仓库地址中出现了特殊字符如“;”,“&”等,则这些字符会被视为命令分隔符,而后面的命令就会被作为单独一条命令执行。这样一来,攻击者就可以通过构造恶意的Git仓库地址,在不需要任何授权的情况下向Jenkins内部发送任意命令,并实现RCE攻击。
漏洞修复
Jenkins Git client插件的漏洞修复版本为2.8.4及以上,修复方案是在Git client插件提交时增强对Git仓库地址中特殊字符的过滤机制,增强对数据校验的精度和深度,从而避免恶意的Git仓库地址对Jenkins内部造成威胁。
结尾
Jenkins Git client插件漏洞CVE-2019-10392是一处常见的远程代码执行漏洞,攻击者可以通过对恶意Git仓库地址的构造,向Jenkins内部发送任意命令,并在不需要授权的情况下实现RCE攻击。在使用Jenkins时,需要注意安装Jenkins Git client插件后可以向所有Git仓库发送任何恶意代码,因此需要加强对Git仓库地址的过滤和校验,避免该漏洞给我们带来不必要的风险。
