木星链 木星链
Ctrl+D收藏木星链
首页 > 瑞波币 > 正文

ERN:智能合约安全实践(一)| Fallback函数“越俎代庖”分析

作者:

时间:1900/1/1 0:00:00

引子:“庖人虽不治庖,尸、祝不越樽俎而代之矣。”?--《庄子·逍遥游》

古时候,有一位杰出的领袖名叫唐尧。

他所治理的地区人们安居乐业,但是他听闻隐士许由十分有才干,便萌生了将领导权让给许由的想法。但是许由拒绝了,并说出了这样一段话“鹪鹩巢于深林,不过一枝。”

至此,后人也用越俎代庖一词来表达越权的含义。

“越俎代庖”

在智能合约的实现中存在着访问权限,如果权限设置不合理,很容易造成智能合约被攻击,严重的还会造成巨大的经济损失。

成都链安-安全实验室对于智能合约安全有着丰富的经验和积累,但随着区块链技术越来越受重视,智能合约的数量也越来越多,随之而来的智能合约被攻击事件也越来越多,也让我们感受到了“让区块链更安全”的企业使命是多么的重要,但是一己之力难于对抗所有的威胁。

接下来,我们将会把自己的安全经验积累通过与智能合约CTF靶场ethernaut相结合,通过技术连载的方式向广大智能合约开发者普及在开发过程中,如何实现更安全的代码。

神话起源CEO谈毅:以太坊GAS和速度以及智能合约是未来突破的方向:金色财经现场报道,在8月8日由金色财经主办的金色沙龙活动中,神话起源CEO谈毅在主题《哪些Web3叙事将引领下轮牛市》的圆桌会议中表示,以太坊有三个大家可以关注的点,以及存在的核心价值。一个是GAS,一个是速度,一个是智能合约,这是以太坊做这么大的核心。换句话说,未来的突破也在这三个方向上。

以GAS和速度为例,一个是2.0的升级,今年下半年能不能如期推出,推出以后的效果,能不能像人们预期的那样。这有可能是一下子给加密资产带来一个新的台阶。做L2的团队,也在L2层面上解决这个问题,一个是速度,一个是GAS。第三个是智能合约,以太坊就是行业标准。它从NFT开始,ERC-721以后,还有EIP-1159,今年好像也有新的智能合约的协议会提交出来做审核。所以如果从这三个点上突破的话,以太坊的价值和生态能进一步的扩大和提升。尤其是智能合约。今年可以看到有很多创新想法,随着NFT往下发展,在用新的智能合约做,这都是以太坊可以关注的点。

此外,他还表示,游戏资产能天然跟区块链做融合,既符合有非常大的资产价格波动性,又是可触及的。通过可触及的方式,让更多的圈外人进来。[2023/8/8 21:32:31]

MEXC已经完成BitTorrent(BTT)智能合约置换、代币增量及重新命名:据最新消息,MEXC已经完成BitTorrent(BTT)智能合约置换、代币增量及重新命名。所有MEXC用户持有的BTT旧代币已经被转换为BTT新代币,BTT旧代币被命名为“BTTOLD”,BTT新代币被命名为“BTT”。

BitTorrent Chain 是异构链跨链互操作扩容协议,采用 POS(Proof of Stake)共识机制 ,通过侧链进行智能合约的扩展。首发支持 Ethereum 、TRON 、BSC 公链跨链。[2022/1/18 8:57:03]

现在我们就来聊一聊ethernaut靶场的第一题Fallback,

代码函数“越俎代庖”的事件。

一、权限漏洞简介

越权漏洞是指在智能合约中,因函数可见性设置不合理或函数缺乏有效的验证导致本不能调用某一函数的用户通过直接或者绕过验证的方式成功调用该函数。

该漏洞可被单独利用,也可能结合其他漏洞进行组合攻击,利用方式简单,漏洞影响视存在漏洞的函数而定,可能对合约造成毁灭性打击。

二、Fallback“越俎代庖”

漏洞原理详细分析

2.1合约中的“俎”与“庖”

如何理解合约中的“俎”与“庖”呢?先来看一段合约代码,如下图所示:

