2016年7月18日,披露了一个名为HTTPoxy的CGI应用程序漏洞。攻击者可以通过传递带有请求的HTTPProxy
标头来利用易受攻击的部署,这会在联系支持服务时更改应用程序使用的URL。这可用于泄漏凭据,修改对应用程序的响应等。
该漏洞是由HTTP_PROXY
环境变量(通常用于指定后端代理服务的位置)与Proxy
HTTP客户端标头之间的名称冲突引起的。该CGI规范要求的客户提供的头被传递到环境与HTTP_
用于命名空间的前缀。这种破坏与配置变量冲突,如同以HTTP_
开头的HTTP_PROXY
。如果CGI应用程序或库使用此变量而不进行其他处理,则在尝试连接到代理服务时,最终可能会使用客户端提供的值。
由于此漏洞会影响各种类似CGI的实施,因此创建了许多安全漏洞标识符:CVE-2016-5386,CVE-2016-5386,CVE-2016-5387,CVE-2016-5388,CVE-2016- 1000109和CVE-2016-1000110(在撰写本文时,这些是保留的,但未填写)。
自2001年以来,HTTPoxy漏洞以某些形式出现,但直到最近才被认为是一个普遍存在的问题。虽然它可能影响许多部署,但缓解非常简单直接。
HTTPoxy是许多CGI实现发现的一般漏洞。应用程序或服务器可以正确实现CGI规范,但仍然容易受到攻击。
要使部署易受攻击,必须:
HTTP_
前缀的,因此只有应用程序使用HTTP发出的请求才会受到影响。使用HTTPS或任何其他协议的请求不容易受到攻击。HTTP_
前缀的环境变量的部署很容易受到攻击。任何兼容的CGI或FastCGI等相关协议的实现都可以做到这一点。如您所见,部署和特定于应用程序的因素的组合对于易受攻击的部署是必要的。为了测试您的部署是否受到影响,Luke Rehmann创建了一个简单的站点来检查可公开访问的站点是否存在漏洞。
特别是PHP应用程序应该被审计,因为类似CGI的部署在PHP生态系统中比在其他语言中更常见。此外,该getenv
方法在流行的库中的广泛使用放大了这个问题,因为不能立即清楚这将返回未经过处理的用户输入,而不仅仅是配置变量。当前受影响的特定库是Guzzle(版本4.0.0rc2及更高版本),Artax和Composer的StreamContextBuilder类。
使用CGI部署时发现易受攻击的其他语言是Python和Go。这些语言通常使用其他非易受攻击的方法进行部署。但是,如果使用CGI,那些天真地读取HTTP_PROXY
变量而不修改其行为的库很容易受到攻击。
幸运的是,HTTPoxy修复起来相对简单。可以从Web服务器层或应用程序或库中解决该漏洞:
HTTP_PROXY
处于CGI环境中时,它们可以忽略该变量。Proxy
客户端请求中收到的标头如果您使用的是易受攻击的库,则应该缓解服务器端的威胁,直到有可用的补丁来解决问题。如果您是库或应用程序作者,并且您的项目依赖于HTTP_PROXY
变量来配置代理后端,请考虑使用在类似CGI的环境中运行时不会发生冲突的备用变量。Ruby和其他一些项目把CGI_HTTP_PROXY
用于此目的。
由于Proxy
标头不是标准HTTP标头,因此几乎在所有情况下都可以安全地忽略它。这可以在用于将请求定向到应用程序本身的Web服务器或负载平衡器中完成。由于Proxy
HTTP标头没有任何标准的合法用途,因此几乎总是可以删除它。
任何常见的Web服务器,负载平衡器或代理都可以取消设置相应的标头。
如果您正在运行Apache HTTP Web服务器,则mod_headers
可以使用该模块取消设置所有请求的标头。
要在Ubuntu或Debian服务器中启用mod_headers
,请键入:
sudo a2enmod headers
然后,打开全局配置文件:
sudo nano /etc/apache2/apache2.conf
接近底部,添加:
. . .
RequestHeader unset Proxy early
保存并关闭文件。
检查配置是否存在语法错误:
sudo apache2ctl configtest
如果未报告语法错误,请重新启动服务:
sudo service apache2 restart
对于传统安装,默认情况下应启用该mod_headers
模块。要取消设置Proxy
标头,请打开全局配置文件:
sudo nano /etc/httpd/conf/httpd.conf
接近底部,添加:
. . .
RequestHeader unset Proxy early
完成后保存并关闭文件。
键入以下命令检查语法错误:
sudo apachectl configtest
如果未报告语法错误,请键入以下命令重新启动服务:
sudo service httpd restart
在Nginx中,缓解同样微不足道。您可以轻松清理服务器或上游运行的任何类似CGI的环境。
在Ubuntu和Debian服务器上,FastCGI参数通常包含在设置FastCGI代理时的文件fastcgi_params
或fastcgi.conf
文件中。您可以在这两个文件中取消设置HTTP_PROXY
标题:
echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi.conf
echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi_params
如果在配置FastCGI代理时未获取其中一个文件,请确保在代理位置本身中包含相同的行:
. . .
location ~ \.php$ {
. . .
fastcgi_param HTTP_PROXY "";
. . .
}
}
如果您使用Nginx进行常规HTTP代理,则还应清除HTTP Proxy
标头。HTTP代理头在/etc/nginx/proxy_params
文件中设置。您可以通过键入以下内容来添加规则以将Proxy
标头取消设置为该文件:
echo 'proxy_set_header Proxy "";' | sudo tee -a /etc/nginx/proxy_params
同样,如果您不是从服务器块配置中获取此文件,则必须将其添加到代理位置本身:
. . .
location /application/ {
. . .
proxy_pass http://127.0.0.1;
proxy_set_header Proxy "";
. . .
}
}
键入以下命令检查语法错误:
sudo nginx -t
如果未报告任何错误,请重新启动该服务:
sudo service nginx restart
Nginx的在CentOS和Fedora也使用相同fastcgi_params
和fastcgi.conf
文件来配置FastCGI的代理。键入以下内容,取消设置这两个文件中的HTTP_PROXY
标题:
echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi.conf
echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi_params
如果在配置FastCGI代理时未获取其中一个文件,请确保在代理位置本身中包含相同的行:
. . .
location ~ \.php$ {
. . .
fastcgi_param HTTP_PROXY "";
. . .
}
}
如果您使用Nginx进行常规HTTP代理,则还应清除HTTP Proxy
标头。您只需添加规则即可在执行proxy_pass
的任何位置的地方取消设置Proxy
标头。如果您不确定使用proxy_pass
的位置,可以轻松搜索配置目录:
grep -r "proxy_pass" /etc/nginx
/etc/nginx/nginx.conf.default: # proxy_pass http://127.0.0.1;
任何未注释掉的结果(如上例所示)都应编辑为包括proxy_set_header Proxy "";
:
. . .
location /application/ {
. . .
proxy_pass http://127.0.0.1;
proxy_set_header Proxy "";
. . .
}
}
键入以下命令检查语法错误:
sudo nginx -t
如果未报告任何错误,请重新启动该服务:
sudo service nginx restart
如果您使用HAProxy将流量定向到应用程序服务器,则可以Proxy
在转发流量之前删除标头。
打开/etc/haproxy/haproxy.cfg
文件进行编辑:
sudo nano /etc/haproxy/haproxy.cfg
您可以在frontend
,backend
或listen
配置的部分设置http-request
的指令。
frontend www
http-request del-header Proxy
. . .
backend web-backend
http-request del-header Proxy
. . .
listen appname 0.0.0.0:80
http-request del-header Proxy
. . .
这些不需要在每个部分中设置,但包含它们不会有害。完成后保存并关闭文件。
键入以下命令检查语法:
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
如果未发现任何问题,请键入以下命令重新启动服务:
sudo service haproxy restart
HTTPoxy漏洞已经公开了很长时间,可能会影响Web上部署的大量应用程序。幸运的是,使用任何Web服务器本机的标头更改功能很容易修复。
更多教程请前往腾讯云+社区学习更多知识。
参考文献:《How to Protect Your Server Against the HTTPoxy Vulnerability》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。