干货,史上杀伤力最大的溢出型漏洞到底是什么?看这一篇就够了| 漏洞连载

智能合约漏洞之整型溢出 智能合约漏洞、整型溢出 阅读详情

4月发生的BEC事件以及SMT事件已经沉淀一段时间了,具体的情况也被多方媒体所报道,相关的漏洞根源问题也有很多大神团队的分析和指正。

近日,有安全团队将各种已经发生或可能发生的类似溢出漏洞原理进行整理,再次将全方位的原理分析与大家分享,让大家对溢出型漏洞有全面的认识。

事件回顾

2018年4月22日,黑客对BEC智能合约发起攻击,凭空取出

57,896,044,618,658,100,000,000,000,000,000,000,000,000,000,000,000,000,000,000.792003956564819968 

个BEC代币并在市场上进行抛售,BEC随即急剧贬值,价值几乎为0,该市场瞬间土崩瓦解。

2018年4月25日,SMT项目方发现其交易存在异常,黑客利用其函数漏洞创造了65,133,050,195,990,400,000,000,000,000,000,000,000,000,000,000,000,000,000,000

+

50,659,039,041,325,800,000,000,000,000,000,000,000,000,000,000,000,000,000,000

的SMT币,火币Pro随即暂停了所有币种的充值提取业务。

让我们一起以沉痛的心情缅怀以上一夜归零的代币。

仅仅在BEC事件过去后的12小时内,就有多达12个项目的智能合约存在类似的整数溢出类型的漏洞,黑客可以利用这一漏洞转账“无中生有”的巨大数量代币,也就是我们所说的“增发”。

代币增发为什么就会贬值

人们常说“物以稀为贵”,意思是事物因稀少而且有益,从而显得珍贵。

黄金被选为最早时期全世界公认的货币的原因就是因为它稀缺,地球上储量有限,易分割,属性稳定等特点。

中国人首先发明了“交子”,来代替不便交易的黄金。

所以就出现了金本位的概念,很多国家发行自己货币的时候都是按照其黄金储量来发行,并不是想发多少就发多少。

试想一下,如果凭空出现了一颗黄金做的大陨石,撞击地球后黄金撒了一地,黄金还会值钱吗?

 

所以当一个代币的数量在有了额定发行总量之后,突然肆意的增加,必然会导致代币的贬值,甚至失去在市场上流通的意义。这就是“代币增发”的不良后果。

整数溢出漏洞分析

前面提到,黑客是利用整数溢出漏洞绕过了转账数额的相关规则,进而增发代币。

那什么是整数溢出呢?为什么能用整数溢出来实现增发来秀一波空手套白狼的操作?

我来举个例子:

比如有一个国家的人不会复杂的数学运算,只会从0数到9,每次数到9之后又从0开始数,最后以数到的数作为结果。大家都这样平安无事的生活着,但有一天,有一个从别的国家来的小黑,他发现了这个问题,于是他去金库拿金锭,拿出来的个数超过了9个,于是金库管理员帮他数,数到9之后又从0开始了,最后结算发现他取出来的结果是0个金锭,但实际上他已经把金库里的金锭几乎都取完了。

黑客利用类似的机制凭空向一个账户中转账了超级大数额的代币,而合约中的逻辑只要求他花费很小的代价。

我们对过往代币增发事件漏洞类型进行整理,概括出整型溢出类型漏洞的全面分析。

以太坊虚拟机(EVM)为整数指定固定大小的数据类型。这意味着一个整型变量只能有一定范围的数字表示。例如,一个 uint8 ,只能存储在范围 [0,255] 的数字。试图存储 256 到一个 uint8 将变成 0。不加注意的话,只要没有检查用户输入又执行计算,导致数字超出存储它们的数据类型允许的范围,Solidity 中的变量就可以被用来组织攻击。

整数溢出的类型包括乘法溢出,加法溢出,减法溢出三种。

