主页 > imtoken怎么退出账号 > 以太坊智能合约安全威胁概述

以太坊智能合约安全威胁概述

imtoken怎么退出账号 2023-03-26 05:25:01

作为一项成功的区块链技术,智能合约已经广泛应用于商业环境(例如,大额金融交易)。 作为第一个启用智能合约的区块链——以太坊,有数亿个地址。 但由于智能合约存在安全隐患,区块链尤其是公链的落地还有很长的路要走。 在本文中,我们将系统地阐述以太坊智能合约存在的安全漏洞以及解决这些问题所面临的挑战。 智能合约引入的安全威胁主要来自三个方面:设计、开发和执行。 据此,我们将从“异常合约”、“程序漏洞”和“可用执行环境”三个部分来呈现合约的安全问题(见图1)。

以太坊智能合约是什么_以太坊智能合约代码_以太坊智能合约查询

以太坊智能合约代码_以太坊智能合约查询_以太坊智能合约是什么

图 1 智能合约安全问题概述

以太坊智能合约是什么_以太坊智能合约查询_以太坊智能合约代码

1. 异常合约 智能合约需要部署在区块链网络中的所有矿工节点上。 一旦被交易触发,它将被每个节点强制执行。 任何人都不能干涉或取消执行。 此功能保证合约公平交易。 另一方面以太坊智能合约查询,智能合约以字节码的形式存储在区块链中,可读性差。 尽管 Etherchain 和 Etherscan 等网站上提供了源代码,但它们的代码库并不完整。 因此,恶意行为者会利用这种可以隐藏合约意图的现象进行非法交易,或部署恶意代码以谋取暴利。 为了防止这种分布式DOS攻击,区块链引入了Gas机制,对交易发起者发起的计算和存储的gas消耗进行计费。 但如果合约设计者故意编写无用的代码引入昂贵的Gas开销,会增加普通用户调用合约的成本。 从合约设计的角度来看,合约安全问题可以分为犯罪合约、恶意合约、异常耗气合约。 合约犯罪是指恶意行为者利用智能合约(如自执行、自毁)实施非法交易。 智能合约的自执行特性使得机器可以替代人类信任成为高度可信的第三方信任,这不仅降低了依赖中间服务的攻击成本,而且提供了比以往传统的第三方攻击更高的可信度。 这使得一旦交易触发合约,就无法终止和撤消通过智能合约支付给网络罪犯的资金(例如,在勒索软件或其他勒索的情况下)。

以太坊智能合约查询_以太坊智能合约是什么_以太坊智能合约代码

此外,由于区块链中的所有参与者都是匿名的,犯罪分子的身份将很难追踪。 还有智能合约支持自毁,允许不法分子在交易完成后销毁智能合约,增加身份追溯难度。 与犯罪合约不同,恶意合约是指故意引入漏洞(如后门)来进行犯罪活动,如窃取合约的数字资产。 一些智能合约创建者会鼓励普通用户参与和调用智能合约。 当合约中的资金达到临界值时,创建者会利用他们事先留下的后门窃取合约中所有用户的数字资产。 智能合约蜜罐也是一种恶意合约。 它假装有漏洞吸引其他人攻击,最终攻击者被套路抓住。 gas消耗异常的合约是指在合约中填充了过多的冗余代码,或者使用复杂的代码来实现简单的功能,甚至是故意填充一些代码密集型的操作,比如死循环。 这不仅会增加普通用户调用合约的交易手续费,还会拖慢矿工的挖矿速度。 由于恶意行为者会利用以太坊的图灵完备语言特性编写需要大量计算能力的程序并发起 DoS 攻击,交易费用会急剧增加,影响系统稳定性。 因此,智能合约平台通常使用 Gas 机制来防止 DoS 攻击。 用户在这类平台上支付自己区块链上的算力费用,并且对不同操作的Gas成本有收费规则,过多的冗余操作只会给普通用户带来难以承受的开销。

以太坊智能合约代码_以太坊智能合约查询_以太坊智能合约是什么

2. 程序漏洞 自从区块链智能合约问世以来,合约漏洞就成为了一个经久不衰的热门研究领域。 与传统程序相比,智能合约虽然体积小,但由于其编程语言相对较新,处理的数字资产数量庞大,字节码、存储状态、交易历史等公开透明,运行在复杂的大型规模的区块链。 在系统中,智能合约编程的开发难免存在不可预测的漏洞,而由于被攻击后可以获得巨额利润,合约也更容易受到攻击。 一般来说,合约漏洞的成因主要来自编程语言本身的局限和开发过程中引入的代码漏洞。 编程语言限制是智能合约漏洞的主要原因之一。 以太坊智能合约的编程语言有很多,比如Solidity、Serpent、Mutan和LLL,但目前主流的是Solidity。 Solidity 的合约结构可以类比为 C/C++。 每个合约类似于 C++ 中的一个类,包括函数和变量。 不同的是,这些功能可以通过外部交易或消息调用来触发,并且可以继承不同的合约。 但它毕竟是一门新的语言,所以相对于传统的成熟语言如Python、C++、Javascript等缺陷更多。比如Solidity没有标准库,所以数组和字符串的结构和使用非常复杂。 比如函数参数和返回值不支持字符串数组,稍不注意就容易造成漏洞,比如内存覆盖。 一些低级函数调用方法(call、callcode、delegatecall、send)执行失败后不会抛出异常,而是返回一个布尔值。 如果不检查执行结果,可能会导致错误的逻辑运算。

