周一,研究员Hanno Böck发现HTTP Options存在出血漏洞CVE-2017-9798,如果网站管理员尝试对无效的 HTTP 方法实施 "Limit" 指令, 则会导致出现漏洞利用的可能,攻击得手后将导致服务器敏感内存泄漏。目前Apache的开发商确认了这个漏洞,尚不清楚其它Web服务软件是否存在这个问题。
如果您使用的是 HTTP 协议在日常的互联网使用, 你通常只使用它的两种方法: Get和Post。但是, HTTP 有许多其他方法, 所以我想您需要知道如何处理它们, 以及是否存在任何漏洞。
一个 HTTP 方法称为Options。它只允许询问服务器,它能支持的其他 HTTP 方法。服务器用 "Allow" 头来应答, 并给我们一个列表,列表项目用逗号来分隔。
对 Alexa 前100万的网站进行了扫描,发现了一些奇怪的事情,大量的服务器发送了一个 "Allow" 头, 看起来像损坏的数据。一些例子
Allow: ,GET,,,POST,OPTIONS,HEAD,, Allow: POST,OPTIONS,,HEAD,:09:44 GMT Allow: GET,HEAD,OPTIONS,,HEAD,,HEAD,,HEAD,, HEAD,,HEAD,,HEAD,,HEAD,POST,,HEAD,, HEAD,!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" Allow: GET,HEAD,OPTIONS,=write HTTP/1.0,HEAD,,HEAD,POST,,HEAD,TRACE
这看起来很有趣, 而且很危险。它看起来就像是一个 "出血" 式的漏洞,而且已经成为这个漏洞的 http Options出血漏洞,该漏洞将导致内存泄漏 给潜在的攻击者。然而, 这些是随机的服务器在互联网上, 所以起初我不知道是什么软件造成的。
有时 HTTP 服务器发送一个 "Server" 报头告诉软件。然而, 你需要知道, "server" 头部是可以说谎的。这在HTTP 服务代理中很常见。所以,我得到了各种不同的 "Server" 标题, 但我很怀疑这些都是来自同一个 漏洞。
Options出血是在 Apache http 中释放错误后使用的, 这会导致在响应 HTTP 选项请求时构造一个损坏的Allow标头。这可能会泄漏可能包含机密的服务器进程中的任意内存片断。在多个请求之后, 内存块会发生变化, 因此对于易受攻击的主机, 可以泄漏任意数量的内存块。
如果网站管理员对无效的 HTTP 方法实施 "Limit" 指令, 则会出现此问题。
Example .htaccess: <Limit abcxyz> </Limit>
在Alexa排名前100万网站中,显示了466台主机存在损坏的Allow头部,这些网站的影响面和用户群都非常庞大。理论上, 其他服务器软件可能有类似的错误。另一方面, 此漏洞是非确定性的, 因此并非所有易受攻击的主机都可能被捕捉。
因此, 如果你设置一个非常不寻常的配置选项,就会发生这个问题吗?
在共享的托管环境中存在额外的风险。损坏不限于单个虚拟主机。共享宿主提供程序的一个客户可能会故意创建一个. htaccess 文件, 从而导致这方面的问题, 而且能够从同一系统上的其他主机提取机密数据。
我试图联系受影响的服务器运营人员, 但对方非常不愿意告诉我任何关于他的设置, 所以也没法进行确认。但是, 我找到一个办法,一些损坏的报头中包含了 Apache 清晰的配置选项字符串。这些字符串似乎不太可能出现在其他服务器软件的内存中。但我无法在自己的 Apache 服务器上重现任何类似的东西。我还尝试阅读哪些放在一起Allow头部的代码,看看是否能找到任何线索, 但没有成功。所以不知道任何细节,没办法了,我联系了 Apache 安全小组。
幸运的是Apache开发商Jacob Champion发现了这个问题, 并想通了什么是怎么回事:
apache 支持配置指令Limit,允许限制对特定用户的某些 HTTP 方法的访问。如果在. htaccess 文件中为未在服务器上全局注册的 HTTP 方法,设置了限制指令, 则会发生损坏。
ok,知道这个问题之后, 我可以自己重新这个漏洞了。在. htaccess 文件中为任何无效的 HTTP 方法设置Limit指令后, 在Allow报头的构造中就出现了问题, 同时还可以被Address Sanitizer检测到。(但是, 由于 APR 执行的内存分配抽象, ASAN的工作不可靠。
https://blog.fuzzing-project.org/uploads/optionsbleed-asan.txt
poc地址:https://github.com/hannob/optionsbleed