Talk is cheap, Show me the code !

[译] 修复"Httpoxy"漏洞

server    Httpoxy  CGI 

在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

HTTPOXY漏洞说明


Posted on By legolas

本站点legolasng.github.io的评论插件已经替换为Disqus,需要FQ才能使用。