当前位置:首页 > 物联网 > 区块链
[导读] 智能合约可以部署其他智能合约。这使工厂模式成为可能,在工厂模式中,您可以创建多个智能合同,每个智能合同只跟踪一件事,而不是一个跟踪许多事情的智能合同。使用此模式可以简化代码并减少某些类型的安全漏

智能合约可以部署其他智能合约。这使工厂模式成为可能,在工厂模式中,您可以创建多个智能合同,每个智能合同只跟踪一件事,而不是一个跟踪许多事情的智能合同。使用此模式可以简化代码并减少某些类型的安全漏洞的影响。

在这篇文章中,我将向您介绍一个基于我们在最近的审计中发现的一个关键漏洞的示例。如果使用了工厂模式,那么漏洞就就减少了很多。
 

越野车智能合约

下面是一个智能合约,通过一个相当简单的界面销售WETH。如果您有WETH,你只需要批准这个智能合约出售你的代币,它将确保你得到正确的金额支付。只要批准充足的代币,任何人都可以任意购买WETH。

合约使用提款模式将付款交付给卖方,但合约的作者犯了一个严重的错误:

1// Technically this could sell any token, but we‘re selling WETH in this

2// example because then I don’t have to think about prices. 1 WETH costs 1 ETH.

3contract WETHMarket {

4 IERC20 public weth;

5 mapping(address =》 uint256) public balanceOf;

6

7 constructor(IERC20 _weth) public {

8 weth = _weth;

9 }

10

11 // Buy WETH from a specified seller. Seller must first approve WETH.

12 function buyFrom(address seller) external payable {

13 balanceOf[seller] += msg.value;

14 require(weth.transferFrom(seller, msg.sender, msg.value),

15 “WETH transfer failed.”);

16 }

17

18 // Used by a seller to get their ETH.

19 funcTIon withdraw(uint256 amount) external {

20 require(amount 《= balanceOf[msg.sender], “Insufficient funds.”);

21

22 // Whoops! Forgot this:

23 // balanceOf[msg.sender] -= amount;

24

25 (bool success, ) = msg.sender.call.value(amount)(“”);

26 require(success, “ETH transfer failed.”);

27 }

28}

(如果您想知道为什么代码使用.call而不是.transfer,请阅读“立即停止使用Solidity的传输()”)。

因为卖方的余额从未减少,所以欠任何以太的卖方都可以反复调用withdraw()来消耗每个人的合约。这是一个严重的漏洞。

修复这个bug,就像大多数bug一样,一旦你发现了它,就变得微不足道了。但在这篇文章中,我想谈谈如何通过使用工厂模式来减轻这个bug,即使我们不知道这个特定的问题。

现在让我们看一下更简单的WETHMarket合约版本。在这个版本中,合约只负责销售一个卖家的WETH。此合约与先前版本具有相同的bug:

1contract WETHSale {

2 IERC20 public weth;

3 address seller; // only a single seller

4 uint256 public balance; // no need for a mapping anymore

5

6 constructor(IERC20 _weth, address _seller) public {

7 weth = _weth;

8 seller = _seller;

9 }

10

11 // No need to specify the seller.

12 funcTIon buy() external payable {

13 balance += msg.value;

14 require(weth.transferFrom(seller, msg.sender, msg.value));

15 }

16

17 funcTIon withdraw(uint256 amount) external {

18 require(msg.sender == seller, “Only the seller can withdraw.”);

19 require(amount 《= balance, “Insufficient funds.”);

20

21 uint256 amount = balance;

22

23 // Whoops! Forgot this:

24 // balance -= amount;

25

26 (bool success, ) = msg.sender.call.value(amount)(“”);

27 require(success, “ETH transfer failed.”);

28 }

29}

尽管存在完全相同的逻辑错误,但此漏洞并不是那么严重。只允许一个帐户调用withdraw(),并且合约中存储的所有以太网都属于该帐户。这个错误的影响只是余额并不能反映合约中的真实余额。

这个bug是手工挑选来显示其优点的,但是这个bug代表了托管协议中的一大类bug。根据我审计智能合约的经验,这是发现关键漏洞最常见的地方之一。

托管背后的想法是,不同的资金必须分开存放,以确保合同始终可以涵盖所有欠款。获得托管权最简单的方法之一是将资金完全分成不同的智能合约。

您可以将工厂模式看作是一种深入防御的托管方法。

简单代码

单卖方版本的合约不仅有更强大的代管,而且更简单。我们去掉了一个函数参数和一个映射。在生产代码中,我们可能会更进一步,完全删除balance,而代之以address(this).balance。

因为我写合约是为了方便阅读,原来的代码已经很简单了。在现实世界的例子中,这种差异可能更为显著。从安全的角度来看,任何降低复杂性的机会都是一种胜利。