在对BEC事件进行分析后,发现可将其漏洞归类于乘法溢出,原理如下:

乘法溢出

•  案例(CVE-2018-10299)

上述合约代码中,存在漏洞的代码为:

uint256 amount = uint256(cnt) * _value;,

计算转出总额度amount未使用SafeMath也未对溢出进行检查,直接将转账地址数量乘以转账额度,如果输入极大的_value,那么amount计算结果就可能产生溢出,导致代币增发。

在Remix-ide中测试如下:

1、部署合约;

2、调用batchTransfer函数,向batchTransfer函数传入地址数组

["0xb4D30Cac5124b46C2Df0CF3e3e1Be05f42119033","0x0e823fFE018727585EaF5Bc769Fa80472F76C3d7"],

以及

_value"0x8000000000000000000000000000000000000000000000000000000000000000"

即2*255,

使得amount=2\*255 * 2,超出uint256类型的范围[0,2**256-1],溢出为0,发送者账户余额不减少,并且,本例中,发送者的代币可以为零,实现"无中生有"。

3、查看余额:

而针对SMT事件进行分析后,发现其漏洞属于加法溢出类型,其原理如下:

加法溢出

•   案例

上述合约代码中,mintToken函数的功能是owner向指定账户增发mintedAmount数量的代币,但是在对balanceOf[target]与totalSupply进行加法操作未做溢出检查,导致其可能存在溢出,并且,通过溢出,恶意owner可以任意增减target账户的余额,或者增发实际远远超过totalSupply的代币。

在Remix-ide中测试如下:

1、部署合约;

2、向target预先转一部分代币,模拟目标账户中已有的代币:调用transfer函数,传入target地址:

0x14723a09acff6d2a60dcdf7aa4aff308fddc160c,

以及转账额度,比如:

2000000000000000000

(2 * 10**uint256(decimals));

3、如果owner想控制target的余额减半,那么,他只需要向target增发

2*256-balanceOf[target]+10\*18=0xfffffffffffffffffffffffffffffffffffffffffffffffff21f494c589c0000,

现在调用mintToken函数,向target地址转入上述数量的代币:

4、查询target余额:

另外还有减法溢出的操作,虽然未出现相关的漏洞攻击事件,我们也提供了相关的原理分析。

减法溢出

•   案例

上述合约代码中,distribute函数的功能是从owner账户向指定的地址列表转入2000 * 10**8代币,但是在对balances[owner]的计算中未使用SafeMath,也未判断owner账户是否有足够的代币,当转出代币总量大于owner账户余额的时候,balances[owner]产生减法溢出,变成一个极大值。

在Remix-ide中测试如下:

1、部署合约

2、调用distribute函数,传入地址数组:

["0x14723a09acff6d2a60dcdf7aa4aff308fddc160c","0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"]

owner分别向这两个地址发送2000 * 10**8代币,超过owner余额,balances[owner]产生减法溢出;

3、查询owner账户余额,等于2**256-2000*10**8:

黑客虽然无孔不入,但链安科技团队对具有此类漏洞的合约进行综合性调研后,提出了“亡羊补牢”的修复措施:

漏洞修复

OpenZeppelin提供了一套很好的SafeMath库,使用SafeMath库函数能够有效避免溢出漏洞,SafeMath库源码如下:

子曰:吾日三省吾身

我们从这些惨痛的教训中能总结出:

1. 基于ERC20协议编写的这些智能合约给予开发者的权力过大了,这些溢出问题本应该放在底层检测。

2. 编写合约的开发者没有以严谨敬业的精神去遵守开发规范,使用SafeMath去做相关功能,或者进行溢出测试,在这里提出批评。

3. 没有严谨的逻辑,单单凭借创造力并不是都能出成果,还是要稳中求胜,能使用库就使用库。

所以,链安科技团队建议,为了避免程序结果中产生溢出,破坏智能合约执行逻辑,建议开发者在所有数学运算中都使用SafeMath(敲黑板)。