报告:以太坊的拥堵和高额费用刺激了对具有类似智能合约功能但吞吐量更快的网络的需求:金色财经报道,CoinDesk Research将放弃其第三季度的季度回顾,该报告指出,尽管以太坊在最近 9 月的份额高于自 2017 年以来该系列中的任何时间,但所有其他区块链的份额是过去五个 9 月中最高的。正如 Kaloudis 和 Oosterbaan 在整个报告中指出的那样,替代第 1 层(L1)区块链越来越受欢迎,因为以太坊的拥堵和高额费用刺激了对具有类似智能合约功能但吞吐量更快的网络的需求。 这种需求反映在这些 L1 网络的本地货币的市值和其去中心化金融 (DeFi) 协议中的总锁定价值 (TVL) 或投资资金中。Cardano 的 ADA、Binance Smart Chain 的 BNB、Solana 的 SOL、Avalanche 的 AVAX 和 Terra 的 LUNA 现在按市值排名前 12 位。(CoinDesk)[2021/10/4 17:22:23]

图1

以太坊智能合约开发工具Truffle发布5.1.37版本:以太坊智能合约开发工具Truffle宣布发布Truffle 5.1.37版本。该版本包括语法高亮,可用于Solidity 0.7.0和更好地识别已验证合约。[2020/8/1]

这一段合约代码出自ethernaut靶场的第一题Fallback。针对于靶场中的问题,解题思路是通过调用回调函数function()payablepublic来触发owner=msg.sender;,使得合约的所有者变成调用者。

题目非常的简单,只要向此合约发起一笔交易,且满足require的条件就可触发fallback函数。

正常情况下,在对一个合约调用中,如果没有其他函数与给定的函数标识符匹配,或者没有提供附加数据,那么fallback函数会被执行。一般是作为转入以太币的默认操作。所以智能合约开发时一般是不需要将owner=msg.sender写到fallback函数中的。

如下图所示:

独家 | 昨日新增146个代币型智能合约 DOJC Tier 1 RECWAVES和FoMo6D风险最高:第三方大数据评级机构RatingToken最新数据显示,2018年8月26日全球共新增761个合约地址,其中146个为代币型智能合约。\t

\t

在RatingToken同时发布的“新增代币型智能合约风险榜”中,DOJC Tier 1、RECWAVES(RW)和FoMo6D(F6D)风险最高排名前三,其中DOJC Tier 1存在47个安全风险,检测得分为2.14。此外,其他登上该风险榜TOP10的还包括GoldenMoon(GMOON)、COSSE Coin(COSSE)、CM Coin(CMC)、Infinity(Inf)、Hotto(HT)、WIOT(WIOT)和凱崴幣(KW Coin)。如需查看更多智能合约检测结果,请查看原文链接。[2018/8/27]

图2

然而,在这里本不该被用户调用的owner=msg.sender被调用了,导致权限控制不当,产生了越权,“俎”与“庖”就这样发生了接下来的故事。

2.2相关安全事件

2.2.1Bancor合约事件

2020年6月18日,Bancornetwork被爆出存在漏洞。

漏洞产生的原因是合约中存在一个public的safeTransferFrom方法,使得攻击者可以直接调用此方法授权给Bancornetwork合约的代币转出到任意账户。

其关于转账和授权的三个函数权限均为public,这使得任何用户都能对其进行调用。本次事件涉及资金50W余美元。

详细代码如下图所示:

图3

权限为public的safeTransferFrom方法这个“奸臣”并没有得到Bancor合约“国王”的许可,直接夺走了“国家”的“财政大权”。

幸而Bancornetwork团队和白帽首先发现了此问题,并对资金进行了转移。在后续也对该漏洞进行了修复,才得以避免损失。

详细分析见

而同样的事件也在另外一个合约中上演,接下来我们将介绍6月底的VETH合约漏洞事件。

2.2.2VETH项目事件

2020年6月30,VETH项目被爆出漏洞。本次事件中“越俎代庖”的主角则是合约中的changeExcluded函数的external修饰符。

external修饰符使得任何人都可以调用changeExcluded函数来绕过transferFrom函数内部的授权转账额度检查,将合约的VETH代币盗走。

此次事件,攻击者利用此漏洞盗走919299个VETH后大量抛售,导致VETH代币价值瞬间流失。

详细见涉及到的合约代码如下图所示:

图4

通过以上两个案例,相信大家已经意识到了合约中“越俎代庖”事件的严重影响,那么如何在合约代码编写的过程中有效的区分“俎”与“庖”呢?

2.3“俎”、“庖”信息大揭秘

针对越权事件,首先需要合约开发人员了解函数可见性。

函数的可见性,一共有external、public、internal和private四种:

-External

