Page 61 - 《软件学报》2025年第7期
P. 61
2982 软件学报 2025 年第 36 卷第 7 期
发出的相应 Python 函数. 例如, 对于 Cassandra, DUPTester 用对 Python 程序中 Cluster.Session.execute(q) 的调用来
替换单元测试方法 CQLTester.execute(q) 的调用. 然而, 考虑到业务逻辑和代码语法的复杂性, DUPTester 不能保
证正确翻译所有语句. 因此, DUPTester 提供了一个接口, 允许测试人员指定单元测试方法或软件内部函数 (在单
元测试中调用) 与外部命令 (可由客户端发出) 之间的映射关系, 并基于该映射关系完成测试用例的转换.
3.1.3 节点消息构造技术
节点消息构造技术基于分布式基础通信架构, 模拟生成节点交互通信包, 生成一系列通信消息测试输入. 一方
面, 通过构造分布式环境中各节点间交互通信的测试输入, 可以模拟各种可能的正常和异常节点间消息交换场景,
以验证这些协议和接口的实现是否符合规范, 保障系统组件之间能够正确交互, 同时评估系统在处理这些交互时
的性能、稳定性和安全性. 另一方面, 通过构造异常或恶意设计的节点间消息, 测试输入可以揭示分布式系统中潜
在的安全缺陷, 如信息泄露、拒绝服务攻击 (DoS)、拜占庭攻击等. 考虑到节点间通信消息往往是高度结构化、
语义化的, 生成高质量且语法语义正确的消息是消息生成工具的主要探索目标. 目前, 典型节点消息构造技术主要
有两大类: 基于模型的消息生成技术和基于种子的消息变异技术.
3.1.3.1 基于模型的消息生成技术
在分布式系统动态测试中, 基于模型的消息生成技术指的是利用预定义的模型来自动生成用于测试的消息通
信包. 模型通常包括状态模型和数据模型. 状态模型描述了系统或组件可能处于的各种状态以及在接收到特定消
息时如何从一个状态转换到另一个状态; 数据模型则定义了消息的结构、格式和有效值范围, 用以生成符合实际
通信协议或业务逻辑的测试数据.
Brown 等人 [93] 设计的测试工具 netFuzz 通过生成大量消息通信包对分布式系统进行模糊测试. 首先, 它提供
了一个用于描述消息的模板, 用户可以基于该模板自定义待测系统的消息语法格式和关键语义字段等. 随后,
netFuzz 将该模板信息自动解析转换为状态模型和数据模型, 并基于这些模型生成大量的消息测试包, 通过网络插
件接口发送给待测系统. 此外, Peach [94] 是一个针对各种网络协议进行模糊测试的常用工具. 测试者编写包含待测
目标数据模型和状态模型的 pit 文件, Peach 根据这些模型自动生成大量通信测试包. Peach 使用数据模型来定义
协议消息的结构和行为, 描述节点之间交换消息的格式. Peach 还使用状态模型来定义消息交换的顺序, 捕获协议
的逻辑. 一旦定义好这些模型, Peach 会系统地对消息和序列进行变异, 生成各种测试输入, 并将这些输入发送到分
布式系统中. 通过监控系统对这些输入的响应, Peach 帮助发现分布式协议中的缺陷、不正确的实现和潜在的安全
问题.
3.1.3.2 基于种子的消息变异技术
基于种子的消息变异技术是通过对已知有效的消息样本 (种子) 进行系统性修改和扰动来生成新的测试消息
的方法. 该技术旨在通过轻微改变种子消息的结构或内容, 探索待测系统对异常或边缘情况输入的处理能力, 从而
揭露潜在的错误或缺陷. 这种方法通常应用于灰盒测试流程中, 通过分析待测系统的运行时反馈信息, 动态调整变
异策略, 以提升测试效率.
典型动态测试工具 LOKI [75] 和 Tyr [76] 均使用基于种子的消息变异技术来构造拜占庭攻击包, 以检测分布式共
识协议中的缺陷. 具体来说, 在测试启动阶段, 它们将自己伪装成正常节点, 接入区块链网络. 随后, 它们实时监控
网络中的消息通信包, 收集正常节点间的消息包作为初始种子加入种子池中. 由于分布式系统中的消息通信包种
类繁多且高度结构化, 消息变异时必须保持其语法结构的正确性. 因此, LOKI 和 Tyr 在变异消息时, 仅变异每个包
字段的内容, 而不破坏其结构. 对于不同类型的字段, 它们使用不同的突变操作: 数值突变器随机将数值类型转换
为另一个数字, 字符串突变器修改字符串生成新字符串, 结构体对象类型则递归地突变结构体中的每个变量字段.
在测试阶段, 为了尽可能探索更多共识状态, LOKI 实时收集待测系统运行时的状态转移信息, 并以此作为反馈引
导消息的变异过程. 任何能导致新状态转移的消息包被认作有趣的消息种子, 保留进种子池用于后续测试变异. 而
Tyr 为了更频繁地触发分布式节点共识不一致缺陷, 实时收集分布式节点之间的行为信息, 并基于行为分化模型
计算它们之间的行为差异. 任何能导致节点行为差异增加的消息包被认作有趣的消息种子, 保留进种子池. 通过这
些方法, Tyr 能持续分化分布式节点的行为逻辑, 更快更多地挖掘共识不一致缺陷.