以太坊智能合约代码_以太坊智能合约查询_以太坊智能合约是什么

代码漏洞是所有程序都无法回避的问题。 除了类似于传统程序的漏洞,如算术错误、访问控制、拒绝服务攻击等,智能合约也有自己独特的漏洞,如重入、未检查的底层调用、时间戳/块号依赖、抢占式执行等. 重入漏洞是由于在转账前没有改变发送方的余额造成的。 当转账接收者(攻击者)是合约的回退函数时,该函数可以再次调用发送者的转账函数。 由于余额没有变化,仍然会执行成功,攻击会反复调用受害者的转账操作,直到合约余额小于提现金额; unchecked underlying call是因为开发者没有检查上面函数方法的执行结果; 时间戳/区块号取决于 随机数的产生取决于区块链中的时间戳或区块号,区块链中的所有数据都是透明的,未来区块相关的数据也会被矿工操纵,可以有选择地释放自己挖出的区块最终会导致可预测或被操纵的随机数,造成不公平; 抢占式执行是攻击者利用矿工依赖交易费来打包交易的一种策略。 当一笔交易被监控并发布到区块链上时,立即发布一笔交易费用较高的交易,以抢占前一笔交易的执行。 因此,为了检测合约漏洞,研究人员需要设计不同的检测策略和攻击方式。 更重要的是,代码漏洞与合约的执行环境密切相关。 如果纯静态分析代码没有充分模拟合约执行环境,可能会出现很多误报和漏报。

3. 可用的执行环境 智能合约运行在基于堆栈的虚拟机(EVM)中,EVM 有一定的局限性。 如果合约调用次数超过1024位栈深度范围,交易将异常终止。 此外,智能合约的执行需要外部交易触发,依赖于链下环境提供的数据,而这些输入数据的真实性将直接影响合约执行结果的正确性。 本章将主要介绍合约在执行环境和不可靠外部数据方面的安全问题。 EVM在物理主机和智能合约之间提供双向保护以太坊智能合约查询,合约执行可以完全在类沙箱环境中执行,不受外部物理主机的干扰。 但EVM其实是半图灵完备的,因为它的执行会受到Gas的限制,尤其是循环、递归等计算成本高的函数可能会因为交易中的Gas耗尽而挂起。 另外,以Wei为最小单位的EVM不支持浮点数,会导致计算结果不准确。 EVM不同于JVM,它单独加载执行函数。 它将整个智能合约加载为一个不透明的块,然后从第一条指令开始盲目执行,这使得调用外部合约变得非常复杂。 EVM 的一些内置操作也可能导致漏洞。 例如,当攻击者使用ERC-20标准代币合约中的函数transfer(address to, uint tokens)转账第一个参数长度小于20字节的代币(地址长度为20字节)时,由于EVM使用根据合约应用程序二进制接口(ABI)的定义来解析合约字节码,它会自动将下一个参数的有效位作为补充,同时将第二个参数的值右移,从而得到在收件人地址(to)发生变化时,实际转账金额(token)增加,即短地址攻击。 智能合约就像一个使用数据进行决策的机构,但前提是数据是正确且值得信赖的。 如果一个合约需要一组静态数据,这组静态数据可能会被篡改或破坏。 如果需要动态数据,考虑到时间和地理差异,确保所有节点获得一致和正确的数据在不稳定的网络中也很困难。 由于合约由区块链上的每个节点独立执行,任何外部数据源检索请求也将独立执行。 由于外界是动态的、不可信任的,很难保证分布在不同国家和地区的每个节点都会得到一致的响应,股票价格和天气预报就是两个典型的例子。

4. 总结 虽然这些安全问题已经有了相关的缓解方案:例如,区块链数据分析可以打击非法活动,将合约字节码转换为源代码的逆向工程也会让恶意合约更容易被发现。 优化/检测工具帮助用户避免开发/使用高gas开销的合约; 引入新的编程语言,各种漏洞检测工具可以减轻程序漏洞造成的资产损失; 改进的EVM或EVM instrumentation监控交易执行,可以在一定程度上缓解合约执行过程中出现的异常,而且去中心化预言机或第三方可信平台提供的数据也可以提供相对稳定可靠的外部数据。 然而,每种解决方案都有其自身的局限性。 目前合约安全研究主要集中在合约漏洞检测,包括开发阶段的静态检测工具和合约上链后的安全验证工具。 但是,合约的安全问题并不是一成不变的,会随着需求和执行环境的变化而变化。 跨链、合约升级功能等新的架构设计,新的需求是否会带来新的安全问题,大家还是比较关心的。 整体来看,合约生态还存在不少安全问题,更好的安全工具值得期待!