在Linux和Unix系统上,一个严重漏洞被发现,影响到使用PHP、Go、Python等语言构建的CGI脚本。
那我们应该如何修复Linux或Unix上关于HAProxy、Varnish、Nginx、PHP、Go、Python、Tomcat等应用上的”Httpoxy a CGI”漏洞?
httpoxy
是一类影响到运行在CGI或者类CGI环境中应用的漏洞,它由一个简单的”命名空间冲突”导致。
漏洞简介
- RFC3875(CGI)标准,会把请求中的Header加上
HTTP_
前缀,注册为环境变量。 - 将请求中的
HTTP Proxy
的header传递给环境变量HTTP_PROXY
HTTP_PROXY
是一个很常用的环境变量,被用来配置对外代理(outgoing proxy)
这将导致远程利用漏洞。如果正在运行PHP或者CGI,你应该限制Proxy
的header。HTTP_PROXY
可能会被用来制造”中间人攻击”。下面的一些web服务器、web框架和编程语言受到影响:
- Golang (CVE-2016-5386)
- PHP(CVE-2016-5385)
- HHVM (CVE-2016-1000109)
- Python (CVE-2016-1000110)
- Apache Tomcat (CVE-2016-5388)
- web服务器 – Apache(CVE-2016-5387)、Nginx、Varnish、Httpoxy
- 受到影响的发行版 – RHEL、CentOS等
漏洞影响
为系统和应用打补丁
首先,需要安装所有操作系统或者应用推送的安全更新,例如Apache、PHP、Nginx等。
#debian系发行版
sudo apt-get update && sudo apt-get upgrade
#fedora
sudo dnf update
#RHEL、CentOS等红帽衍生版
sudo yum update
降低Nginx代理服务器的Httpoxy风险
编辑你的nginx.conf
或者fastcgi_params
配置文件
sudo vi /etc/nginx/conf.d/fastcgi_params
#或者
sudo vi /etc/nginx/nginx.conf
在配置文件中添加下面指令:
fastcgi_param HTTP_PROXY "";
当代理HTTP请求到upstream应用时,最好将所有Proxy
头设置为空字符串,避免upstream应用运行在含有漏洞平台(当均衡负载和代理HTTP流量时,在nginx.conf
中添加下面指令):
proxy_set_header Proxy "";
保存并关闭配置文件,重载或者重启nginx服务器:
sudo systemctl reload nginx
降低Apache服务器的Httpoxy风险
可以使用mod_header,编辑etc/httpd/conf.d/site.conf
或者httpd.conf
:
sudo vi /etc/httpd/conf.d/site.conf
添加下面的指令:
RequestHeader unset Proxy
保存并关闭文件,重启apache服务器:
sudo systemctl restart httpd
实现去掉header中proxy的http请求
降低使用HAProxy的Httpoxy风险
编辑/etc/haproxy/haproxy.cfg
,将下面指令添加进去,来移除Proxy的header:
http-request del-header Proxy
然后重启HAProxy
sudo systemctl restart haproxy
降低使用Varnish的Httpoxy风险
编辑/etc/varnish/default.vcl
文件,将下面指令添加进去,来移除Proxy的header(找到vcl_recv { … }配置项,并添加在里面):
unset req.http.proxy;
保存并关闭文件,重启varnish:
sudo systemctl restart varnish
降低CGI应用的Httpoxy风险
你需要配置web应用(nginx)的防火墙,来移除传入的HTTP请求中的Proxy
头。具体可以参考上面Nginx和Apache的配置信息。
通过编辑.php文件来修复
在PHP文件头部(<?php后面)添加:
<?php
/* 没经过测试,可能无效 */
putenv("HTTP_PROXY="); $_SERVER[HTTP_PROXY] = "";
/* 注意 */
/* 如果你在Apache/mod_php环境下运行PHP,除了上面的配置还需要另外添加 */
apache_putenv('HTTP_PROXY', '');
通过编辑go代码文件来修复
在你的程序中添加下面代码:
import "os"
os.Unsetenv("HTTP_PROXY")
检查是否受影响
为了修复这个问题,可以暂时性地在服务器上安装下面的CGI脚本,并运行(/var/www/html/cgi-bin/test.cgi)
#!/bin/sh
echo "Content-Type:text/plain"
echo ""
echo "HTTP_PROXY='$HTTP_PROXY'"
保存并关闭文件,并且加上执行权限
chmod +x test.cgi
按照下面的方式去调用(触发)
curl -H "Proxy: AFFECTED" http://your-server-ip-or-name/cgi-bin/test.cgi
如果你看到下面输出,那么你的服务器就可以免受影响
HTTP_PROXY="
如果是下面这种情况,或者是其他输出,你的服务器可能会受到影响,你应该采用上面的那些解决方案
HTTP_PROXY='AFFECTED'
来源:
How to fix Httpoxy a CGI PHP/Nginx/Apache/Go application vulnerability on Linux or Unix