外部函数作为合约接口的一部分,意味着我们可以从其他合约和交易中调用。一个外部函数f不能从内部调用。当收到大量数据的时候,外部函数有时候会更有效率,因为数据不会从calldata复制到内存.

-Public

public函数是合约接口的一部分,可以在内部或通过消息调用。对于public状态变量,会自动生成一个getter函数。

-Internal

这些函数和状态变量只能是内部访问,不使用this调用。

-Private

private函数和状态变量仅在当前定义它们的合约中使用,并且不能被派生合约使用。

开发人员在构造一个函数时,应当遵循这些可见性进行开发,要明确哪些函数是可以由用户调用的“俎”,而哪些又是合约中不能任意替代的“庖”,以最小原则进行分配。

比如一个函数safeTransfer在设计时是用于转账操作的,用户可以通过调用此函数,转账此合约发行的代币。我们使用public和external都可以满足需求,但就安全的角度,我们应当使用external,避免合约内对此函数进行调用,造成不可预期的风险。

如存在有一个safeTransferFrom函数,用户可以通过授权给此合约其他代币,将其他代币转移到一个指定地址的,当_token等于合约本身时,就会以合约本身的身份调用sadeTransfer函数,即而将合约内的钱转到其他地址。

图5

然而只是遵循函数可见性是远远不够的,函数的可见性,只是区分了合约内部、继承合约和外部这三个界限,远远不能满足我们的需求。

想要达到较为完善的权限管理,我们应当引入“角色”的概念,如:管理员、普通用户、特权用户等。在合约中存储这些角色的地址,通过判断地址或标志变量来进行权限的控制。

如下图所示:

图6

通过修饰器对这些不同的“角色”进行管理,如使用onlyOwner修饰器,限制特定的地址才可调用此函数。对应“角色”的权限管理。使用修饰器的方式,可以更加清晰的判断出是否存在纰漏。

三、安全总结

就链上现状来看,智能合约权限管理错误造成的漏洞比比皆是,其中不乏很多“著名项目”,而此类漏洞造成的损失也是巨大的。

成都链安安全团队依据多年合约审计和链上分析安全经验给出以下几点建议:

1、遵循权限最小化开发原则,在设计函数时应当就规划好可见性。

2、建立角色机制,使用修饰器对各函数进行权限管理,避免纰漏。

3、上线前一定找专业机构做好代码审计,正所谓“一人一个脑,做事没商讨;十人十个脑,办法一大套”。

标签:ERNTER以太坊ETHReflexer Ungovernance Tokenmaster币种以太坊官网app下载注册EETH币

瑞波币热门资讯
区块链:观察 | 5省发布区块链发展政策:金融、政务、跨境电商等为重点领域

本文来源:澎湃新闻,作者:澎湃新闻见习记者叶映荷2020年,区块链春风不止。年度热词“区块链”不仅被频繁“挂在嘴边”,还落于纸上,纷纷“化身”为各地政府出台的专项政策.

1900/1/1 0:00:00
区块链:关于DC/EP和区块链,十二届陆家嘴论坛上都说了什么?

“陆家嘴论坛”是一个金融领域的专业性论坛,致力于加强中国与世界金融体系的双向融合,深化中国金融改革,促进上海国际金融中心建设,提升中国在国际金融市场的地位.

1900/1/1 0:00:00
FIL:Filecoin主网预产 催生「无币有市」泡沫

作者|凯尔编辑|文刀Filecoin测试网的第二阶段已进行12天,屡次跳票的Filecoin主网进入?“预产期”,官方给出的最新时间为8月份.

1900/1/1 0:00:00
Tezos:Tezos、Polkadot 以及以太坊之间的区块链治理之战

来源/LongHash近日Kusama社区进行了变更Polkadot原生代币DOT货币单位的公投,即按照1:100比例更改DOT的计数单位,此事曾引爆币圈话题。最终的公投结果非常戏剧化.

1900/1/1 0:00:00
区块链:杭州区块链国际周 | Circle CEO:我们距离全球数字货币大规模普及只有1年时间了

7月5日上午9点,由杭州市余杭区政府指导,杭州未来科技城管委会、巴比特主办的“2020杭州区块链国际周”正式开幕.

1900/1/1 0:00:00
COIN:Coinbase首席税务官:由于加密税法的不确定性,资本将逃离美国

美国最大的加密货币交易所Coinbase认为,在加密货币监管和税收方面,其他国家比美国更开放。Coinbase首席税务官LawrenceZlatkin在7月7日的Unitize小组讨论上分享了该.

1900/1/1 0:00:00