您的位置:首页 > 互联网 >

UsdtBank合约易被发起回退攻击 能够将余额转到另一地址

2019-05-13 17:11:59 来源: 波场TRON

随着波场 DApp 生态的不断发展, DApp开发者和用户的数量急速增长,经济利益的迅速累积,提高智能合约的防攻击能力,越来越成DApp 开发的一个

随着波场 DApp 生态的不断发展, DApp开发者和用户的数量急速增长,经济利益的迅速累积,提高智能合约的防攻击能力,越来越成DApp 开发的一个重要考量。因此,波场面向社区,征集DApp 的开源代码,结合其合约源码,以实战的方式,讲解波场智能合约开发时,需要注意的一些安全细节。

本期小课堂征集到的是 TRON-Rich 团队的 UsdtBank合约。在分析合约之前的首要事情,就是通过合约验证平台,验证其为真的开源合约。接下来先用小段篇幅对社区的https://troneye.com (以下简称 TRON-Eye)进行解析,以选定合约验证平台。

合约验证的原理在于,Solidity 合约编译后的 bytecode 由可执行bytecode 以及meta-hash两部分组成,同一份合约源码在相同编译环境下多次编译,产生的 bytecode 相同,正确的合约验证方法,应该比对bytecode,从而验证源码是否和链上合约完全一致。

TRON-Eye详细阐述了其验证思路,同时还在合约源码展示页支持用户自行编译bytecode并比对,提高了公信力。因此,我们选定 TRON-Eye 作为小课堂的验证平台,校验合约是否真正开源。

图2所示的,即为本次待考察合约 ,TRON-Rich 团队的UsdtBank合约代码。接下来就对其源码,进行安全角度的详细解读。

如非必要, 应该禁止被其他合约调用

允许被其他合约调用, 容易被发起回退攻击,尤其是即时返回结果的下注类游戏。攻击合约可以在其合约函数中调用目标合约,如果目标合约立即返回结果,当攻击合约发现返回的结果对自己不利时,主动 revert,回退交易。从而实现“只赢不输”。

/*

* only human is allowed to call this contract

*/

modifier isHuman() {

require((bytes32(msg.sender)) == (bytes32(tx.origin)));

_;

}

UsdtBank 采用了上述代码,判断是否是合约,其原理就是,如果是合约调用的话,msg.sender 是外层合约地址,但是 tx.origin 是合约调用者。当然这段代码先将 address强转 bytes32,浪费了能量,建议直接采用 msg.sender == tx.origin 即可。

function invest(uint256 _referrerCode, uint256 _planId, uint256 _value) public whenNotPaused isHuman {

if (_invest(msg.sender, _planId, _referrerCode, _value)) {

emit onInvest(msg.sender, _value);

}

}

判断一个地址是否是合约地址

下面是 UsdtBank 使用这个modifier 的方式,可以发现,这个 modifier 仅适合用来限制被调用方是普通用户。那么如果需要判断某个传入的address 参数是人,而不是合约,则需要使用另外一种方式。

function isContract(address account) internal view returns (bool) {

uint256 size;

assembly { size := extcodesize(account) }

return size > 0;

}

Q: 那么为什么 isHuman() 这个 modifier 不使用这种方式呢?

A: 这是因为,通过 extcodesize 方式判断一个地址是否是合约地址,并不准确。当在其他合约的构造函数中读取extcodesize时,这个值总是0.

More: 波场已经提交了一个关于增加 address.type 的 TIP,可以直观准确的判断一个地址类型,欢迎参与该 TIP 的讨论。

小结论:要想完整限制合约中的调用者,以及合约中的地址参数为 Human,目前最好的方式,是结合前述的 isHuman() modifier 以及 isContract().

怎么通过合约,处理TRC20的转账

本期选择 UsdtBank 讲解的一个重要原因是,UsdtBank 是一个支持 USDT参与投注的合约,有助于推广使用TRC20投注游戏合约的正确姿势。

UsdtBank 和 USDT 投注相关的有如下一些代码:

ITRC20 public usdtAddr_;

function setUsdtAddr(address _usdtAddr) public onlyOwner {

require(address(usdtAddr_) == address(0x00));

require(address(_usdtAddr) != address(0x00));

usdtAddr_ = ITRC20(_usdtAddr);

}

