您现在的位置是:  > 新闻

TRON智能合约安全小课堂 | 第三期:关于波场智能合约中This.Balance需要注意的问题

作者:btc268.com 时间:2019-05-25 22:53:55 来源:区块链资讯
摘要    波场TRON|智能合约安全小课堂  随着波场 DApp 生态的不断发展,为了提高智能合约的防攻击能力,波场面向社区,征集DApp 的开源代码,结合其合约源码,并以实战的方式讲解波场智能合约开发时需要注意的一些安全细节。  ▼  欢迎来到  TRON智能合约安全小课堂  波场面向社区  征集DApp 的开源代码  结合其合约源码,以实战的方式  讲解波场智能合约开发时,需要注意的一些安全细节  本期小课堂结合两个演示性合约,继续谈一谈波场智能合约中的this.balance需要注意的问题。同时,欢迎大家关注 @Tron官方 Twitter,踊跃投稿合约代码。  下面是从https://troneye.com (以下简称 TRON-Eye)查询到的本次的合约代码。TRON-Eye 是来自社区的波场合约验证平台,之前的小课堂已经对 TRON-Eye 验证平台进行了详细的介绍。图1所示的即为本次的问题合约,MileSTOneAlpha (合约地址: TVDPg45gS1UYi4GMhhcjsiVKTMBUveVDbM)  。     图1 TRON-Eye 上的 MileStoneAlpha合约  MileStoneAlpha合约代表一个简单的游戏, 玩家可以将 500 TRX 发送给合约,希望成为第一个达到三个里程碑之一的玩家。当游戏结束时,第一个达到里程碑的人可以获得合约的部分TRX 。当达到最后的里程碑(10000 TRX)时,游戏结束,用户可以申请奖励。    图2  MileStoneAlpha的代码片段  MileStoneAlpha合约的问题出自在 [16] 行,以及相关的 [20] 行 (以及后面的 [23] 和[26] 行) 中对 this.balance 的错误使用。攻击者可以通过几种方式强行发送少量的TRX比如1 TRX给合约,以防止未来的玩家达到一个里程碑。由于所有合法玩家只能发送 500 TRX 增量,而合约收到了 1 TRX,合约的 this.balance 不再被500整除,这会阻止 [20]、[23]和[26] 行的所有条件成立,这有可能永久锁定合约中的所有奖励。这是因为 claimReward() 函数总是会revert,因为 [34] 行中的require() 会失败。  首先我们注意到MileStoneAlpha没有提供 payable 的 fallback() 函数。那么在其他合约中是无法给该合约地址 transfer()/send() TRX 的。但是,目前TRON 一共有3种方式(2种已经有的,和1种潜在的方式)能够将 TRX强行打给合约。他们是:  1. 直接对合约地址简单转账。波场相对以太坊,支持不消耗能量的免费简单转账。由于该操作仅消耗带宽,不消耗能量。所以该操作不会执行 fallback() 函数。也就是说,可以强行打给合约TRX。  2. 利用合约的自毁特性。任何合约都能够实现该 sELFdestruct(address) 功能,该功能从合约地址中删除所有字节码,并将所有存储在那里的TRX发送到参数指定的地址。如果此指定的地址也是合约,则不会调用任何功能。因此,使用 selfdestruct() 函数可以无视目标合约中存在的任何代码,强制将 TRX 发送给任一目标合约,包括没有任何payable函数的合约。  3. [潜在的方式] 波场合约地址的生成方式为sha3omit12(transactionId, nonce),理论上,攻击者是无法提前预知到将要被部署的合约地址。但是,波场即将支持 create2,来帮助在波场上构建状态通道。create2 指令的特性决定了,合约部署前,它的地址是能被提前预知的。那么,攻击者就可以先给该合约地址转账一些TRX,然后等待改合约部署即可( 听起来,合约创建者能够用这一特性来做蜜罐攻击)。  如何预防  这个问题是由于错误使用了 this.balance 导致的。那么,最好的预防方式,就是合约逻辑应该避免依赖于合约余额的确切值,因为它可以被人为地操纵。如果应用基于 this.balance 函数的逻辑语句,请确保考虑到了有不可预知的 TRX 进来。  下面就是修正了这一问题的合约,MileStoneGame (合约地址: TBw24TjBjp5fQi5ezghyi6SQJfZsaRcJQR)。    图3 TRON-Eye 上的 MileStoneGame合约  在这里,我们创建了一个新变量, depositedWei,它跟踪用户通过 pay() 投入的 TRX量,并且这也是我们执行需求和测试时用到的变量。请注意,我们不再直接使用 this.balance。  本次小课堂先讲到这里。感谢TRON-Eye 提供合约验证工具。有关他们的更多信息可以直接访问他们的官网https://troneye.com。  我们继续征集后续课堂的范例源码, 非常欢迎关注我们的官方 Twitter 踊跃投稿。  - END-    波场TRON创始人及团队介绍  (向上滑动查看内容)    由马云湖畔大学首期学员孙宇晨建立的波场TRON以推动互联网去中心化为己任,致力于为去中心化互联网搭建基础设施。旗下的TRON协议是全球最大的基于区块链的去中心化应用操作系统协议之一,为协议上的去中心化应用运行提供高吞吐,高扩展,高可靠性的底层公链支持。波场TRON还通过创新的可插拔智能合约平台为以太坊智能合约提供更好的兼容性。  自2018年7月24日起,TRON收购了位于旧金山的互联网技术公司BitTorrent Inc.。BitTorrent Inc.设计的分布式技术能够有效扩展,保持智能化,并使创作者和消费者能够控制其内容和数据。每个月有超过1.7亿人使用BitTorrent Inc.开发的产品。BitTorrent Inc.的协议每天可以传输全球40%的互联网流量。    孙宇晨,1990年生,美国常青藤盟校宾夕法尼亚大学硕士,北京大学学士。前Ripple大中华区首席代表,波场TRON创始人,BitTorrent CEO,移动社交应用陪我APP创始人兼CEO。2011年亚洲周刊封面人物,2014年达沃斯论坛全球杰出青年,2015年福布斯中国30位30岁以下创业者。2015 CNTV中国互联网年度新锐人物,2015年成为湖畔大学首批学员中唯一90后学员 。2018年7月24日起,TRON收购了位于旧金山的互联网技术公司BitTorrent Inc.成为BitTorrent Inc. CEO。    波场TRON创始人孙宇晨(Justin Sun)与波场TRON北京办公室平均年龄26岁的108位同事合照展示。目前波场TRON经过近一年的发展,已经快速成为全球增长最为强劲,扩张最为迅速的区块链团队之一,波场TRON团队目前仍然保持着每天发出一个新Offer的节奏,预计2019年年底将突破一千人!    了解波场TRON最新官方动态(向上滑动查看内容)    官网:https://tron.network    您可关注微博:波场TRON官博  https://weibo.com/u/6344553397    Facebook用户可直接访问:  https://www.facebook.com/TronFoundation-144555002795817/     Telegram进行互动可搜索:  中文 https://t.me/tronnetworkCN03英文 https://t.me/tronnetworkEN03    您可以前往Github了解更多:  https://github.com/tronprotocol    在Twitter上关注@tronfoundation,跟踪最新动态    https://www.reddit.com/r/Tronix/    

  

  波场TRON|智能合约安全小课堂

  随着波场 DApp 生态的不断发展,为了提高智能合约的防攻击能力,波场面向社区,征集DApp 的开源代码,结合其合约源码,并以实战的方式讲解波场智能合约开发时需要注意的一些安全细节。

  ▼

  欢迎来到

  TRON智能合约安全小课堂

  波场面向社区

  征集DApp 的开源代码

  结合其合约源码,以实战的方式

  讲解波场智能合约开发时,需要注意的一些安全细节

  本期小课堂结合两个演示性合约,继续谈一谈波场智能合约中的this.balance需要注意的问题。同时,欢迎大家关注 @Tron官方 Twitter,踊跃投稿合约代码。

  下面是从https://troneye.com (以下简称 TRON-Eye)查询到的本次的合约代码。TRON-Eye 是来自社区的波场合约验证平台,之前的小课堂已经对 TRON-Eye 验证平台进行了详细的介绍。图1所示的即为本次的问题合约,MileSTOneAlpha (合约地址: TVDPg45gS1UYi4GMhhcjsiVKTMBUveVDbM)  。 

  

  图1 TRON-Eye 上的 MileStoneAlpha合约

  MileStoneAlpha合约代表一个简单的游戏, 玩家可以将 500 TRX 发送给合约,希望成为第一个达到三个里程碑之一的玩家。当游戏结束时,第一个达到里程碑的人可以获得合约的部分TRX 。当达到最后的里程碑(10000 TRX)时,游戏结束,用户可以申请奖励。

  

  图2  MileStoneAlpha的代码片段

  MileStoneAlpha合约的问题出自在 [16] 行,以及相关的 [20] 行 (以及后面的 [23] 和[26] 行) 中对 this.balance 的错误使用。攻击者可以通过几种方式强行发送少量的TRX比如1 TRX给合约,以防止未来的玩家达到一个里程碑。由于所有合法玩家只能发送 500 TRX 增量,而合约收到了 1 TRX,合约的 this.balance 不再被500整除,这会阻止 [20]、[23]和[26] 行的所有条件成立,这有可能永久锁定合约中的所有奖励。这是因为 claimReward() 函数总是会revert,因为 [34] 行中的require() 会失败。

  首先我们注意到MileStoneAlpha没有提供 payable 的 fallback() 函数。那么在其他合约中是无法给该合约地址 transfer()/send() TRX 的。但是,目前TRON 一共有3种方式(2种已经有的,和1种潜在的方式)能够将 TRX强行打给合约。他们是:

  1. 直接对合约地址简单转账。波场相对以太坊,支持不消耗能量的免费简单转账。由于该操作仅消耗带宽,不消耗能量。所以该操作不会执行 fallback() 函数。也就是说,可以强行打给合约TRX。

  2. 利用合约的自毁特性。任何合约都能够实现该 sELFdestruct(address) 功能,该功能从合约地址中删除所有字节码,并将所有存储在那里的TRX发送到参数指定的地址。如果此指定的地址也是合约,则不会调用任何功能。因此,使用 selfdestruct() 函数可以无视目标合约中存在的任何代码,强制将 TRX 发送给任一目标合约,包括没有任何payable函数的合约。

  3. [潜在的方式] 波场合约地址的生成方式为sha3omit12(transactionId, nonce),理论上,攻击者是无法提前预知到将要被部署的合约地址。但是,波场即将支持 create2,来帮助在波场上构建状态通道。create2 指令的特性决定了,合约部署前,它的地址是能被提前预知的。那么,攻击者就可以先给该合约地址转账一些TRX,然后等待改合约部署即可( 听起来,合约创建者能够用这一特性来做蜜罐攻击)。

  如何预防

  这个问题是由于错误使用了 this.balance 导致的。那么,最好的预防方式,就是合约逻辑应该避免依赖于合约余额的确切值,因为它可以被人为地操纵。如果应用基于 this.balance 函数的逻辑语句,请确保考虑到了有不可预知的 TRX 进来。

  下面就是修正了这一问题的合约,MileStoneGame (合约地址: TBw24TjBjp5fQi5ezghyi6SQJfZsaRcJQR)。

  

  图3 TRON-Eye 上的 MileStoneGame合约

  在这里,我们创建了一个新变量, depositedWei,它跟踪用户通过 pay() 投入的 TRX量,并且这也是我们执行需求和测试时用到的变量。请注意,我们不再直接使用 this.balance。

  本次小课堂先讲到这里。感谢TRON-Eye 提供合约验证工具。有关他们的更多信息可以直接访问他们的官网https://troneye.com。

  我们继续征集后续课堂的范例源码, 非常欢迎关注我们的官方 Twitter 踊跃投稿。

  - END-

  

  波场TRON创始人及团队介绍

  (向上滑动查看内容)

  

  由马云湖畔大学首期学员孙宇晨建立的波场TRON以推动互联网去中心化为己任,致力于为去中心化互联网搭建基础设施。旗下的TRON协议是全球最大的基于区块链的去中心化应用操作系统协议之一,为协议上的去中心化应用运行提供高吞吐,高扩展,高可靠性的底层公链支持。波场TRON还通过创新的可插拔智能合约平台为以太坊智能合约提供更好的兼容性。

  自2018年7月24日起,TRON收购了位于旧金山的互联网技术公司BitTorrent Inc.。BitTorrent Inc.设计的分布式技术能够有效扩展,保持智能化,并使创作者和消费者能够控制其内容和数据。每个月有超过1.7亿人使用BitTorrent Inc.开发的产品。BitTorrent Inc.的协议每天可以传输全球40%的互联网流量。

  

  孙宇晨,1990年生,美国常青藤盟校宾夕法尼亚大学硕士,北京大学学士。