DappBrowser,是一款安全、易用、优质的Dapp导航产品,志在为用户提供深度优化的Dapp交易和管理体验。目前已经支持云斗龙等优质的Dapp,可以直接在手机端运行,不需要下载或在PC端安装插件。新版本增加交易所搬砖神器,合约安全检测功能 。下载链接

也可以扫码下载:

参考资料:

[1]: 

http://bc.jrj.com.cn/2018/04/26132824455908.shtml 

[2]: 

https://zhuanlan.zhihu.com/p/36116810

[3]: https://baike.baidu.com/item/%E7%89%A9%E4%BB%A5%E7%A8%80%E4%B8%BA%E8%B4%B5

[4]: 

http://www.woshipm.com/blockchain/945232.html

堆溢出漏洞简介 简介 这次来介绍一下堆溢出漏洞。不过这次的堆溢出漏洞比较复杂,不像栈溢出一样容易理解。所以这一次的内容会比较多。我尽量详细的介绍堆溢出漏洞,以及相关的知识。 首先,关于神马是堆溢出。简而言之就是在堆上产生的溢出。一般我们使用malloc等函数申请的内存都会储存在堆段上。并且由操作系统来管理已经使用和剩余内存,完成内存分配以及回收等等的操作。而堆溢出便是因为程序员的粗心大意,造成了读入的数据超过... 阅读详情

相关推荐

溢出型漏洞分析

溢出型漏洞 前言:自己刚开始看这一块,加上自己的C语言基础并不好,很多地方都是参考的其他文章,所以可能会有很多错误的地方 文章目录溢出型漏洞1.基于C语言的缓冲区溢出漏洞分析1.1 缓冲区溢出漏洞介绍1.1.1 缓冲区溢出漏洞1.1.1 漏洞产生背景1.2 C语言中内存的划分1.2.1 内存划分1.2.2 进行内存划分的意义2 溢出漏洞2.1 栈溢出漏洞2.1.1 栈溢出漏洞2.1.2 栈帧 st...

NiShoushun的博客 917

干货,史上杀伤力最大的溢出型漏洞到底是什么?看这一篇就够了| 漏洞连载...

4月发生的BEC事件以及SMT事件已经沉淀一段时间了,具体的情况也被多方媒体所报道,相关的漏洞根源问题也有很多大神团队的分析和指正。近日,有安全团队将各种已经发生或可能发...

区块链大本营 2459

二进制安全之——堆相关漏洞

主要是指用户动态申请的内存(如:调用malloc,alloc,alloca,new等函数)。glibc malloc源码中有三种最基本的堆块数据结构,分别是heap_info,malloc_state,malloc_chunk。

PICACHU+++的博客 3198

漏洞技术分析实践_整数溢出

整数溢出漏洞发生在当整数存储超出其数据类型所能表示的范围时。主要原因在于计算机中的整数类型分为有符号整数和无符号整数。有符号整数使用最高位来表示正负号:0 表示正数,1 表示负数,而无符号整数没有这个规则。常见的整数类型有 8 位、16 位和 32 位等。整数溢出通常发生在存储的值超出了该类型可表示的范围时,从而导致数据异常和潜在的安全漏洞。

kitsch0x97的博客 1358

Jetty 安全漏洞分析

