Page 224 - 《软件学报》2025年第10期
P. 224
张建标 等: 面向联盟链的智能合约行为可信验证机制 4621
4 安全分析
本文从访问控制、代码漏洞、资源完整性这 3 个方面给出了几个威胁场景下的安全分析, 说明了本文提出的
验证机制能够有效地评估合约行为是否符合预期, 保障区块链系统的安全稳定运行.
场景 1: 节点 D 发布或调用一个试图绕过访问控制策略访问未经授权的区块链资源的智能合约.
共识节点收到交易后执行合约, 首先会判断节点 D 是否有发布或调用合约的权限, 然后执行合约. 调用智能
合约行为可信验证机制判断合约行为是否可信. 本文研究方案的合约监控模块将合约运行过程中的系统调用以及
关键参数实时发送给合约判定机制, 能够及时发现系统调用的关键参数不满足安全策略, 因此该合约行为不可信,
无法被发布或调用.
场景 2: 攻击者试图通过合约逻辑漏洞实现可重入攻击, 攻击者部署了一个恶意合约 Mallory, 并向一个正常
的合约 Alice 发送一笔资金. 当 Alice 收到资金后, 会调用 Mallory 的回退函数进行确认. 在回退函数中, Mallory 再
次向 Alice 发送资金, 导致 Alice 再次调用 Mallory 的回退函数, 使得 Mallory 可以多次从 Alice 中提取资金.
本文研究方案的预期行为规则包括与被攻击合约绑定的行为序列以及回退函数的调用次数, 决定了重复执行
的函数操作是不可信的序列. 当被攻击合约的回退函数调用次数不符合预期行为规则时, 说明被攻击合约的行为
不可信, 该方法能够快速有效检测出可重入攻击, 有效防止攻击者通过可重入对区块链进行攻击.
场景 3: 在区块链上部署的合约是经过验证的可信合约, 但是在从区块链拿到本地执行环境的过程中, 合约可
能被恶意篡改, 或者执行环境可能被植入恶意漏洞, 导致合约的执行结果发生错误, 合约执行过程中需要从外部获
取资源, 攻击者可能恶意篡改外部资源.
本文提出的智能合约行为可信验证机制通过对合约源代码、合约执行环境、外部资源的完整性进行可信度
量, 能够及时发现完整性是否被篡改, 一旦检测到合约、执行环境、外部资源完整性遭到破坏, 不允许该合约进行
后续操作, 能够保证合约可信执行.
5 实验分析
本文基于 Hyperledger Fabric 搭建原型系统, 部署行为可信验证机制. Hyperledger Fabric 是一种具有高度模块
化、支持多种编程语言的智能合约、可插拔共识机制的特点的区块链框架, 基于 Hyperledger Fabric 模式构建的
商业应用层出不穷, 由国家信息中心牵头发起的国家级区块链平台“区块链服务网络”在国内部署联盟链, 将
Hyperledger Fabric 作为首批适配的区块链项目, 可见 Hyperledger Fabric 在国内也得到广泛认可. 因此, 本文对智
能合约的测试针对 Hyperledger Fabric 平台展开.
本文实验环境具体为 64 位 Ubuntu 18.04 操作系统, 内核版本为 4.15.0, 8 GB 内存, Intel(R) Core(TM) i5-
8250U CPU @ 1.60 GHz 1.80 GHz, Hyperledger Fabric 版本为 2.3.3, Caliper 版本为 0.4.0, Docker 版本为 20.10.7,
Go 版本为 1.16.7, strace 版本为 5.3.
本文针对联盟链 Hyperledger Fabric 中恶意合约对世界状态 4 种类型的事务, 包括只写、只读、读写和删除
操作执行不可信攻击的情况. 由于交易只在最后一步才将状态写入世界状态, 因此查询操作不影响区块链账本状
态. 本文中只考虑更新操作, 智能合约由多种语言编写, 其中 Go 语言调用 Shim 接口实现核心业务逻辑, Shim 包
提供了 stub.PutState 与 stub.GetState 等关键 API 函数来写入和查询区块链键值状态, 这些 API 在执行时会触发
read, write 等文件系统调用. 转账合约在执行时 read 系统调用会打开合约文件、节点身份认证相关文件、账本相
关文件等, write 系统调用将更新成功的结果写入区块链账本, 通过 strace 命令追踪合约运行时的系统调用并结合
区块链日志分析系统调用参数.
为了评估该机制的有效性, 我们对合约转账行为进行测试, 在 mychaincode 项目中引入了恶意逻辑, 这会导致
不符合预期的行为序列, mychaincode 合约源码结构、转账功能源码、转账合约控制流图生成如图 5 所示.
本实验分成两组: 第 1 组功能转移及参数均符合预期, 第 2 组功能转移正确, 但参数值不符合行为规则, 分别
命名为 contract1、contract2. 实验的结果见表 1.

