如何保护您的服务器免受HTTPoxy漏洞的影响

什么是HTTPoxy?

2016年7月18日,披露了一个名为HTTPoxy的CGI应用程序漏洞。攻击者可以通过传递带有请求的HTTPProxy 标头来利用易受攻击的部署,这会在联系支持服务时更改应用程序使用的URL。这可用于泄漏凭据,修改对应用程序的响应等。

该漏洞是由HTTP_PROXY环境变量(通常用于指定后端代理服务的位置)与ProxyHTTP客户端标头之间的名称冲突引起的。该CGI规范要求的客户提供的头被传递到环境与HTTP_用于命名空间的前缀。这种破坏与配置变量冲突,如同以HTTP_开头的HTTP_PROXY。如果CGI应用程序或库使用此变量而不进行其他处理,则在尝试连接到代理服务时,最终可能会使用客户端提供的值。

由于此漏洞会影响各种类似CGI的实施,因此创建了许多安全漏洞标识符:CVE-2016-5386CVE-2016-5386CVE-2016-5387CVE-2016-5388CVE-2016- 1000109CVE-2016-1000110(在撰写本文时,这些是保留的,但未填写)。

自2001年以来,HTTPoxy漏洞以某些形式出现,但直到最近才被认为是一个普遍存在的问题。虽然它可能影响许多部署,但缓解非常简单直接。

易受攻击的服务器和应用程序

HTTPoxy是许多CGI实现发现的一般漏洞。应用程序或服务器可以正确实现CGI规范,但仍然容易受到攻击。

要使部署易受攻击,必须:

  • 使用HTTP_PROXY环境变量来配置代理连接:在应用程序代码本身或任何使用的库中使用。这是使用环境配置代理服务器的一种相当标准的方法。
  • 使用HTTP向后端服务发出请求:由于名称冲突是特定于HTTP_前缀的,因此只有应用程序使用HTTP发出的请求才会受到影响。使用HTTPS或任何其他协议的请求不容易受到攻击。
  • 在类似CGI或CGI的环境中运行:将客户端标头转换为带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环境中时,它们可以忽略该变量。
  • 应用程序或库可以使用不同的环境变量来配置代理连接
  • Web服务器或代理可以取消设置Proxy客户端请求中收到的标头

如果您使用的是易受攻击的库,则应该缓解服务器端的威胁,直到有可用的补丁来解决问题。如果您是库或应用程序作者,并且您的项目依赖于HTTP_PROXY变量来配置代理后端,请考虑使用在类似CGI的环境中运行时不会发生冲突的备用变量。Ruby和其他一些项目把CGI_HTTP_PROXY用于此目的。

由于Proxy标头不是标准HTTP标头,因此几乎在所有情况下都可以安全地忽略它。这可以在用于将请求定向到应用程序本身的Web服务器或负载平衡器中完成。由于ProxyHTTP标头没有任何标准的合法用途,因此几乎总是可以删除它。

任何常见的Web服务器,负载平衡器或代理都可以取消设置相应的标头。

使用Apache删除HTTP代理标头

如果您正在运行Apache HTTP Web服务器,则mod_headers可以使用该模块取消设置所有请求的标头。

Ubuntu和Debian服务器

要在Ubuntu或Debian服务器中启用mod_headers,请键入:

sudo a2enmod headers

然后,打开全局配置文件:

sudo nano /etc/apache2/apache2.conf

接近底部,添加:

. . .
RequestHeader unset Proxy early

保存并关闭文件。

检查配置是否存在语法错误:

sudo apache2ctl configtest

如果未报告语法错误,请重新启动服务:

sudo service apache2 restart

CentOS和Fedora服务器

对于传统安装,默认情况下应启用该mod_headers模块。要取消设置Proxy标头,请打开全局配置文件:

sudo nano /etc/httpd/conf/httpd.conf

接近底部,添加:

. . .
RequestHeader unset Proxy early

完成后保存并关闭文件。

键入以下命令检查语法错误:

sudo apachectl configtest

如果未报告语法错误,请键入以下命令重新启动服务:

sudo service httpd restart

使用Nginx删除HTTP代理标头

在Nginx中,缓解同样微不足道。您可以轻松清理服务器或上游运行的任何类似CGI的环境。

Ubuntu和Debian服务器

在Ubuntu和Debian服务器上,FastCGI参数通常包含在设置FastCGI代理时的文件fastcgi_paramsfastcgi.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

CentOS和Fedora服务器

Nginx的在CentOS和Fedora也使用相同fastcgi_paramsfastcgi.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删除HTTP代理标头

如果您使用HAProxy将流量定向到应用程序服务器,则可以Proxy在转发流量之前删除标头。

打开/etc/haproxy/haproxy.cfg文件进行编辑:

sudo nano /etc/haproxy/haproxy.cfg

您可以在frontendbackendlisten配置的部分设置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》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏蜉蝣禅修之道

openipmp安装

21230
来自专栏IT笔记

Nginx学习之如何搭建文件防盗链服务

大家都知道现在很多站点下载资料都是要收费的,无论是积分还是金币,想免费只能说很少很少了,那么这些网站是如何做到资源防盗链的呢?

13510
来自专栏逸鹏说道

熔断器设计模式

如果大家有印象的话,尤其是夏天,如果家里用电负载过大,比如开了很多家用电器,就会”自动跳闸”,此时电路就会断开。在以前更古老的一种方式是”保险丝”,当负载过大,...

28550
来自专栏有趣的django

Ubuntu基本命令

vi编辑器 ? ? ? ? ? {  :上一段diamante  } :下一段代码 dw: 删除一个单词 权限 ? 前面的分三组 第一: 文件拥有者的权限 第二...

62450
来自专栏blackpiglet

使用 pip 发布 Python 程序

写过 Python 程序的小伙伴们都知道,需要 import 个非 Python 自带的软件包时,都要用到 pip 这个程序。平时我们都是用 pip,如果我们写...

43820
来自专栏Alice

iOS开发多线程在实际项目中的运用

        同一时间,CPU只能处理一条线程,也就是只有一条线程在工作。所谓多线程并发(同时)执行,

9520
来自专栏月牙寂

k8s源码分析-----kubelet(3)ContainerGC

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

37280
来自专栏LanceToBigData

struts2(五)之struts2拦截器与自定义拦截器

前言   前面介绍了struts2的输入验证,如果让我自己选的话,肯定是选择xml配置校验的方法,因为,能使用struts2中的一些校验规则,就无需自己编写了,...

30850
来自专栏salesforce零基础学习

salesforce lightning零基础学习(六)Lightning Data Service(LDS)

本篇可参看:https://trailhead.salesforce.com/modules/lightning_data_service

18930
来自专栏公众号_薛勤的博客

深入理解跨域SSO原理与技术

​ SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登...

25710

扫码关注云+社区

领取腾讯云代金券