HTTPoxy - CGI "HTTP_PROXY" 变量名称冲突

Public Date: July 18, 2016, 11:52
Updated July 18, 2016, 11:52 - English(英语) French Japanese Korean
Resolved 状态
Important Impact

红帽产品中使用 的 CGI 脚本影响 PHP、Go、Python 和其他脚本语言的方式中存在一个漏洞。


有些网页服务器、网页框架和编程语言(最常见于 CGI 环境)会根据进入请求中的数据设置变量 “HTTP_PROXY”(例如: 名为 “Proxy” 附带用户提供数据的请求标头)。大量的网页客户软件会使用环境变量 “HTTP_PROXY” 指定用于 HTTP 的远程代理服务器,有时候是在 HTTPS 请求者使用。结果是当网页应用程序运行时,它可能是指定应用程序用来作为后续外出请求的代理服务器的攻击者,这样就可以进行“中间人”攻击。已将此漏洞命名为 HTTPoxy

背景资料

CGI 及环境变量

HTTP 服务器使用一组环境变量向 CGI 脚本传递信息。那些环境变量中的一部分会被用来就 HTTP 请求的某些方面进行沟通,比如内容类型、TCP 端口、主机名或请求方式(比如:GET 或者 POST)。另外有一组不同的环境变量,RFC 称之为“具体协议 Meta 变量”,这些变量是用来将 HTTP 标头值传递给 CGI 脚本。HTTP 标头与环境变量的品牌有一个标准程序:即首先将 HTTP 标头名称转换为大写字母,使用 "_" 替换 "-" ,使用 "HTTP_" 作为前缀。

例如:如果使用 "HTTP_COOKIE" 环境变量传递 "Cookie" 标头,使用 "HTTP_PROXY" 环境变量传递 "Proxy" 标头。请注意:"Proxy" 标头既不是官方标准标头,也不是临时标头注册表。不应再标准兼容的应用程序或客户端中使用 "Proxy" 标头。

HTTP_PROXY "system" 环境变量

"HTTP_PROXY" 是通用系统环境变量,一般用来与 HTTP (及一些 HTTPS)代理服务器设置进行外出 HTTP 代理服务器与应用程序之间的沟通。这个变量的目的和上下文与 HTTP server-script 变量完全不同。应用程序、语言库或脚本模块使用这个变量配置器代理服务器,以处理后续传出 HTTP 流量。

CGI 标准

通用网关接口是一个标准,旨在允许 HTTP 网页服务器,比如 Apache 或者 nginx 与可执行脚本或二进制文件互动,以便生成动态网页。这个标准的文档位于 RFC 3875 。可使用不同的脚步语言编写 CGI 脚本,比如 PHP、Python、Perl、Ruby 或者 golang,也可以编译为二进制文件。

HTTP 服务器与 CGI 脚本以如下方式互动:

1. HTTP 收到并解析 HTTP 请求,同时配置所需环境变量。
2. HTTP 服务器调用 CGI 脚本,并通过该脚本的标准输入传递所有请求数据。
3. CGI 脚本处理环境变量及其输入,并使用该脚本的标准输出想 HTTP 服务器发送回应。
4. HTTP 将 CGI 脚本生成的响应发送会客户端。

问题:HTTP_PROXY 名称冲突

CGI 脚本无法区别包含 HTTP 请求的 "Proxy" 标头值 的CGI “具体协议 Meta 变量”、以及包含 HTTP 代理服务器设置的“system”环境变量 HTTP_PROXY。CGI 脚本、模块或库会读取 "HTTP_PROXY" 变量,并加上它包含 "system" HTTP 代理服务器设置。对该值的错误解析会改变在处理当前 HTTP 请求时生成的 CGI 脚本处理新 HTTP 请求(及其他由其调用的脚步和程序)的方式。

采取行动

强烈建议所有使用附带 PHP、Go 或者 Python 的 CGI 脚本的红帽客户在其系统中采用缓解操作。有关受影响软件包及映象版本的详情,以及建议的缓解操作,请参考解决方案标签页。

特此鸣谢

红帽愿籍此机会感谢 VendHQ 的 Dominic Scheirlinck 报告此问题并就此问题提供协助。