前Ripple大中华区首席代表,波场TRON创始人,BitTorrent CEO,移动社交应用陪我APP创始人兼CEO。
2011年亚洲周刊封面人物,2014年达沃斯论坛全球杰出青年,2015年福布斯中国30位30岁以下创业者。
2015 CNTV中国互联网年度新锐人物,2015年成为湖畔大学首批学员中唯一90后学员 。
2018年7月24日起,TRON收购了位于旧金山的互联网技术公司BitTorrent Inc.成为BitTorrent Inc. CEO。

  

  波场TRON创始人孙宇晨(Justin Sun)与波场TRON北京办公室平均年龄26岁的108位同事合照展示。目前波场TRON经过近一年的发展,已经快速成为全球增长最为强劲,扩张最为迅速的区块链团队之一,波场TRON团队目前仍然保持着每天发出一个新Offer的节奏,预计2019年年底将突破一千人!

  

  了解波场TRON最新官方动态

(向上滑动查看内容)

  

  官网:https://tron.network

  

  您可关注微博:波场TRON官博

  https://weibo.com/u/6344553397

  

  Facebook用户可直接访问:

  https://www.facebook.com/TronFoundation-144555002795817/ 

  

  Telegram进行互动可搜索:

  中文 https://t.me/tronnetworkCN03
英文 https://t.me/tronnetworkEN03

  

  您可以前往Github了解更多:

  https://github.com/tronprotocol

  

  在Twitter上关注@tronfoundation,跟踪最新动态

  

  https://www.reddit.com/r/Tronix/

  

  

转载请注明来自炒数字货币(www.szhb5.com),提供数字货币最新消息、数字货币投资入门与数字货币技术分享

本文标题:TRON智能合约安全小课堂 | 第三期:关于波场智能合约中This.Balance需要注意的问题

原文地址:https://www.szhb5.com/news/3279.html

关键词: