宇宙链 宇宙链
Ctrl+D收藏宇宙链
首页 > PEPE > 正文

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

作者:

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

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

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

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

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

“越俎代庖”

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

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

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

智能合约审计平台Sherlock完成400万美元种子轮融资,Archetype领投:9月14日消息,智能合约审计平台Sherlock完成400万美元种子轮融资,Archetype领投,Spartan、Lattice、CoinFund等参投。新资金将用于组建团队并为Sherlock平台的外部审计提供资金。(CoinDesk)[2022/9/14 13:30:09]

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

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

一、权限漏洞简介

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

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

二、Fallback“越俎代庖”

Yuga Labs元宇宙项目Otherside高铸币成本或因未优化智能合约代码导致:金色财经报道,据 cryptobriefing 披露,Yuga Labs元宇宙项目Otherside高铸币成本或因未优化智能合约代码导致。Hungry Wolves NFT 联合创始人、BYAC #3987 持有人 Adam Hollander 指出,Yuga Labs 将责任归咎于以太坊,但其实他们应该优化合约,为满足 KYC 要求的人提供铸币窗口,让他们有足够的时间和保证完成铸币。律动此前报道, Otherside在虚拟地块 Otherdeed 销售活动中的5.5万枚NFT铸造公消耗了60234 ETH(约合 1.65 亿美元),而另外1.5万笔失败交易也导致用户损失了价值超过440万美元的ETH。[2022/5/2 2:45:40]

漏洞原理详细分析

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

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

中币(ZB)双周报:中币在TrueChain发布新智能合约并适当调整合约地址:据中币(ZB)双周报显示:中币将对其平台币ZB Token进行智能合约地址的适当调整,该调整将在新地址上生成2亿可用于去中心化交易的ZB积分,同时也将在旧合约地址上销毁2亿的ZB积分。此外,为丰富ZB积分的应用场景以及支持TrueChain生态建设,中币(ZB)也将发布基于TrueChain的、总量为4000万ZB积分的ZB智能合约,并将在旧合约地址上销毁对应的、同样数目的ZB积分。官方表示,这些调整均不会对名称、发行总量和流通量等造成影响。更多详情请查阅中币微博9月15日-9月30日双周报。[2020/10/10]

图1

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

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

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

声音 | Coin Metrics数据工程师:以太坊伊斯坦布尔升级后,智能合约调用Gas供不应求:Coin Metrics数据工程师Antoine Le Calvez在一系列推文中指出了以太坊伊斯坦布尔升级带来的“负面后果”:“虽然技术上是成功的,但最近的以太坊伊斯坦布尔升级并非没有负面影响。一些EVM操作被重新定价,成本更高,这影响了一些智能合约活动。” 在最新的网络升级中,EIP主要集中在降低成本、为智能合约引入新功能等方面。然而,据Calvez透露,自从升级以来,智能合约的Gas消耗量激增。“一个调用被认为是一个契约函数的本地调用,它不会在区块链上广播或发布任何内容。”Calvez分享了一份图表,并说明道:“在全球范围内,智能合约调用Gas的供不应求情况在升级之后变得更加频繁。失败率是原来的四倍多。”此外,Calvez指出,像Gemini这样的大型交易所也受到了同样的影响。以太坊开发者Tim Beiko也证实了Calvez的发现。[2019/12/10]

如下图所示:

动态 | 以太坊区块链仍是现有最强大的智能合约平台:达令智库发布《以太坊2.0:从君士坦丁堡通往宁静的道路》研报。报告称,在君士坦丁堡硬分叉之后,新的ETH供应总量将从20300 ETH/天减少到13400/天,从每年740万ETH减少到490万。按照更改的奖励机制持续运行一段时间后,以太坊的通货膨胀率将从7.7%下降到4.8%。报告还称,以太坊仍然有着较高的网络使用率与活跃开发者,以太坊区块链仍是现有最强大的智能合约平台,市值前100的区块链项目中,绝大多数都基于以太坊网络搭建。[2019/1/14]

图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、上线前一定找专业机构做好代码审计,正所谓“一人一个脑,做事没商讨;十人十个脑,办法一大套”。

标签:ETH以太坊ERNHEReth钱包地址生成以太坊币最新价格行情分析Rari Governance Tokentogetherbnb最新版本下载

PEPE热门资讯
观点:散户投资者对加密货币兴趣上升,比特币和以太坊网络小额持币地址激增

据外媒6月21报道,自今年3月份市场中主要的加密货币和山寨币在一天内市值损失了50%后,加密货币市场一直处于复苏状态.

1900/1/1 0:00:00
区块链周报 | 上周12起融资超3.5亿美元;立陶宛计划本周预售央行数字货币

摘要:立陶宛将于本周预售央行数字货币LBCoin;去中心化交易所6月交易量突破15亿美元;门头沟清算赔偿方案再次推迟。上周2家上市公司披露区块链相关业务或计划.

1900/1/1 0:00:00
V神表示:ETH扩容很快不会成为问题

据以太坊联合创始人VitalikButerin称,随着网络转向期待已久的以太坊2.0,以太坊预计每秒交易量会增加。V神表示过渡不会立即实现V神在6月30日的推文中表示:“以太坊2.0数据扩容将先于一般计算扩容”.

1900/1/1 0:00:00
一文了解以太坊链上基金管理协议Melon

投资基金的启动及运营,在传统世界是一项艰巨又资本密集型的工作。在很大程度上,适用的法律和要求,起源于一个这样一个理想:保护投资者。令人眼花缭乱的一系列法律、法规和要求,阻碍了投资管理的实践.

1900/1/1 0:00:00
俄罗斯正在调查英国一项涉嫌欺诈的Gram代币销售

在俄罗斯解除Telegram禁令后不久,俄罗斯当局开始调查涉及Telegram未发行的Gram代币可能存在的欺诈性发行行为。Gram曾一度旨在为称为Telegram开放网络的新区块链生态系统提供服务.

1900/1/1 0:00:00
稳定币使用场景及安全性终极分析

各类稳定币使用场景分析 本章空城会总结一下当前市面上所见到的各个稳定币种类的特点,并根据这些特点来分析各种稳定币所适合的场景,最终为大家提供一些使用上的建议.

1900/1/1 0:00:00