Jetty 安全漏洞分析1. 安全问题分析2. 升级验证3. Jetty版本不准确问题分析4. Jetty版本不能准确的临时解决方案5. 应用例子案例 1:metabase案例 2:jenkins 记录日期:2021/5/21 1. 安全问题分析 在做服务器安全扫描时,有时会报出 jetty 的漏洞。 查看漏洞详情可知,低版本的 jetty 包含漏洞,升级 jetty 到新版本就可以修复这些漏洞。 漏洞 官方问题连接 修复版本 Eclipse Jetty HTTP请求走私漏洞(CVE-

xyp632的博客 2万+

关于内核堆溢出漏洞的分析

一、漏洞背景 CVE-2021-22555是一个存在了15年之久的内核堆溢出漏洞,它位于内核的Netfilter组件中,这个组件可以被用来实现防火墙、NAT等功能。 该漏洞在2006年由commit 9fa492cdc160cd27ce1046cb36f47d3b2b1efa21引入,并在2021年由commit b29c457a6511435960115c0f548c4360d5f4801d修复。 利用这个漏洞可以导致目标系统拒绝服务,甚至实现提权、容器逃逸并执行任意代码,危害等级极高

kali_Ma的博客 2362

漏洞学习【1】- 缓冲区溢出导致的危险

开始着手漏洞学习,发现了一个自己常犯的危险行为,用strcpy函数去拷贝没有先验证。 看如下代码: #include #include void sayHello(char * str) { char buffer[8]; strcpy(buffer, str); printf("Hello %s\n", buffer); } int main(int argc, char*

BetaBin 1308

爬虫-Playwright逆向小红书

【代码】爬虫-Playwright逆向小红书。

weixin_44201223的博客 2430

区块链安全:智能合约漏洞(重入攻击、溢出)与防护方案

漏洞影响:重入攻击可导致资金被盗(如2016年The DAO事件),溢出可破坏代币经济。实际部署前必须进行审计。综合防护采用检查-效果-交互模式防御重入。使用SafeMath或编译器内置功能防御溢出。定期审计:使用工具如MythX或Securify扫描合约。最小权限原则:限制外部合约调用。可靠性保证:以上方案基于以太坊社区标准,参考OpenZeppelin文档。开发时始终测试边界条件,确保合约安全。通过逐步应用这些措施,可显著降低智能合约风险。如需更深入分析特定案例,请提供更多细节!

asxasqwd的博客 2032

task5:在本地搭建大模型(ollama 和 LM studio 对比),接入 openclaw

关于大模型,大家千万不要想着在本地部署,根本不可行,没有那个财力。另外大模型迭代快,不可能每周都在下载大模型。再次,还是国外的模型好用,国内的模型真的在 deepresearch 上就有很大问题,你们懂的。所以本篇文章,还是聚焦在探索层面+实操,并不会实战。

这里是 AI 食用指南,持续分享有用的AI 实操和应用! 1968

Vercel部署个人博客

先去注册一个账号,建议注册一个Github账号后,使用Github账号来登录Vercel。vercel 部署静态资源网站极其方便简单,并且有可观的访问速度,最主要的是免费部署。此时项目已经成功搭建完毕了,点击图片即可跳转到 vercel 所提供的二级域名访问。然后可以直接拉取我的仓库,所有已经配置好了,可以直接使用,建议fork成自己的!然后修改dns就行,注意vercel提供的域名可能访问不了,需要自己绑定!如果有自己的域名,还可以在 vercel 中进行设置。进入Vercel官网。

醉里博客202271.xyz 2358

C语言中整型溢出的危害

整型溢出有点老生常谈了,但似乎没有引起多少人的重视。整型溢出会有可能导致缓冲区溢出,缓冲区溢出会导致各种黑客攻击。在这里写下这篇文章,希望大家都了解一下整型溢出,编译器的行为,以及如何防范,以写出更安全的代码。 什么是整型溢出 C语言的整型问题相信大家并不陌生了。对于整型溢出,分为无符号整型溢出和有符号整型溢出。 对于unsigned整型溢出,C的规范是有定义的——“溢出后的

koozxcv的博客 4515

案例分析|一篇文章带你看懂养鸡场智慧管理系统

养鸡场智慧管理系统是为了满足现代化养鸡业对精细化管理的需求而设计的一款专业软件。随着科技的发展和农业产业的升级,传统的手工记录和管理方式已无法满足高效、准确和实时的数据跟踪需求。本软件旨在通过集成各种功能模块,帮助养鸡场主实现从鸡苗孵化、饲养管理、饲料控制到销售结算等全链条的智能化操作。该系统的核心目标是提升养鸡场的运营效率和盈利能力,通过自动化数据处理,减少人工误差,节省时间和精力。例如,孵化报表和记录模块可以帮助管理者实时监控孵化过程,及时调整策略;

muyu2980的专栏 930

web服务器/中间件漏洞系列6:jetty漏洞汇总

JETTY简介: Jetty作为Eclipse基金会的一部分,是一个纯粹的基于Java的网页服务器和Java Servlet容器,其支持最新的Java Servlet API,同时支持WebSocket,SPDY,HTTP/2协议。 一、CVE-2021-28164 [34429] 敏感信息泄露 1、漏洞简介: 在Jetty9.4.37版本中,为了符合RFC3986中的规范,选择性地支持可能有歧义解释的URI,默认模式允许URL编码,简单看下RFC3986(替代RFC2396)的规定 其大致意思是:.和.

W0ngk,一个安全菜鸡,一直在模仿,尚未有超越。 2万+

PADS Logic VX2.5元件绘制全流程:从零开始创建自定义元件库

本文详细介绍了在PADS Logic VX2.5中从零开始创建自定义元件库的全流程。内容包括理解PADS独特的四库分立结构、绘制原理图符号(CAE封装)、关联PCB封装、创建元件类型以及最终的调用验证。掌握元件绘制技能能从根本上提升设计效率、确保设计规范统一,并从源头杜绝原理图与PCB之间的关联错误,是硬件工程师必备的核心能力。

oo7890的博客 441

TIA protal与SCL从入门到精通(4)——软件单元使用

平台: TIA portal 15.1 1.添加软件单元 添加软件单元如下图: 关于软件单元使用基本限制,看如下文章即可 TIA protal与SCL从入门到精通(3)——软件单元基本介绍 每个软件单元是一个独立结构,所以每个软件单元的运行方式与实际PLC类似,所以首先添加主函数块: 注意:无论系统是否是具有并发性(这里不要混淆并行与并发的概念),在PLC所有主函数执行总是按主函数依次完成...

苦走一口田 7375

Jetty Ambiguous Paths 信息泄露漏洞(CVE-2021-28164/CVE-2021-34429)

在Jetty9.4.37版本中,为了符合。称为点段,这是为了路径名层次结构中的相对引用定义的,它们在一些操作系统文件目录中分别代表当前目录和父目录,但是在Jetty中这些点段仅在URL路径中解释层次结构,在解析过程中通过解析去除一部分,所以我们在解析URL路径的时候首先需要处理.和..。针对在前端解析url编码的问题所在,我们可以选择在安全校验中可以选择将二次规范化的步骤提前至第四步来,又或者说进行多步规范化处理,虽然会耗费更多的资源但是用来根本上解决一个标准解析的问题出现也是可以接受的。

qq_62056583的博客 3034

ARFoundation系列讲解 - 手部跟踪编程

通过使用ARFoundation的手部跟踪子系统,我们可以轻松地在AR应用程序中实现与用户手部的交互。通过设置AR环境、创建场景和相机、添加手部跟踪功能以及编写相应的脚本,我们可以开始在AR场景中跟踪和操作用户的手部。在Unity中创建一个新场景,并将AR Session组件添加到场景中的一个空对象上。手部跟踪的具体实现可能因AR设备和平台的不同而有所差异,你可能需要根据你的使用情况进行一些适配和调整。当你将手部放入AR场景中时,手部跟踪系统将触发相应的事件,并调用脚本中的回调函数。

2301_79325339的博客 355

Vulhub-信息泄露

docker-compose up -d 启动环境,显示8080端口被占用修改 docker-compose.yml 中的映射端口curl 访问显示404:通过 %2e 绕过。

ssss39的博客 1922

【知识分享】单端到混合S参数转换指南

信号完整性(SI)工程师几乎总是必须使用S参数,因为许多的高速接口和行业标准都正在转向串行链路架构,并使用基于S参数测量的频域限制指标,了解其工作过程将会很有意义。

一只豌豆象的博客 1579

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

堆栈溢出漏洞:原理、利用与防范

堆栈溢出漏洞是一种常见的安全漏洞,通常发生在程序使用不安全的字符串处理函数时。当程序尝试将超过预定大小的数据写入栈上分配的内存区域时,就会导致堆栈溢出。这种漏洞可能被攻击者利用,以覆盖返回地址或其他重要数据,从而控制程序的执行流。堆栈溢出漏洞是一种严重的安全风险,攻击者可以利用它来控制程序的执行流。通过使用安全的字符串处理函数和启用多种安全机制,可以有效地防止此类漏洞的发生。定期使用工具如checksec来检查程序的安全特性,将有助于提高系统的整体安全。

weixin_42130310的博客 4399

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

缓冲区溢出漏洞学习总结(漏洞原理及其利用方法)

本文将会介绍关于缓冲区溢出类型漏洞的原理及其利用方法。因为缓冲区溢出漏洞是一个大类,这其中包含了很多种小类漏洞,故笔者专写下此篇博客,以记录自己在学习和内存相关的内容时的知识点记录以及心得体会。以下就是本篇博文的全部内容。

IronmanJay 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

中间件安全-CVE 复现&K8s&Docker&Jetty&Websphere漏洞复现

IIS,Apache,Nginx,Tomcat,Docker,K8s,Weblogic,JBoos,WebSphere,Jenkins ,GlassFish,Jetty,Jira,Struts2,Laravel,Solr,Shiro,Thinkphp,Spring,Flask,jQuery 等。Docker 容器是使用沙盒机制,是单独的系统,理论上是很安全的,通过利用某种手段,再结合执行 POC 或 EXP,就可以返回一个宿主机的高权限 Shell,并拿到宿主机的。root 权限,可以直接操作宿主机文件。

网络空间安全学习 5701

漏洞复现-Jetty WEB-INF 敏感信息泄露漏洞(CVE-2021-28164)

CVE-2021-28164 是一个影响 Jetty 9.4.37 版本的漏洞,允许攻击者通过 URL 编码的 . 字符(即 %2e)绕过路径限制,访问 WEB-INF 目录下的文件,导致敏感信息泄露。此漏洞在 Jetty 9.4.39 中被修复。

Alsn86的博客 588

kettle自带jetty漏洞处理

Jetty-server 9.4.50及之前版本,10.013及之前版本,11.0.13及之前版本,12.0.0.alpha3及之前版本。Eclipse Jetty 9.4.46及之前版本、10.0.9 及之前版本、11.0.9及之前版本。替换kettle安装目录data_integration\lib下原有jetty-util Jar包。1、kettle自带jetty存在的漏洞类型。Jetty 资源管理错误漏洞。Jetty 输入验证错误漏洞。Jetty 信息泄露漏洞。Jetty 安全漏洞。

赵得C 1555

(CVE-2021-28164/CVE-2021-34429)Eclipse Jetty WEB-INF敏感信息泄露漏洞分析

本文主要从Jetty的两个WEB-INF信息泄露漏洞CVE-2021-28164和CVE-2021-34429,来分析如何通过编码和相对路径来绕过对敏感信息的校验,以及Jetty中对URL的PATH的解析方式和存在的问题。 漏洞信息 Jetty作为Eclipse基金会的一部分,是一个纯粹的基于Java的网页服务器和Java Servlet容器,其支持最新的Java Servlet API,同时支持WebSocket,SPDY,HTTP/2协议。 在Jetty9.4.37版本...

weixin_50464560的博客 9541
上一篇: 你没看过的V神早期神文,现在读起来仍受益匪浅
下一篇: “冰封”合约背后的老牌劲敌——拒绝服务漏洞 | 漏洞解析连载之二
Inconsolabl
博客等级 码龄15年 5粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值