相关文章:
Rust智能合约养成日记合约状态数据定义与方法实现
Rust智能合约养成日记编写Rust智能合约单元测试
Rust智能合约养成日记Rust智能合约部署,函数调用及Explorer的使用
Rust智能合约养成日记Rust智能合约整数溢出
Rust智能合约养成日记拒绝服务攻击
拒绝服务攻击又称DoS(DenialofService)攻击,该类型的攻击将使得智能合约在一段时间内(甚至永久)无法被用户正常使用。
目前已知的原因大致可分为如下两类:
合约逻辑中存在的某些缺陷。如某一public函数,其实现没有考虑到计算复杂度。用户调用该函数时,实际所需消耗的Gas会超出NEAR公链创世区块配置文件(genesis_config.json)中所定义的"max_total_prepaid_gas":300000000000000`(300TGas),导致交易失败。
某些跨合约调用情形中,合约的执行依赖于其他外部合约的执行状态。而外部合约的执行并非总是可靠,以至于本合约的执行可能被外部合约阻塞,无法照常运行。该类问题的发生可表现为合约用户在合约中的资金被锁定,以至于无法正常的充值或提现。
DeFi公司Wellfield将收购数字资产托管公司Brane Trust:7月28日消息,DeFi公司Wellfield Technologies已签署最终协议收购加拿大数字资产托管公司Brane Trust的所有已发行和流通证券,包括840万美元的可转换债券,现金支付15万美元,以及承担和支付Brane Trust约9万美元的未偿债务。[2023/7/28 16:05:03]
除了合约逻辑的缺陷,DoS现象发生的原因还可以归因于人为因素:典型的如:合约的所有者丢失了自己的私钥,以至于合约中部分only_owner可执行的特权函数无法被调用,使得合约中某些重要的系统状态值无法及时的更新,这将有可能对项目造成较大的损失。
为方便读者更加深刻地了解智能合约中的DoS攻击漏洞,本文后续将结合具体DoS攻击的例子展开描述与分析。本文代码已上传至BlockSec官方github,读者可以自行下载https://github.com/blocksecteam/near_demo/tree/main/DoSDemo
1.循环遍历一个可被外部调用更改的数据结构
以下是一个用于给合约中注册用户“分红”的简单智能合约,其状态数据如下:
Trust Wallet与加密支付服务商Moonpay和Ramp Network达成合作:4月5日消息,Trust Wallet与加密支付服务商Moonpay和Ramp Network达成合作,允许用户在其应用程序中将其加密货币转换为法定货币,从而实现更顺畅的使用体验。
Trust Wallet表示,它将向拥有超过100个Trust Wallet Token ( TWT ) 的用户提供折扣,以降低off-ramp费用。(CoinDesk)[2023/4/5 13:46:49]
用户可通过调用pubfnregister_account()函数进行注册并初始化。
后续该合约的管理者将调用pubfndistribute_token函数来为系统中用户进行"分红"。“分红”的方式为遍历用户数组self.registered,并通过跨合约调用向每一个用户转入指定额度amount的代币以做奖励。
Circle:Citizens Trust Bank将持有6500万美元的USDC现金储备:金色财经报道,USDC 发行商 Circle 宣布与 Citizens Trust Bank 达成合作,后者将持有 6500 万美元的 USDC 现金储备。除此之外,双方还将在金融包容性和数字金融知识方面开展合作。
据悉,Circle 曾承诺将 USDC 美元计价储备的一部分分配给全国各地的少数族裔存款机构(MDI)和社区银行。此外,Circle 和 Citizens Trust Bank 还计划将合作扩展至亚特兰大社区,致力于为其客户开展金融普惠和数字金融扫盲计划。目前该计划正在筹备中,并将于今年夏天举行发布会。Circle 还将为此提供 10 万美元的种子拨款。[2023/2/25 12:28:11]
然而该合约状态数据(self.registered)的大小没有限制,并且可以被恶意用户所操控,使得该合约数据的大小变得过大。以至于DISTRIBUTOR用户在调用该合约方法时,可能消耗的Gas费用过高,超出了GASLIMIT。
如下是该合约在实际NEARLocalnet中测试的结果
数字资产公司 Taurus 完成 6500 万美元 B 轮融资:金色财经报道,数字资产公司 Taurus 完成 6500 万美元 B 轮融资,Credit Suisse 领投,Arab Bank Switzerland、Investis 参投。
据悉,Taurus 是一家总部位于瑞士的数字资产基础设施公司,专注于为欧洲的金融机构提供托管和代币化等数字资产服务。该公司于 2020 年 4 月完成 1100 万美元 A 轮融资。Taurus 表示未来几个月内将在巴黎和迪拜开设办事处,然后在东南亚和美洲展开业务。为此,Taurus 计划今年将员工人数从 60 人增加到 100 人左右。(The Block)[2023/2/14 12:05:50]
可以看到当系统中注册的用户较多时,实际在distribute_token执行的过程中,所设置的prepaid_gas将不足以满足所有用户的转账操作,以至于本次交易失败。
推荐的解决方案:
由于GasLimit的限制,合约方法在执行过程中不建议遍历一个较大的数据结构(该数据结构的大小可被外部用户操纵)。确需遍历的,也需要限制该数据结构的大小,并保证当该数据结构的大小达到该最大值时,也不会触及GasLimit的限制。
因此推荐采用withdrawal模式对上述合约进行改造。即要求合约方不主动地对所有的用户逐一发放奖励,而是先记账,并设置一个withdraw函数,让单一用户通过该函数方法的调用,自行取回“分红”奖励。此时合约方也只需要维护逐一用户已经取回的奖励数额或者还能取回的奖励数额即可。
Crust Network 道长:用户的资产在Rollup解决方案中是安全的:金色财经现场报道,7月9日,金色沙龙第66期Layer2-扩容“空间站”,探索更高维度的破局之道在杭州举办,Crust Network 道长在圆桌对话环节中表示,V神曾提到, 二层解决方案有两大问题:一个是资产安全性问题,还有一个是系统安全性问题。Rollup已经将资产安全性问题基本解决,也就是用户的资产在Rollup解决方案中是安全的。但Rollup的系统安全性问题仍有待解决。
他山之石,可以攻玉。Crust网络提供了高安全性和高可用的数据存储网络,有能力为Layer2方案提供更高的系统安全性。
一些实际的例子已经证明了Crust的存储优势。Uniswap已经将它的网站去中心化的部署在了Crust之上,除此之外,还有更多DApp和NFT项目将他们的数据存储在Crust网络。[2021/7/9 0:40:09]
2.跨合约之间的状态依赖导致合约阻塞
合约在进行跨合约调用时,可能会对外部合约的状态存在依赖,不恰当的依赖,会导致该合约阻塞,从而可能被发起DoS攻击
下面考虑一种利用智能合约进行“竞价”的场景:
用户可以通过调用“竞价合约”中的pubfnregister_account函数方法注册账户,为参与后续的竞价做准备
用户还可以通过如下接口函数查询当前系统中目前为止出价最高的用户ID,及其所出的价格。
用户还可以通过如下接口函数查询当前系统中目前为止出价最高的用户ID,及其所出的价格。
当竞价合约收到token时,会通过ft_on_transfer函数调用到如下bid函数。
在该出价函数中,函数的执行逻辑将首先检查本次用户的出价是否高于之前出价最高用户的出价值。如果满足该条件,将执行self.refund_exe()从“竞价合约”中退回之前出价最高用户的出价代币。随后更新目前为止出价最高的用户ID及其所出的价格。
实际的情况是,根据该合约的逻辑定义:必须要退回之前出价最高用户的出价代币,才能将目前为止出价最高的用户ID进行更替。
在该出价函数中,函数的执行逻辑将首先检查本次用户的出价是否高于之前出价最高用户的出价值。如果满足该条件,将执行self.refund_exe()从“竞价合约”中退回之前出价最高用户的出价代币。随后更新目前为止出价最高的用户ID及其所出的价格。
实际的情况是,根据该合约的逻辑定义:必须要退回之前出价最高用户的出价代币,才能将目前为止出价最高的用户ID进行更替。
此时测试模拟了“竞价系统”的参与的用户:user0、user1和user2
他们分别拥有10000个初始代币。user0首先在“竞价系统”中出价1000,此时查询可知current_leader:user0.test.nearhighest_bid:1000。随后user0立即将剩余的9000个代币转给了user2,并销毁了代币账户。
此后,当user1出价2000时,系统将打算退回user0之前的出价值。但由于此时user0的账户已不存在,系统将提示"CannotRefund",始终无法成功完成后续的交易更新状态。
此时第二位出价者想出价2000:
解决方法:
如果合约的状态的转化需要依赖于外部合约的调用处理,则需要考虑外部合约调用可能失败的情形,防止合约的执行逻辑被阻塞而拒绝服务,即我们需要实现合理的错误处理手段。在本例子中,我们可以将无法退回的代币寄存于合约新增的lost_found用户组中,当后续用户满足条件refund条件时,再由用户本身来进一步取回代币(同样可以实现withdraw函数)。
3.Owner私钥丢失
去中性化智能合约项目中往往也存在部分中心化的现象:如存在合约的owner。部分合约函数的执行被设置为仅owner可以执行,用以对合约中某些关键系统变量值的进行设置更改。我们可以将此类函数称之为only_owner类型函数。
例如前文在“分红”合约中所定义的pubfndistribute_token,该函数即为only_owner函数。当合约的owner无法履行职能(私钥丢失)时,资金将一直被锁定在合约之中,无法分发给其他用户。另有大多数的情况下,only_owner函数还可以用来暂停或者重启合约中的所有交易,可见owner正常履行其职能的重要性。
解决方法:
为避免上述owner个人“失能”情形的发生,我们可增设多位合约的owner共同治理合约,甚至可采用多签请求的方式来替换原有的合约权限控制方案,以此实现合约的去中心化治理效果。有关智能合约中多签请求功能的设计实现,将在后续的《智能合约养成日记》中展开详细的描述。
Grace@footprint.networkDataSource:FootprintAnalyticsSocialFiDashboard-Jan继《一文快速了解SocialFi》介绍Socia.
Qredonians, 今天我们完成了第一次QRDO销毁,为铸造第一组验证者NFT做准备。以下是您需要了解的内容:总共烧毁了4千万的QRDO 约合近1亿美元 40个验证者NFT将被铸造总供应量减.
继近日宣布以20亿美元估值完成由InsightPartners等领投的8800万美元B3轮融资后.
數據:Tether市值首次超過800億美元3月24日消息,Tether市值首次超過800億美元,目前為81,417,623,205美元,僅次於比特幣和以太坊.
探索去中心化预言机在保护区块链外部数据和维持稳定币价格挂钩方面的作用。 目录 去中心化Web3:加密真相和透明度稳定币发行:DeFivs.CeFi使用去中心化的预言机进行储备审计和重新定位算法稳.
2022年3月14日Cardano生态2022主题云峰会圆满结束,此次活动由IOHK、WorldMobile、DreamLabs联合举办,以“Cardano生态迎爆发,龙头生态面对面”为主题.