技术说明
NGINX的ngx_http_rewrite_module中存在严重的堆缓冲区溢出漏洞,该漏洞于2008年引入,影响版本0.6.27至1.30.0(NGINX Open Source)和R32至R36(NGINX Plus)。当rewrite指令后跟随带有未命名PCRE捕获和包含问号的替换字符串的rewrite、if或set指令时,会发生此漏洞。未认证的远程攻击者可以发送精心构造的HTTP请求触发堆损坏,导致拒绝服务或在禁用ASLR的系统上可能实现远程代码执行。
攻击途径
未认证的远程攻击者发送专门构造的HTTP请求,针对使用带有问号的重写规则以及引用捕获值的set指令的易受攻击NGINX配置。当问号永久设置is_args标志时,两次长度计算和复制过程出现分歧,导致复制过程调用带有NGX_ESCAPE_ARGS的ngx_escape_uri,扩展每个可转义字符并溢出分配的缓冲区。
受影响系统
NGINX Open Source 0.6.27-1.30.0、NGINX Plus R32-R36、NGINX Instance Manager 2.16.0-2.21.1、F5 WAF for NGINX 5.9.0-5.12.1、NGINX App Protect WAF、NGINX App Protect DoS、NGINX Gateway Fabric、NGINX Ingress Controller。根据F5公告,影响全球约三分之一的网站。
缓解措施
升级到NGINX Open Source 1.31.0或1.30.1,或NGINX Plus R37 / R36 P4 / R32 P6。临时缓解措施:检查使用带有问号的重写规则以及引用捕获值的set指令的配置。F5已发布详细公告K000161019。考虑到18年的漏洞窗口期和已公布的概念验证代码,组织应优先对面向互联网的NGINX部署立即进行补丁修复。