CVE-2019-11043 漏洞深度解析:从 Nginx 配置到 PHP-FPM 内存下溢的 3 个关键点
CVE-2019-11043 漏洞深度解析从 Nginx 配置到 PHP-FPM 内存下溢的 3 个关键点在当今的Web应用安全领域PHP-FPM与Nginx的组合配置漏洞一直是安全研究人员关注的重点。CVE-2019-11043漏洞的独特之处在于它通过精心构造的请求能够触发PHP-FPM的内存下溢问题最终实现远程代码执行RCE。本文将深入剖析这一漏洞的三个关键环节帮助安全从业者理解其底层机制。1. 漏洞环境与配置前提要理解CVE-2019-11043首先需要明确其特定的运行环境要求。这个漏洞并非在所有PHP-FPM配置下都能触发而是需要满足以下几个关键条件Nginx特定配置必须使用类似以下的location配置且启用了fastcgi_split_path_info指令location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.?\.php)(/.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; # 其他fastcgi配置... }PHP版本范围主要影响PHP 7.1.x至7.3.x的特定版本这些版本在PATH_INFO处理上存在缺陷。PHP-FPM运行模式必须以FastCGI模式运行这是大多数NginxPHP环境的默认配置。关键数据结构在PHP-FPM中fcgi_data_seg结构负责管理FastCGI请求的数据段typedef struct _fcgi_data_seg { char *pos; // 当前写入位置 char *end; // 段结束位置 struct _fcgi_data_seg *next; // 下一个段 char data[1]; // 实际数据 } fcgi_data_seg;当PATH_INFO为空时错误的指针操作会导致pos越过数据段起始位置造成内存下溢。2. 漏洞触发机制分析漏洞的核心在于PHP-FPM对PATH_INFO参数的处理缺陷。以下是完整的攻击链条恶意请求构造攻击者发送包含特殊换行符(%0a)的请求例如GET /index.php/PHP_VALUE%0Asession.auto_start1;;;?QQQ...QQQ HTTP/1.1这个超长查询字符串(QSL)为后续内存操作创造条件。PATH_INFO处理异常在fpm_main.c中当PATH_INFO为空时if (path_info[0] 0) { path_info[0] 0; // 关键下溢点 env_path_info ; }这会导致向path_info[0]写入零字节而path_info可能指向已分配内存之前的位置。内存布局操控通过精心设计的请求攻击者可以控制下溢写入的位置破坏fcgi_hash_bucket结构最终篡改PHP环境变量关键内存操作流程如下表所示步骤操作目标内存区域潜在影响1发送超长QSL堆内存分配控制内存布局2触发PATH_INFO为空fcgi_data_seg边界造成下溢3单字节写零相邻内存块破坏数据结构4哈希桶篡改fcgi_hash_bucket控制PHP_VALUE3. 从内存操作到RCE的转换将内存下溢转化为实际的代码执行需要精心的利用链构造哈希碰撞利用攻击者需要找到与PHP_VALUE产生哈希碰撞的另一个键名。研究发现HTTP_EBUT的哈希值与PHP_VALUE相同def calc_hash(var): # PHP-FPM实际使用的哈希算法 return (ord(var[3]) 2) (ord(var[-2]) 4) (ord(var[-1]) 2) len(var) print(calc_hash(PHP_VALUE)) # 输出2015 print(calc_hash(HTTP_EBUT)) # 同样输出2015环境变量注入通过以下步骤注入恶意PHP配置在HTTP头中添加Ebut:恶意值触发漏洞覆盖HTTP_EBUT为PHP_VALUE使得恶意值被解析为PHP配置最终Payload执行典型的攻击链会设置以下PHP配置auto_prepend_file php://input allow_url_include On这样后续请求的Body部分会被当作PHP代码执行。防御措施对比防御方法有效性实施难度性能影响禁用PATH_INFO完全防护中等低更新PHP版本完全防护低无限制fastcgi_param部分防护高中WAF规则部分防护低中4. 漏洞修复与缓解方案针对CVE-2019-11043官方和社区提出了多种解决方案官方补丁PHP团队发布了以下关键修复在fpm_main.c中添加边界检查修正PATH_INFO为空时的处理逻辑版本要求PHP 7.1.33, 7.2.24, 7.3.11Nginx配置优化可以修改配置从根本上消除漏洞location ~ \.php$ { # 禁用PATH_INFO try_files $uri 404; fastcgi_param PATH_INFO ; # 其他原有配置... }运行时防护对于无法立即升级的环境可采用限制请求URI长度过滤包含%0a的请求监控异常502错误以下是一个简单的检测脚本用于验证系统是否包含漏洞#!/bin/bash URLhttp://target.site/index.php RESP$(curl -s -o /dev/null -w %{http_code} \ $URL/PHP_VALUE%0Asession.auto_start1;;;?QQQ...QQQ) [ $RESP 502 ] echo 可能存在漏洞 || echo 可能安全在实际应用中我们发现这个漏洞的利用存在一定的不确定性成功与否取决于精确的内存布局控制PHP-FPM工作进程的状态系统ASLR等防护机制Nginx缓冲区大小配置