CVE-2017-12615 实战防御:5步加固Tomcat配置与WAF规则编写

CVE-2017-12615 实战防御:5步加固Tomcat配置与WAF规则编写

CVE-2017-12615 实战防御:5步加固Tomcat配置与WAF规则编写

Tomcat作为Java Web应用的核心容器,其安全性直接关系到业务系统的稳定运行。CVE-2017-12615漏洞暴露了不当配置可能导致的严重风险——攻击者通过精心构造的PUT请求可上传恶意JSP文件,进而获取服务器控制权。本文将提供一套从漏洞检测到彻底修复的完整解决方案,涵盖自动化检测脚本、WAF规则编写和系统加固清单。

1. 漏洞原理深度解析

该漏洞的本质是Tomcat默认Servlet配置缺陷与操作系统特性结合的产物。当同时满足以下两个条件时,漏洞即被触发:

  1. 配置缺陷conf/web.xml中DefaultServlet的readonly参数被显式设置为false
  2. 方法启用:服务器未禁用HTTP PUT方法

攻击者利用链条

  • 通过PUT请求上传文件时,Tomcat对文件名的处理存在逻辑缺陷
  • Windows系统的文件名解析特性(如::$DATA流、自动去除空格等)可绕过后缀检查
  • Linux系统可通过添加/字符绕过(如shell.jsp/

关键提示:即使业务系统不需要PUT/DELETE方法,Tomcat 7.x版本默认仍会响应这些请求,这是许多管理员容易忽视的风险点。

2. 自动化漏洞检测方案

2.1 快速检测脚本

以下Python脚本可批量扫描web.xml中的不安全配置:

#!/usr/bin/env python3 import os import xml.etree.ElementTree as ET def check_webxml(config_path): try: tree = ET.parse(config_path) root = tree.getroot() for servlet in root.findall('.//servlet'): if servlet.find('servlet-name').text == 'default': for init_param in servlet.findall('.//init-param'): if init_param.find('param-name').text == 'readonly': value = init_param.find('param-value').text.lower() if value == 'false': return True return False except Exception as e: print(f"检测异常: {str(e)}") return None if __name__ == '__main__': import sys if len(sys.argv) != 2: print("Usage: python scanner.py /path/to/tomcat/conf") sys.exit(1) webxml_path = os.path.join(sys.argv[1], 'web.xml') if not os.path.exists(webxml_path): print(f"错误: {webxml_path} 不存在") sys.exit(2) is_vulnerable = check_webxml(webxml_path) print(f"检测结果: {'存在风险配置' if is_vulnerable else '未发现风险配置'}")

2.2 检测指标说明

检测项安全值风险值修复优先级
readonly参数truefalse紧急
PUT方法状态禁用启用高危
Tomcat版本≥7.0.81≤7.0.79高危

3. 多层次防御体系构建

3.1 WAF规则配置(Nginx示例)

在Nginx配置中添加以下规则拦截恶意PUT请求:

location / { # 基础防护规则 if ($request_method ~* "(PUT|DELETE)") { return 405; } # 拦截异常JSP上传请求 if ($uri ~* "\.jsp($|/|\s|:|%20)") { return 403; } # 拦截Windows特性绕过尝试 if ($uri ~* "::$DATA") { return 403; } }

3.2 Apache ModSecurity规则

SecRule REQUEST_METHOD "^PUT$" "id:10001,phase:1,deny,msg:'Block PUT requests'" SecRule REQUEST_URI "\.jsp($|/|%20|:|\\$DATA)" "id:10002,phase:1,deny,msg:'Block JSP upload attempts'"

4. 五步加固检查清单

4.1 版本升级

# 查看当前版本 ./bin/version.sh # 升级步骤 1. 备份conf/、webapps/目录 2. 下载Tomcat 7.0.81+或8.5.x 3. 停止旧服务 → 替换文件 → 恢复配置 4. 验证新版本:http://localhost:8080/manager/status

4.2 配置修复

修改conf/web.xml确保包含:

<init-param> <param-name>readonly</param-name> <param-value>true</param-value> </init-param>

4.3 权限最小化

# 创建专用运行账户 useradd -r -s /bin/false tomcat_user chown -R tomcat_user:tomcat_user /opt/tomcat

4.4 网络层防护

# 使用iptables限制管理接口访问 iptables -A INPUT -p tcp --dport 8080 -s 192.168.1.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 8080 -j DROP

4.5 监控与审计

# 实时监控webapps目录变化 inotifywait -m -r -e create,modify /opt/tomcat/webapps/ | while read path action file; do echo "WARNING: File change detected - $path$file at $(date)" >> /var/log/tomcat_audit.log done

5. 应急响应指南

当发现可疑活动时,按以下流程处置:

  1. 立即隔离:断开受影响服务器网络
  2. 取证分析
    # 查找最近修改的JSP文件 find /opt/tomcat/webapps/ -name "*.jsp" -mtime -1 -ls # 检查访问日志中的PUT请求 grep -i "PUT" /opt/tomcat/logs/localhost_access_log.*
  3. 漏洞修复:执行前述加固措施
  4. 后门排查:使用工具检查常见Webshell特征
  5. 恢复上线:通过安全测试后重新接入服务

深度防御建议:结合SIEM系统对以下异常行为建立告警规则:

  • 短时间内大量405/403状态码
  • 包含特殊字符(如::$DATA)的URI请求
  • webapps目录下新增可执行文件