首页 > 世链号 > 智能合约安全与漏洞分析(一)
币燃有你  

智能合约安全与漏洞分析(一)

摘要:智能合约安全漏洞本身极少是由于区块链底层虚拟机引起的问题,其中大多数属于智能合约开发者本身编写的代码问题。

智能合约安全问题一直是区块链技术体系中探讨得比较多的话题之一。无论是以以太坊 EVM 虚拟机为代表的智能合约体系,还是以 EOS WASM 虚拟机为代表的智能合约体系,都或多或少地暴露过不同类型的智能合约漏洞。这些漏洞不仅使得项目方和用户损失惨重,而且也让用户对区块链的安全性产生了质疑。

——题记

01 引言

智能合约安全漏洞本身极少是由于区块链底层虚拟机引起的问题,其中大多数属于智能合约开发者本身编写的代码问题。

例如:当使用 Solidity 语言开发以太坊智能合约时,部分开发者对编写合约的语言并不是十分了解,因此增加了编写智能合约漏洞的风险。当然,也有少部分智能合约安全性漏洞和智能合约平台本身的一些特性相关。

另外,由于区块链技术中天然具有数据难以被篡改等特性,使得智能合约安全漏洞无法像传统应用那样通过程序升级或数据回滚等方式轻松解决。因此,智能合约开发者对区块链平台的智能合约体系的全面了解显得尤为重要。

本体智能合约目前使用 NeoVM 虚拟机,开发者可以使用他们所熟悉的语言,例如 C# 和 Python 等去编写智能合约,而无需再去学习一种新的语言,这极大地降低了智能合约开发的入门门槛。

但是,在大量的实践过程中,我们也了解并收集了一些本体智能合约开发过程中可能存在的安全问题。如果能有效避免这些安全隐患,项目方和用户就能够减少大量损失。

02 跨合约调用攻击

本期,我们讲解在本体上开发智能合约时可能遇到的一种漏洞攻击,即跨合约调用攻击

当开发者在编写智能合约时,可能需要随机数,一般情况下可以使用 Ontology Oracle 来获取外部可信随机源的数据。在简化情况下,有的开发者通过取当前区块的 hash 来作为随机数。我们主要针对在编写智能合约时使用当前区块 hash 作为随机数的场景,分析该种方式下智能合约开发可能遇到的安全性问题和相关解决方案。

2.1 存在漏洞的合约

下面是一个使用当前区块 hash 作为随机数的例子代码,我们称为应用合约一

1eM31Na684YV7LlYbSTfNOm4bl5PlsOhKUKj0HyD.png

可以看到,该合约使用 getRandomNumber()  方法获取到了当前区块 hash 作为随机数源,并做了一些简单的处理,用户猜测的数值如果和合约生成的数值相等,用户可以获得一定的奖励。

 

2.2 漏洞攻击

初看起来上述应用合约好像是没有什么问题,因为当前区块的 hash 无法被出块节点以外的用户预测。但是,针对以上合约,攻击者却可以编写另一本智能合约来调用并攻击它。 下面的攻击合约二展示了如何攻击上述应用合约一:

Su4SdJR8U3slsomMiVqhcHeqiJtas5CyWDZGsLZ3.png

可以看到,攻击者编写了另外一本智能合约来调用应用合约,攻击者合约使用和应用合约相同的随机数生成算法,攻击者合约的执行和应用合约的执行在同一个区块中。

因此,攻击者合约可以知道当前应用合约生成的随机数,这样攻击者可以通过产生和当前应用合约一样的随机数而一直赢得游戏。

 

03 跨合约调用攻击的防范

那么,针对这种情况,智能合约开发者如何才能防范此种类型的攻击呢?

可以看到,只要阻止应用合约一被攻击合约二调用,就可以防范跨合约调用攻击。本体智能合约开发者可以使用 GetCallingscriptHash() 和 GetEntryscriptHash() 这两个方法来解决这个问题。

下面是在应用合约一基础上经过修改的应用合约三,该合约可以抵抗上述攻击。

0KtvhiDLMnJwt3a908i4kkWDjcFnZjuift1y4AaU.png

GetCallingscriptHash() 可以得到调用当前智能合约的合约 hash,而 GetEntryscriptHash() 可以得到调用合约入口的合约 hash。当调用当前合约的合约 hash 和调用入口的合约 hash 不是同一个 hash 时,我们可以判定当前智能合约的调用者为另外的智能合约,而不是用户使用钱包地址在调用当前这本合约。通过此种方式,我们就能很好地防范智能合约被跨合约调用攻击。

来源:本体Ontology

免责声明
世链财经作为开放的信息发布平台,所有资讯仅代表作者个人观点,与世链财经无关。如文章、图片、音频或视频出现侵权、违规及其他不当言论,请提供相关材料,发送到:2785592653@qq.com。
风险提示:本站所提供的资讯不代表任何投资暗示。投资有风险,入市须谨慎。
世链粉丝群:提供最新热点新闻,空投糖果、红包等福利,微信:juu3644。