Optionsbleed 漏洞泄露 Apache Server 的内存信息
本周一安全研究员 Hanno Böck 发现,部分 Apache 服务器可能因 Optionsbleed 漏洞(CVE-2017-9798)泄漏服务器内存信息。实际上这个漏洞和 OpenSSL 的心脏滴血问题有相似的地方,攻击者都可以查询服务器并向Apache服务器骗取数据。目前该漏洞原因已经探明,评级为中危,影响的范围有限,运行 Apache Web 服务器的用户请升级至最新版本并安装补丁。【补丁见原文】
Böck 表示 Optionsbleed 在严重性上比不上 Heartbleed,因为Optionsbleed 仅仅会在 Apache web 服务器进程中泄露信息,而不是泄漏所有全部的数据内容。也就是说,泄漏的数据内容仅限于Apache正在处理的内容,一般只是 WWeb 页面的内容。尽管如此危险仍然存在,因为 Optionsbleed 依然可能泄漏原本只有认证用户才可获取的特定页面内容。
Optionsbleed 如何影响服务器
我们都知道Web服务器的工作原理,每当客户端(如Web浏览器)向服务器发出请求时,GET 或 POST 请求会发送到服务器端,服务器响应就会传送 Web 页面的内容或相应的文件到客户端。
而 Apache 服务器能够响应很多其他的请求(方法)——例如 PUT,PATCH,HEAD 以及其他方法。而这些请求是随着时间发展慢慢添加进来的,并非所有的 Apache 服务器都可以支持。因此,部分的服务器管理员可能会禁止部分方法。而为了避免发送给服务器的请求进入“黑洞”,Apache 服务器支持名为 OPTIONS 的方法。客户端可以通过 OPTIONS 方法请求查询服务器能够响应的HTTP方法,而服务器则会返还一串以逗号分隔的支持方法的名字。
Optionsbleed 漏洞发现过程
这次 Optionsbleed 的漏洞发现源于研究员 Böck 进行的一项测试,他扫描了 Alexa 排名前 100 万的网站,来看看哪些网站使用支持 OPTIONS 的 Apache 服务器。而测试结果显示,466 台主机响应了与下述内容相似的乱码回复。
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
可以看到,除了正常的的 Allow 响应之外,其中的这 466 台服务器还答复了一些随机数据,看起来像网页的源代码——这些就是所谓的泄漏内容了。 Böck 发现自己无法重现问题并找到关键所在,所以他立即向Apache安全团队汇报了自己的发现。
随后,Apache 开发人员 Jacob Champion 协助进行调查之后发现,Apache 源代码中存在 Optionbleed 漏洞,展开修补后立即提供了补丁文件。
Optionsbleed 漏洞只影响少量服务器
在进行深入调查 Optionsbleed 之后, Böck 和 Champion 发现 Optionsbleed 在危险性上远远不如此前OpenSSL导致的心脏滴血问题(Heartbleed)。问题出现的前提是——管理员在服务器配置的.htaccess 文件中应用了 “Limit” 选项。
< Limits PATCH PUT DELETE >
Deny from all
< /Limits >
一般,服务器管理员将 .htaccess 文件放在 Apache 服务器文件夹中,以便设置仅适用于该文件目录的规则。而服务器所有者使用 .htaccess 的 “Limit” 选项来控制服务器单独在该文件夹中应答的请求。
Böck 和 Champion则表示,如果.htaccess文件的规则与放置在上层目录或普通服务器配置中的.htaccess文件中的限制规则相矛盾时,Apache 就会陷入混淆,因此出现 Optionsbleed 漏洞。
从技术角度来看,这是一个 use-after-free 的漏洞,会在 Apache 服务器附近的内存区域泄漏出内容。
漏洞测试脚本
最简单的测试方法是在循环中使用 Curl 发送OPTIONS 请求: for i in {1..100}; do curl -sI -X OPTIONS https://www.google.com/|grep -i “allow:”; done
不同的服务器配置下,对于OPTION请求可能会有不同的响应。需要测试的用户可以尝试不同的路径,HTTP或者 HTTPS host,有 www 或没有 www开头的地址都可能导致不同的测试结果。python的POC脚本【阅读原文】
问题从 2014 年开始就存在
也有其他用户指出,这个问题此前在2014年时曾被 Old Dominion University 的研究员发现过并写在论文中。
但目前来看 Apache Web 服务器团队还没有发布新的二进制文件,目前可用的补丁文件适用于2.4.x和2.2.x版本。而对于运行在共享环境中的Apache服务器,由于多个用户在同一台机器上都不输了不同的.htaccess文件,最有可能受到 Optionsbleed 漏洞影响。建议所有服务器尽快安装补丁。
- 原始UDP封包发送
- Elasticsearch——Rest API中的常用用法
- strlen函数,strcat函数,strcpy函数,strncpy函数,strcmp函数
- Elasticsearch——多索引的使用
- 路由跟踪技术
- 手把手教你编写Logstash插件
- ping 实现设计---ICMP
- Elasticsearch增删改查 之 —— mget多文档查询
- Elasticsearch 之 数据索引
- AngularJS 国际化——Angular-translate
- MFC中注释含义
- Elasticsearch Span Query跨度查询
- 2017年重写人类两端时长的科技大事记
- Elasticsearch DSL中Query与Filter的不同
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 3分钟短文:Laravel控制器用法光速入门
- Linux查看ip的实例方法
- Ubuntu18.04通过源码安装Odoo14的教程
- Linux系统中SSH服务基于key认证实践的过程
- linux防墙iptables详细介绍、配置方法与案例
- Linux unlink函数和删除文件的操作方法
- Linux seq命令的使用详解
- Linux运维工具Supervisor的安装使用(进程管理工具)
- Linux whatis命令的使用方法
- Linux tr命令的使用方法
- Linux man命令的具体使用
- Linux locate命令的使用方法
- 解决linux系统中运行node进程却无法杀死进程的问题
- 5分钟搭建一个WebRTC视频聊天
- redis妙用-应用场景