安全,区块链领域举足轻重的话题,为什么一行代码能瞬间蒸发几十亿市值?合约底层函数的使用不当会引起哪些漏洞?可注入call漏洞和delegatecall误用漏洞会导致什么风险?

「区块链大本营」携手「链安科技」团队重磅推出「合约安全漏洞解析连载」,以讲故事的方式,带你回顾区块链安全走过的历程;分析漏洞背后的玄机。让开发者在趣味中学习,写出更加牢固的合约,且防患于未然。

当然,这些文章并不是专为开发者而作的,即使你不是开发者,当你读完本连载,相信再有安全问题爆出时,你会有全新的理解。

引子:阵有纵横,天衡为梁,地轴为柱。梁柱以精兵为之,故观其阵,则知精兵之所有。共战他敌时,频更其阵,暗中抽换其精兵,或竟代其为梁柱,势成阵塌,遂兼其兵。并此敌以击他敌之首策 —— 《三十六计第二十五计之偷梁换柱》

却说“重入”“竞态”里应外合币穷财尽,“交互”“限制”强强联手链泰民安,锁定关键变量,应用内置函数,不留可乘之机。

没看过的请戳:合约安全漏洞连载之三

本回咱们聊聊:

底层函数调用险象环生

外部功能慎用防患未然

时至今日,加密货币市场价值富可敌国,已达3000亿美元,是加拿大最大银行RBC两倍有余。行情较好的加密货币蕴含大量的资本,在数字交易所中这座“金库”中大放光彩,犹如璀璨夺目的宝石。但同时也吸引了众多行走江湖的黑客神偷。为此,合约的安全成为重中之重,迭代扩展后的新协议带来的不一定是严丝合缝的守护,也可能有意想不到的疏漏,无孔不入的黑客便试图寻找衔接处的缝隙。

今天我们来说说关于底层函数调用时产生的隐患:可注入call漏洞和delegatecall误用漏洞

事件回顾

2018年5月11日, 人工智能项目方ATN发现其代币ATN Token供应量发生异常,市场上流通的代币无故增加了1100万个。并且黑客在完事之后还不忘隐藏踪迹,归还了权限地址,并且将偷来的Token分发到14个账户地址当中,试图掩人耳目。

好在项目方及时采取了措施,定位了所有可疑账户并采用了冻结销毁等措施,才维持住代币市场的稳定运行。

ATN项目方为了实现代币互换,权限扩展以及控制,合约升级三个新型的功能,采用的是更新的ERC223协议来开发智能合约,并且使用了DS-auth库[1]。按理说双剑合璧能使功能性的提升颇有成效,却被始料未及的攻击泼了一盆冷水。

追根溯源,主要问题出在代币互换的实现——call函数,即合约外部调用函数的实现过程中。

合约外部调用在最近的游戏智能合约中使用广泛,因为这样能够提高代码复用率,简化代码。最新的MyCryptoChamp游戏漏洞就源于合约内部算法生成的随机数可被预测,没有调用外部可靠的随机数生成模块。所以合约外部调用还是很实用的一项功能,但是利是弊就要看合约编写者的功力了。

何为合约外部调用

专业的来说,calldelegatecall函数让 Ethereum开发者将他们的代码模块化(Modularise)。用 call函数来处理对合约的外部标准信息调用(Standard MessageCall)时,代码在外部函数的环境中运行。delegate函数也是标准消息调用,但在目标地址中的代码会在调用合约的环境下运行,也就是说,保持msg.sender 和 msg.value不变。该功能支持实现库,开发人员可以为未来的合约创建可重用的代码。

通俗的来说,它是一个合约调用另一个合约某些功能的方式[2]

拿西游记打个比方:

话说唐僧去西天取经途中遇到了法力高强的妖怪,要过这一难,必须孙大圣出马,于是八戒和沙僧去花果山搬救兵请猴子。

但是如果请来的那位并不是悟空,而是假猴王六耳猕猴,可能不光妖怪降服不了,师傅都会被拐跑。

这就是黑客用来投机倒把的伎俩,利用跨合约调用这个过程偷梁换柱,打入合约内部。我们来看具体案例的分析。

漏洞分析以及详细修复建议

