Page 284 - 《软件学报》2021年第5期
P. 284

1508                                     Journal of Software  软件学报 Vol.32, No.5,  May 2021

                        后可以在 VMM 层或者管理域中安装后门、执行拒绝服务攻击、窃取其他用户数据,甚至控制其他用
                        户虚拟机等.在区块链系统中,虚拟机在运行代码时会提供一个沙盒环境,一般用户只能在沙盒的限
                        制中执行相应的代码,此类型漏洞会使得攻击者编写的恶意代码在运行该沙盒环境的宿主机上执行,
                        破坏宿主机与沙盒的隔离性.
                    (2)  逻辑漏洞(logic vulnerability) [96] :逻辑漏洞是指由于程序逻辑不严谨,导致逻辑分支被非正常处理或
                        错误处理的漏洞.虚拟机在发现代码不符合规范时,可能会做一些“容错处理”,并导致一些逻辑问题.
                        最典型的是“以太坊短地址攻击”           [97] :在 ERC-20 TOKEN 标准 [98] 下,攻击者可以输入一个短地址并调
                        用 Transfer 方法提币.EVM 虚拟机在解析合约代码时,会通过末尾填充 0 的方式将短地址补至预期长
                        度.此时,参数编码可能出现逻辑漏洞,导致攻击者获取与交易金额不符的代币.
                    (3)  资源滥用漏洞(resource-exhaustion vulnerability) [99] :攻击者在虚拟机上部署恶意代码,恶意消耗系统
                        存储资源和计算资源.所以在虚拟机中必须要有相应的限制机制来防止系统的资源被滥用.在以太坊
                        中,智能合约采用了 gas 机制,攻击者想在以太坊虚拟机上做更多操作,需要付出经济代价.

                 5.3   防御策略与方法
                    合约层攻击的共性在于,攻击者是尝试通过干扰合约的正常调用来实现不同的攻击目的.其特性在于不同
                 攻击方式的攻击目标和原理不同,攻击者可以利用智能合约的代码漏洞或合约虚拟机的运行漏洞,尝试通过非
                 正常的合约调用,以实现非法获利、破坏区块链网络的目的.
                    智能合约实质上是由开发者编写并部署在区块链上的一段代码,其中的漏洞可能是由于开发人员编写的
                 代码不符合标准导致的,如整数溢出漏洞、时间戳依赖性、调用深度限制等;也可能是攻击者(开发者)恶意植入
                 的,如重入攻击.所以在智能合约编写过程中,开发人员需考虑到以下几方面.
                    (1)  养成良好的编程习惯,以严谨的编程逻辑避免智能合约开发过程中出现整数溢出等常见的漏洞.
                    (2)  针对智能合约的时间戳依赖性,在合约开发过程中应采用多维参数输入、随机参数输入等,避免合约
                        执行结果完全依赖于时间戳,降低合约执行结果的可预测性.
                    (3)  针对智能合约的调用深度限制,应在智能合约中预先设置预警惩罚机制.当合约调用次数接近上限
                        时,智能合约调用预警合约对用户发出提醒,若用户继续调用合约最终导致合约运行失败,则预警合
                        约调用惩罚合约对最后调用合约的用户进行惩罚.
                    (4)  针对重入漏洞,应在合约开发过程中设置参数检验机制.当智能合约 A 调用智能合约 B 时,应对 B 返回
                        的参数进行确认,再继续执行.参数检验机制可以阻止攻击者通过在 B 植入漏洞发起重入攻击,也可以
                        阻止攻击者实施误操作异常攻击.
                    尽管良好的编程习惯和编程策略可以在一定程度上避免智能合约中出现安全漏洞,但仍有一些安全漏洞
                 是不可避免的.所以在部署智能合约时,用户可以采用以下方法避免代码漏洞带来的危害.
                    (1)  安全评估:在正式部署智能合约前,应对其进行大量安全测试或白盒审计,以评估该合约的安全性.
                    (2)  采用 Sereum [92] ,ZEUS [100] 等重入攻击防护工具.其中,Sereum 支持多种重入攻击的识别,不仅适用于待
                        部署合约,还可以保护已部署智能合约在重入攻击下的安全性,误报率仅为 0.06%.
                    此外,合约虚拟机中存在的逃逸漏洞、逻辑漏洞、资源滥用漏洞可能会导致智能合约的异常运行,攻击者
                 可以在发现这些漏洞后,在与其他用户订立智能合约时,利用这些漏洞编写有利于自己的智能合约代码,使得智
                 能合约失去公平性.所以,区块链网络在引入智能合约虚拟机时,应对虚拟机进行系统的代码审计,分析评估其
                 安全性,并将其可能存在的安全漏洞披露出来.而用户在部署智能合约时,除了对合约代码进行常规审计外,也
                 要根据目标合约虚拟机披露的漏洞对代码进行审计,做好双向的智能合约运行环境评估.
                 6    区块链应用层攻击

                    应用层是区块链技术的应用载体,为各种业务场景提供解决方案.本节将从挖矿机制和区块链交易两个角
                 度梳理分析区块链应用层存在的安全漏洞和恶意攻击,旨在给出有效的应对策略.
   279   280   281   282   283   284   285   286   287   288   289