红帽产品安全团队已将这个问题评级为 Important

要诊断您环境中的这个漏洞,请访问解决方案标签页。

受影响的产品

  • Red Hat Enterprise Linux 7.x
  • Red Hat Enterprise Application Platform 6.x

  • Red Hat Enterprise Web Server 2.x

  • Red Hat JBoss Web Server 3.x

  • Red Hat Satellite

攻击描述及影响

攻击

这个攻击非常直接。攻击者会向有漏洞的 CGI 脚本发送特制 HTTP 请求。该请求在主机名或 IP 地址中包含 "Proxy" 标头,并使用攻击者控制的代理服务器端口作为其标头值。HTTP 服务器收到该请求后,在继续操作前,会调用 CGI 脚本按常规处理将"Proxy"标头及其值转换为 "HTTP_PROXY" 元数据变量。然后该 CGI 脚本会读取 HTTP_PROXY 变量,但会将其与用来为传出 HTTP 代理服务器沟通设置的 “system” 变量混淆,并将其自身配置为使用指定的代理服务器。如果该 CGI 脚本执行 HTTP 请求,那些请求就会通过攻击者控制的代理服务器发送出去,这样攻击者就可以使用“中间人”控制所有 HTTP 力量。

影响及严重性

只有错误解析 HTTP_PROXY 变量同时发送 HTTP(或者 HTTPS)请求的 CGI 脚本会受影响。就总体 CGI 脚本来说,此类脚本的数量有限。

很难说明全局影响及严重性,因为这与 CGI 脚本行为有关。特别糟糕的情况是那些执行敏感任务的 CGI 脚本(例如:使用 REST 形式 API 进行认证)。在这种情况下,攻击者可以通过攻击者控制的代理服务器将 CGI 脚本及 REST 形式 HTTP 服务器之间的 HTTP 流量重新定向。这可能会造成在 CGI 脚本及 HTTP 服务器之间的请求和回应中所包含的敏感信息被泄露。

另外,攻击者可以操纵请求和回应内容。如果 CGI 脚本向从外部互联网无法到达的内部服务器发送请求,则攻击者的代理服务器无法与内部服务器沟通,攻击者也无法截获内部服务器的回应。但攻击者仍可以截获 CGI 脚本的请求并向其发送伪装回应。

诊断

为诊断这个问题,请在您的服务器中临时安置 CGI 脚本,并使其可运行:


test.cgi:

#!/bin/sh
echo "Content-Type:text/plain"
​echo ""
echo "HTTP_PROXY='$HTTP_PROXY'"
											

然后使用 “Proxy:” 请求标头调用 CGI 脚本:

curl -H ‘Proxy: AFFECTED’ http://my-server-name/cgi-bin/test.cgi
												

如果看到以下输出结果,则您的服务器已受到影响:

HTTP_PROXY="
													

但如果您看到下面的内容或其他输出结果,您的服务器可能会受到影响,您应该采取后面给出的缓解操作之一进行处理:

HTTP_PROXY='AFFECTED'
														

缓解操作

有关缓解该问题的操作详情,请查看与您受影响服务器有关的知识库文章:

HTTPoxy - 我的 JBoss/tomcat 会受影响吗?

HTTPoxy - 我的 Apache mod_cgi 会受影响吗?

HTTPoxy - 我的 nginx 会受影响吗?

HTTPoxy - 我的 Apache mod_fcgid 会受影响吗?

HTTPoxy - 我的 PHP 程序会受影响吗?

HTTPoxy - 我的应用程序会受影响吗?

更新受影响的产品

于 2016 年 7 月 18 日发布了对所有受影响的产品的修复。

产品 软件包 建议/更新
Red Hat Enterprise Linux 5.x httpd RHSA-2016:1421
Red Hat Enterprise Linux 6.x httpd RHSA-2016:1421
Red Hat Enterprise Linux 7.x httpd RHSA-2016:1422
Red Hat Enterprise Application Platform 6.x httpd 待处理的补丁
Red Hat Enterprise Web Server 2.x httpd 待处理的补丁
Red Hat JBoss Web Server 3.x httpd 待处理的补丁
Red Hat Software Collections httpd24 RHSA-2016:1420

Comments