上述代码表示,usdtAddress 仅允许初始化的时候,设置一次(谢绝跑路 ^_^)。

function _invest(address _addr, uint256 _planId, uint256 _referrerCode, uint256 _amount)

private

notContract(_addr)

returns (bool)

{

usdtAddr_.transferFrom(_addr, address(this), _amount);

….

}

由于 TRC20 token 相对 TRX以及 TRC10 token 最大的区别在于,TRX 和 TRC10 的balance存储于address 的 account 中,而 TRC20 token 的 balance存储在 TRC20合约里。直接调用 TRC20合约的 transfer 函数,虽然能够将自己的余额转到另外一个地址名下,但事实上只是在 TRC20合约里发生了两者balance 字段值的修改。所以采用 标准TRC20下注,必须使用 Approve 和 TransferFrom 两步分开的方式。虽然这会导致用户签名两次。

关键词: UsdtBank合约 回退攻击 余额

精选 导读

募资55亿港元万物云启动招股 预计9月29日登陆港交所主板

万科9月19日早间公告,万物云当日启动招股,预计发行价介乎每股47 1港元至52 7港元,预计9月29日登陆港交所主板。按发行1 167亿股计算,万

发布时间: 2022-09-20 10:39
管理   2022-09-20

公募基金二季度持股情况曝光 隐形重仓股多为高端制造业

随着半年报披露收官,公募基金二季度持股情况曝光。截至今年二季度末,公募基金全市场基金总数为9794只,资产净值为269454 75亿元,同比上

发布时间: 2022-09-02 10:45
资讯   2022-09-02

又有上市公司宣布变卖房产 上市公司粉饰财报动作不断

再有上市公司宣布变卖房产。四川长虹25日称,拟以1 66亿元的转让底价挂牌出售31套房产。今年以来,A股公司出售房产不断。根据记者不完全统

发布时间: 2022-08-26 09:44
资讯   2022-08-26

16天12连板大港股份回复深交所关注函 股份继续冲高

回复交易所关注函后,大港股份继续冲高。8月11日大港股份高开,随后震荡走高,接近收盘时触及涨停,报20 2元 股。值得一提的是,在7月21日

发布时间: 2022-08-12 09:56
资讯   2022-08-12

万家基金再添第二大股东 中泰证券拟受让11%基金股权

7月13日,中泰证券发布公告,拟受让齐河众鑫投资有限公司(以下简称齐河众鑫)所持有的万家基金11%的股权,交易双方共同确定本次交易的标的资

发布时间: 2022-07-14 09:39
管理   2022-07-14

央行连续7日每天30亿元逆回购 对债市影响如何?

央行12日再次开展了30亿元逆回购操作,中标利率2 10%。这已是央行连续7日每天仅进行30亿元的逆回购缩量投放,创下去年1月以来的最低操作规

发布时间: 2022-07-13 09:38
资讯   2022-07-13

美元指数创近20年新高 黄金期货创出逾9个月新低

由于对美联储激进加息的担忧,美元指数11日大涨近1%创出近20年新高。受此影响,欧美股市、大宗商品均走弱,而黄金期货创出逾9个月新低。美

发布时间: 2022-07-13 09:36
资讯   2022-07-13

美股三大股指全线下跌 纳斯达克跌幅创下记录以来最大跌幅

今年上半年,美股持续回落。数据显示,道琼斯指数上半年下跌15 3%,纳斯达克综合指数下跌29 5%,标普500指数下跌20 6%。其中,纳斯达克连续

发布时间: 2022-07-04 09:51
推荐   2022-07-04

融资客热情回升 两市融资余额月内增加超344亿元

近期A股走强,沪指6月以来上涨4%,融资客热情明显回升。数据显示,截至6月16日,两市融资余额1 479万亿元,月内增加344 67亿元,最近一个半

发布时间: 2022-06-20 09:41
资讯   2022-06-20

4个交易日净买入超百亿元 北向资金持续流入A股市场

北向资金净流入态势延续。继6月15日净买入133 59亿元后,北向资金6月16日净买入44 52亿元。自5月27日至今,除6月13日以外,北向资金累计净

发布时间: 2022-06-17 09:37
推荐   2022-06-17