工厂模式

每个卖家都可以部署自己的Wethsale合约并从简单的合约中获益,但是这种方法有一个主要的缺点,恶意卖家可能会部署稍微修改过的代码版本,但实际上并没有传输weth。

即使像ConsenSys Diligence这样有信誉的公司审核了WETHSale代码,每个买家也必须验证他们购买的具体合约是否使用了那些确切的代码。

使用工厂可以解决这个问题。工厂确保每个部署的合约都使用相同的代码,并且它提供了一个简单的查找机制来查找给定卖方的单一合约:

contract WETHSaleFactory {

IERC20 public weth;

mapping(address =》 WETHSale) public sales;

constructor(IERC20 _weth) public {

weth = _weth;

}

funcTIon deploy() external {

require(sales[msg.sender] == WETHSale(0), “Only one sale per seller.”);

sales[msg.sender] = new WETHSale(weth, msg.sender);

}

}

潜在缺陷

使用工厂模式的一个主要缺点是价格昂贵。CREATE操作码目前的燃气成本为32,000。我们的特殊合约还需要另外两个SSTORE来跟踪WETH和卖方地址,每个地址需要20,000燃气。这比代码的原始多卖家版本至少多72,000气体。

另一个潜在的缺点是复杂性。在大多数实际情况下,工厂模式简化了现有的合同,但请记住,它还添加了一个新的合同:工厂本身。根据代码的不同,这可能会导致复杂性的增加。

在决定工厂模式之前,请仔细考虑变更的总体影响。

总结

1. 托管方面的错误是导致关键漏洞的一个重要原因。

2. 使用单独的智能合约可以降低这些错误的严重性。

3. 工厂模式以一种不可信任的方式实现了这一点。

4. 在采用工厂模式之前还要考虑潜在的缺点。
来源: 区块链研究实验室 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

上海2024年4月16日 /美通社/ -- 根据研究和经验, 设备和系统50%的故障或失效可直接或间接地是由转子不平衡引起的。在先前申克现场动平衡仪的基础上, 申克又创新了一套更成熟的移动式平衡设备:SmartBalan...

关键字: BALANCE SMART FFT 振动分析

SanerNow Risk Prioritization依托CISA的SSVC框架,以SecPod著名的漏洞情报为基础而创建,可有效地对漏洞、错误配置和其他安全风险进行优先级排序,并改善网络安全态势。 加利福尼亚州雷德...

关键字: 安全漏洞 SE RIO BSP

广州2023年8月29日 /美通社/ --  8月28日,保健食品行业迎来新规,国家市场监管总局正式发布《保健食品新功能及产品技术评价实施细则(试行)》(简称《实施...

关键字: UI BSP JOURNAL 检测方法

智能家居作为未来家居的发展方向,已经越来越多地被广大消费者所接受。然而,随着智能家居设备的普及和广泛应用,其安全问题也越来越受到关注。本文将从智能家居存在的安全隐患出发,探讨如何提升智能家居的安全性。

关键字: 智能家居 安全漏洞

EFFISAYIL™ 2临床试验显示,佩索利单抗能显著预防泛发性脓疱型银屑病(GPP)发作长达48周1,2 该研究结果建立在EFFISAYIL™ 1临床试验数据基础之上,EFFISAYIL™ 1临床试验表明使...

关键字: GP UI

公司扩展了 Mx9 消息传递平台的现有本地部署功能,并推出了一系列有助于保障安全性、数据隐私和改进用户体验的新功能

关键字: UI TE SYNCHRO OS

北京2022年12月22日 /美通社/ -- 近日,国家工业信息安全发展研究中心公示了2023年度工业信息安全监测应急支撑单位名单。北京安帝科技有限公司(以下简称“安帝科技”)凭借多年来在工业信息安全领域的深入持续耕耘以...

关键字: 信息安全 网络安全 安全漏洞 TI

目前跟踪亚太地区46个国家/地区的国际货运情况,年度货运增长240%以上,新亚太地区客户增加90%以上,世界领先企业继续选择FourKites实现实时端到端供应链可视化

关键字: 供应链 TE UI RS

预集成解决方案让 OEM 厂商更容易构建软件定义的车辆 实现功能安全和信息安全的 OTA 更新 两家公司将在 CES 2023 展示联合解决方案 德国埃尔朗根2022年1...

关键字: OTA 移动 UI AIR

区块链是目前最有前途的技术趋势之一,在广泛的用例中具有很大的潜力。它基本上是数据库的分布式加密变体,可以解决与在线安全和信任有关的不同问题。虽然许多人将区块链与比特币等加密货币联系在一起,但它在供应链管理和防止身份盗窃以...

关键字: 区块链 智能合约 NFT
关闭
关闭