博客 | NGINX

使用 NGINX 和 NGINX Plus 防范 CVE-2015-1635

NGINX-F5-horiz-black-type-RGB 的一部分
欧文·加勒特缩略图
欧文·加勒特
2015 年 4 月 16 日发布

4 月 14 日,微软发布了一个漏洞警报(目前编号为CVE-2015-1635 ),如果攻击者向受影响的 Windows 系统发送特制的 HTTP 请求,则可能允许远程代码执行。 如果无法立即修补生产 Windows 服务器,那么 NGINX 和 NGINX Plus 可以帮助您免受攻击。

截至本文撰写时,该漏洞的具体细节尚未公布,但据报道攻击者正试图通过发送具有非常大的 Range 请求的 HTTP 请求来查找易受攻击的系统,这可能会触发缓冲区溢出并导致 Windows 系统崩溃。

强烈建议用户应用微软的补丁来修复此漏洞。 但是,如果您无法将补丁应用到所有生产系统,并且使用 NGINX 或 NGINX Plus 对它们进行负载平衡或代理流量,则简单的配置更改就足以拦截和修复发送到易受攻击的系统的特殊请求。

识别和处理侦察流量

Mattias Geniar 分析了攻击流量,并报告Range标头中具有较大字节范围的 HTTP 请求会触发崩溃:

GET / HTTP/1.1rnHost: stuffrn
范围:字节=0-18446744073709551615rn
rn

最简单的修复方法是使用proxy_set_header指令将Range标头设置为“” (空字符串),这会在 HTTP 请求转发到proxy_pass指令命名的 Windows 服务器之前有效地删除标头:

服务器 { listen 80;

位置 / {
proxy_set_header Range "";
proxy_pass http://windowsserver:80;
}
}

如果您的应用需要字节范围支持,您可以使用map指令将任何类似于大整数的字符串替换为空字符串,然后再使用proxy_set_header指令设置Range标头:

map $http_range $saferange { "~d{10,}" ""; # 如果它与 10 个或更多整数的字符串匹配,则将其删除
default $http_range;
}

server {
listen 80;

location / {
proxy_set_header Range $saferange;
proxy_pass http://windowsserver:80;
}
}

或者,您可以返回 HTTP 代码444Range标头中的值类似于大整数时。 代码444指示 NGINX 和 NGINX Plus 立即关闭客户端连接而不返回任何内容。

服务器 { listen 80;

if ($http_range ~ "d{9,}") {
return 444;
}

位置 / {
proxy_pass http://windowsserver:80;
}
}

保持安全并应用补丁,但如果您不能立即这样做,NGINX 和 NGINX Plus 可以帮助堵塞潜在的漏洞。

要试用 NGINX Plus,请立即开始30 天免费试用联系我们获取演示。


“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”