◆张春峰 王国一
(沈阳智能机器人创新中心有限公司 辽宁 110000)
随着数字化时代的到来,区块链技术作为关键的数字经济支持技术,成为新的社会经济发展引擎。其中,凭借去中心化、不可篡改等优点,区块链技术已经广泛应用于多种场景。随着应用场景不断丰富,智能合约越来越复杂多变,这样导致对应的安全漏洞越来越多,直接制约着区块链技术发展。随着关于智能合约的攻击行为不断增加,安全性能让整个区块链行业备受诟病,做好安全漏洞检测越来越重要。
智能合约本质为一个程序模块,被部署于区块链技术,从而实现各种服务于智能合约的丰富的业务功能。当前随着区块链技术的快速发展,业务功能也趋近复杂化,可执行的操作也丰富多样。在智能合约的辅助下,用户可以不通过对区块链的结构修改而实现整个逻辑操作的嵌入,以此实现区块链的功能化拓展。作为一类程序化模块,通常采用定制化程序来实现,例如应用于以太网的Solidity 语言和Libra中的Move 语言,并且可通过设置程序化接口来对接不同编程语言。
为了实现节点安全管控,智能合约和节点之间不再融合在一起,而是以分治的方式作用于区块链节点中的沙盒中。程序和数据的智能合约分割不是冯诺依曼系统的传统体系结构,因此,安全威胁在一定程度上不同于普通计算机。执行智能合约往往会导致状态变化,对此可在区块链的不同环节之间达成协议并在达成共识后纳入区块。智能化合同和区块特性带来了新的安全问题。
重复输入是智能合约过程中发生的最危险的安全漏洞之一,当它调用其他智能合约时。被调用的智能合约可以通过重新调用原始合约来改变原始智能合约的流量和状态,实现恶意重复翻译等。转移到智能合约后,将进行控制转移,执行返回(fallback)功能,这一特点使反复攻击更加频繁。在这种情况下,攻击过程中,其会采用恶意错误的方式复制式攻击。当出现业务变更时,智能合约则会因对用的条件不匹配而引发定位偏差,由此造成程序的紊乱。
整数溢出作为一种漏洞攻击主的重要方式,通常采用几种编程语言。在执行智能合约过程中,数字业务自身的转换同计算之间的强大关联,使得整数溢出引发系统安全状况。例如以太坊,当对应的无符号整数计算的结果超出表示范围就会采用截断数位的方式引发数据偏差问题。为此,可通过设置安全库来处理该问题。具体而言,即通过库中的数值计算来对溢出情况进行评估,从而为出现该问题提供应急预案,以此预防溢出问题。
在区块链业务执行中,对应的交易顺序和时间对形成的交易结果产生直接影响。当出现交易顺序和时间漏洞的时候,通过对交易顺序的控制,利用时间戳容限误差可实现攻击,导致交易出现问题。由于这一漏洞的存在,且存在致命的缺陷,导致潜在的攻击更加精准,也更容易出现。对此通常需要设计智能化时间戳管理来避免对区块链中时间戳检测和打包环节的攻击,以实现对智能合约的有效保护。
该漏洞即DoS,本质上即干扰原有代码的执行逻辑,导致其无法被执行,从而引发以太币和GAS 的消耗,由此进一步制约合约的运行。目前而言,导致该攻击的漏洞存在形式如下所示:
(1)细微化的智能合约编码方式容易被攻击者利用而形成有效攻击,其会通过错误操作引导来实现服务终止运行。
(2)对应的区块链执行代码控制权被集中于某一单一变量上,这样当有用户切入,就会对整个使用功能进行带来联动反应,当出现不执行或者丢失密钥的情况下,系统则无法得以正常运行,甚至会导致智能合约的瘫痪。
(3)DoS 漏洞攻击会导致诸如以太坊的每个模块一样,由于存在gas limit 上限,当出现外部操控数组发生访问时,可在攻击下引发gas 的枯竭,导致无空间来运行智能合约。
该问题主要发生于Solidity 的调用中,其所涵盖的send()、call()、delegatecall(),callcode()等函数调用异常时,此时返回false,此时不将抛出异常指示。在外部调用过程中,由于没有异常提示,导致合约运行继续,这会随着运行的继续而引发逻辑错误。例如,图1中,对应的第7 行中,send()操作后,尽管出现异常,但是没有进行抛出操作而导致交易继续,然后运行到第9 行则发生逻辑错误,导致系统异常,引发连锁反应。
图1 未检查call 返回值漏洞代码段
对于静态程序分析而言,主要内容在于结合统计特性,对所执行的方案的特点,特别是符号实现、语义分析等进行分析,以从中发掘其中的漏洞和隐患。
(1)符号执行
该方法主要通过对所执行的程序的每个运行的路径进行分析,对每个路径所满足的条件进行分析和匹配,从而以通过约束规则,利用求解器来确定可能的条件。具体而言,当满足某一路径条件时,则会将该路径设置为可实现路径,否则将其设置为不可访问,并将该路径删除。通过这一分析方法可有效地发掘可能存在的安全漏洞,其具体方法如下:在执行智能合约的过程中,对应执行的指令下发前,须对可能执行的路径进行检索,并由此发出相应的路由指令,以进一步分析是否满足该路径路由条件。如果此时还是满足所需条件,那么对应的执行代码可以被重复执行。此时会存在一定的安全风险。
为了进一步分析,通常需要采用Oyente 等基于符号执行的智能合同分析工具。在符号执行分析方法采用的基础上,依托Oyente 分析工具可有效生成智能合约控制流程图,并对可能的路由路径进行分析,并通过分析原则和路由规则来检测路由路径中是否存在异常,并做进一步验证以确定是否需要播报。
(2)语义分析
语义分析方法作为另一类关键分析方法,通常对智能合约的语义特征进行分析,通过分析来获取相关的语义特征,并通过挖掘的语义特征来分析是否存在漏洞或者异常等。通常,为了有效提升漏洞分析的效率,需要采用相应的静态工具来予以辅助分析,例如采用Securify 即为当前进行语义分析的关键工具,这是因为该工具是一种基于语义和静态分析的智能合约安全分析工具。采用该工具的过程中,通常需要将经过智能合约编码处理的信息作为输入,并通过对应的语义特征依赖关系,进行分析,通过匹配的方式来验证是否存在对应的漏洞,从而以高精度的挖掘潜在的风险。对于该分析工具而言,其存在很大的好处在于其挖掘的语义特征信息,通常能够满足特征的信息规则,并且可以通过逻辑语言datalog 定义,然后在该引擎框架下,进行安全漏洞的检测和修补。为了能够有效提升发掘安全漏洞的效率,其同DSL 来对安全模式进行描述,并且提供用户以安全模式进行登录,以及扩展内置模式集,由此提升整个分析方法的灵活性和良好的可扩展性。
(1)模糊测试
模糊测试是指发现智能合约中的安全漏洞、构建大量输入数据以及监控智能合约的实施过程。合约模糊器是一种基于模糊测试的智能合约不在场证明工具。首先,分析了智能合约中的所有功能,并分析了智能合约中不提供ABI 的所有外部功能。然后,他使用智能合约ABI 生成输入数据,并使用EVM 记录的执行轨迹进行漏洞分析。fuzzer 合同中定义了七种测试原语,以支持多个安全漏洞的检测。针对合约间交互链接引起的返回问题,建立攻击合约,并利用其保留函数完成返回检测。在模糊测试中,经常会出现一些问题,比如指数输入数据和低代码覆盖率。
(2)污点的动态监检测分析
动态应变分析方法通常将输入数据标记为应变和传播,并在智能合约操作期间分析应变。区块链分析侧重于输入参数的行为,并确定染料传播路径上是否存在安全漏洞。
Easyflow 是一种基于动态染色不在场证明评估以太坊智能合约中是否存在整体转运漏洞的方法。通过修改EVM,每个输入参数都设计为一个阴影。当有数字操作时,请注意操作员。如果操作不是污渍,且计算中没有转运,则应证明操作是安全的;如果操作员受到污染,则会生成事务尝试以使操作过载。如果超额流量成功激活,则应指示转运漏洞;如果未激活过量流量,则报告潜在的过量流量漏洞。此外,Easyflow 还可以识别数学安全性及其可能的变体,从而有效降低误报率。
形式化方法是验证程序修正的常用方法。当定义某些公理、建立特定的逻辑推理系统并证明代码的逻辑推理时,可以验证智能合约功能的更正。通过正式验证的代码可以确保它在所有条件下都显示正确的功能。然而,复杂的证明过程使得形式化方法难以在逻辑复杂的大型程序中使用。
形式化验证方法当前备受网络安全问题专家所关注的方法之一,其通过严谨的数学理论对整个安全漏洞进行演算,实现对安全漏洞的高效检索和发掘,但是由于数学理论参与度高而提升应用门槛。对此为了提升其应用范围,针对不同应用目标进行定制化的研究和规范化描述和验证,从而削减应用成本,降低使用门槛,从而提升其大规模应用价值。
对于区块链而言,进行交易的过程中需要选择可执行的路由路径来执行该事件,从而完成交易过程。一般而言,攻击者攻击的目标即采用非法手段,来窃取对应的加密货币。在这一背景下,需要通过对当前的智能合约审计经验和已曝漏洞分析,对出现的或者可能出现漏洞的路由路径中所执行的指令进行分析,提取其中可能的高危指令SUICIDE、CALL、ORIGIN、ASSERT_FAIL 等,对其路由的路径进行重点关注,并打上重视标签。为了进一步提升安全漏洞挖掘的效果和检测精度,在实际运行中,不必对所有的路由路径进行分析,只需要重点关注高危漏洞验证工作,以此削减路由路径检索时间和存储空间,提升路由和检测效率。
对于安全漏洞检测而言,一个重要的方式就是模糊测试,易提升安全漏洞检测效率和定位效果,为精准检测提供技术支撑。但是由于技术的不够完善,现有的模糊测试工具业务功能不足,且精度不足成为当前用于检测漏洞中存在的关键问题。对此进行优化处理是关键,例如可以考虑用多目标优化算法。此外,综合其他技术来辅助提升检测效果,如可采用静态方法、符号执行、模糊测试等多个测试策略的联合应用,能够在静态分析方法框架下来获取对应的可执行的路由路径,并在符号执行分析技术下,结合生成种子测试用例,来测试该项综合测试技术,提升模糊测试效果。
智能合约在执行中,由于缺乏足够的漏洞检索库,导致安全漏洞的发掘效率受到影响。为了改善该局面,提升漏洞挖掘的效率,检验相关工具的有效性能,并为安全化处理提供技术思路,需要根据当前出现的漏洞情况,进行分析、整理和总结,将其纳入规范化记录存档,并综合在一起形成具有特性特征分类的数据库,并结合处理经验和基本技术理论,以及社会设置的规则对,设定评估体系,充分考虑漏报率、误报率、检测时间、支持漏洞类型和漏洞的危害等级等因素,提升整个安全漏洞的检测和修补提供建设性建议。
智能合约作为区块链业务中重要的功能集成,对区块链交易提供了更多的便捷性和高质量的服务业务。然而智能合约作为一类程序化模块存在很多安全性问题,尤其是大量存在的安全漏洞,引起高效的嵌入效能而被带入到各类区块链应用服务之中,导致区块链在交易过程中面临安全风险。为了解决这些问题,本文在深入分析了智能合约的基本概念的基础上,进一步分析了可能存在的安全漏洞,最后探讨了安全漏洞检测的基本措施,从而为当前的智能合约的应用以及区块链技术的发展提供技术参考。