1.可注入call漏洞

漏洞分析

call是以太坊智能合约编写语言Solidity提供的底层函数,用来与外部合约或者库进行交互。此类函数使用时需要对调用参数的安全性进行判定,建议谨慎使用。

案例

receiver,_custom_fallback,_from, _amount,_data是由用户控制的,也就是说用户可以控制整个call调用,包括调用的合约地址(receiver),调用哪个函数(_custom_fallback),以及传递的参数(_from,_amount,_data),这实际上是很危险的。在ATN事件中攻击者通过指定receiver为案例合约地址,利用DS-Auth授权,调用合约自身的函数,从而获得了合约的控制权[3]

此外,下面是ERC223标准的另一个call错误实现[4]

这种合约本身允许用户自定义 call() 任意地址上任意函数的设计,十分危险。攻击者可以很容易地借用当前合约的身份来进行任何操作。可能导致如下后果:

1)允许攻击者以缺陷合约身份来盗走其它 Token 合约中的 Token

2)与 ds-auth 之类的鉴权机制结合,绕过合约自身的权限检查

3)允许攻击者以缺陷合约身份来盗走其它 Token 账户所授权(Approve)的Token

4)攻击者可传入虚假数据(_data)欺骗 Receiver 合约

漏洞修复

1)推荐使用如下方式调用tokenFallback函数

2)DS-Auth在设置权限的时候,不要把合约本身地址加入白名单

2.delegatecall误用漏洞

漏洞分析

DELEGATECALL会保持调用环境不变的属性表明,构建无漏洞的定制库并不像人们想象的那么容易。库中的代码本身可以是安全的,无漏洞的,但是当在另一个应用的环境中运行时,可能会出现新的漏洞。

案例

案例代码来源于Ethernaut第6关[5]

在主合约Delegation的fallback函数中,可通过delegatecall调用Delegate合约的函数,并在主合约环境下执行,如果msg.data是0xdd365b8b(pwn()的函数签名),即调用Delegate的pwn函数,那么消息发起者就可以变成主合约的owner[6]

漏洞修复

Solidity 为实现库合约提供了关键字 library (参见 SolidityDocs 了解更多详情)。这确保了library 是无状态(Stateless)且不可自毁的。强制让library 成为无状态的,可以缓解本节所述的存储环境的复杂性。无状态library 还可以防止攻击者直接修改library 状态以实现对依赖于library 代码的合约的攻击。在使用时 DELEGATECALL 时要特别注意库合约和调用合约可能对状态变量进行修改,并且尽可能构建无状态library 。

真假难辨,如何防范

黑客千方百计试图欺骗合约,或无所不用其极地打开合约的后门,对合约的安全开发过程是一个严峻的考验,从内部和外部我们可以做到以下两点进行防范:

跨合约调用时,要慎用外部函数,周全考虑可能的调用风险,及时添补相应函数和规则,杜绝外患。

内部权限设置必须考虑可能的权限被夺取的情况,从代码逻辑性和功能准确性全方面进行考量。

智能合约的安全规则终将会在安全团队与黑客的较量中不断完善,我们要做好打持久战的准备。

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

也可以扫码下载:

次回予告:

地址恢复功亏一篑

身份判断轻虑浅谋

逻辑补全自圆其说

原理辨析帷幄运筹

偷天换日合约易主,地址变脸移花接木——底层函数误用漏洞 | 漏洞分析连载之四相关推荐

  1. 偷天换日合约易主,地址变脸移花接木——底层函数误用漏洞 | 漏洞分析连载之四...

    安全,区块链领域举足轻重的话题,为什么一行代码能瞬间蒸发几十亿市值?合约底层函数的使用不当会引起哪些漏洞?可注入call漏洞和delegatecall误用漏洞会导致什么风险? 「区块链大本营」携手「链 ...

  2. 以太坊漏洞分析————4、底层函数误用漏洞

    引子:阵有纵横,天衡为梁,地轴为柱.梁柱以精兵为之,故观其阵,则知精兵之所有.共战他敌时,频更其阵,暗中抽换其精兵,或竟代其为梁柱,势成阵塌,遂兼其兵.并此敌以击他敌之首策 --<三十六计第二十 ...

  3. linux权限整改,Linux底层函数库glibc漏洞核查整改指引

    一. 漏洞概要 近日,Linux底层函数glibc 的 DNS 客户端解析器被发现存在基于栈的缓冲区溢出漏洞.攻击者可借助特制的域名. DNS 服务器或中间人攻击利用该漏洞执行任意代码,甚至控制整个系 ...

  4. 确认过眼神,地址不是对的人—— 权限验证错误 | 漏洞分析连载之五

    引子:横看成岭侧成峰,远近高低各不同.不识庐山真面目,只缘身在此山中. -- <题西林壁>苏轼 上回说到 : 底层函数调用险象环生, 外部功能慎用防患未然, 真假难辨黑客诡计多端, 完善规 ...

  5. 2021 OWASP Top 10 榜单(初稿)发布,头牌易主

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 OWASP Top 10 榜单列出的是最危险的 web 漏洞,时隔四年且十多年以来,该榜单霸主易主. OWASP Top 10 榜单创建于21世 ...

  6. 中国第二大传感器企业宝座易主!14家公司新上市!国产传感器风起云涌!(附最新市值排名榜单)

    ​据工信部中国电子信息产业发展研究院下属的赛迪顾问统计数据显示,2021年全球传感器市场规模达到1710.3亿美元(约合11819亿人民币),过去三年(2019-2022)平均增长率为7.1%,其中, ...

  7. 中国首富或将易主,5500个富豪即将诞生!

    中国首富或将易主,5500位富豪即将诞生! 大家都知道,目前中国的富豪是在马云.马化腾.王健林.许家印几个人之间来回变动,目前马化腾暂居首富位置,不过这个首富位置估计坐不了多久了,不久的将来有可能被雷 ...

  8. Debian下IPv6设定主地址 Set primary IPv6 address under Debian Linux

    Linux下选择IPv6主地址是按照一定规则来的 #RFC3484 (davidc) Prefer same address. (i.e. destination is local machine) ...

  9. 企业版Java EE正式易主 甲骨文再次放手

    有人说甲骨文收购的东西大多没有了好下场,这么说虽然有些片面,但是最近一个月Java EE和Solaris的境遇难免让人产生类似的联想. 继笔者上次报道<甲骨文将放弃Java EE 开源基金会双手 ...

最新文章

  1. node.js是做什么的?
  2. Openlayers 2.X加载高德地图
  3. Android开源框架——依赖注入ButterKnife
  4. php搜索文件名,php实现按文件名搜索文件的远程文件查找器
  5. Go的RESTful
  6. 活体检测方法概述与总结
  7. CentOS6下ssh简介及openssh的应用
  8. 长路漫漫,唯剑作伴--loadView、viewDidLoad及viewDidUnload的关系
  9. 在演唱过后的飞秋代码
  10. 如何编写代码解决问题,初学者指南
  11. 盒子浮动的重要性及对其它元素的影响
  12. java java se_Java SE 9:尝试资源改进
  13. e.detail.value 小程序如何传值
  14. Oracle EBS使用adpatch工具打patch过程 hotpatch mode
  15. 4.7/4.8 磁盘挂载
  16. 【C语言】求两个数的最大公约数
  17. HTML5利用canvas画布绘制哆啦A梦
  18. 计算机,我该学什么?
  19. 蒙特卡洛树搜索(The monte carlo search tree)
  20. 【Windows编程】实时捕捉屏幕

热门文章

  1. gradle-5.4.1-all gradle-6.1.1.all.zip下载包
  2. React Native性能优化总结
  3. Android 信号查看,安卓Android手机怎么快速查看系统信号强度
  4. UBER司机奖励政策
  5. 全面了解Windows Server 2003 和 Windows XP 附带的系统服务
  6. 计算机职称证书退休工资,职称就像是一座大山,相同教龄不同职称的教师退休工资相差多少?...
  7. Andorid中使用Gson和Fast-json解析库解析JSON数据---第三方库学习笔记(二)
  8. IT创业网赚项目 - 做视频网赚项目,选择好平台很重要!
  9. linux dd copy all partitions,dd 命令详解
  10. 【STM32】PWM输出原理