Page 54 - 《软件学报》2025年第7期
P. 54

陈元亮 等: 分布式系统动态测试技术研究综述                                                          2975


                    为了检测这些问题, 动态测试工具在生成测试输入时需确定预期执行结果, 并通过对比实际结果和预期结果
                 来发现问题. 为实现这一目标, 这类工具需要深入分析和建模待测分布式系统的输入语义, 以理解其预期行为和执
                 行规则, 从而保障测试的准确性和有效性.
                    因此, 针对功能缺陷的测试工具的主要技术难点在于制定缺陷判断准则. 这需要对分布式系统的行为逻辑有
                 深入理解, 并进行详尽的分析和输入语义建模. 差分测试和蜕变测试是确定预期结果的有效方法, 降低了系统语义
                 建模的难度. 差分测试通过对比相似的分布式系统或同一系统的不同版本来获得预期结果. 典型测试工具
                 Fluffy [69] 通过持续对比以太坊分布式协议的不同语言实现版本             (Go-Ethereum  和  OpenEthereum) 的执行结果, 成功
                 发现了两个严重的以太坊交易执行功能缺陷. 工具                 Mocket [74] 差分对比分布式系统设计时的形式化模型与其代码
                 实现的逻辑不一致, 成功检测出          9  个系统功能实现缺陷. 蜕变测试基于已有测试执行结果, 对输入进行蜕变转换以
                 获取预期结果. 典型工具       ChaT [66] 通过建立蜕变关系: 系统在相同负载输入、不同执行优化配置输入下, 优化后的
                 执行性能应大于等于优化前. 基于此蜕变测试, ChaT             生成大量等价配置文件持续对系统的配置处理逻辑进行测试
                 验证, 挖掘出不少功能缺陷.
                    此外, 通用特征建模和用户友好的自定义建模接口是确定预期结果和构建判断准则的常用方法. 基于系统特
                 性总结, 通过分析系统设计文档、代码、用户反馈或历史缺陷, 总结系统的特性或行为模式, 检查实际运行时是否
                 偏离这些特性. 典型工具 LOKI       [75] 通过对区块链交易流程建模, 构建了 liveness (合法交易最终被执行) 和 safety
                 (不合法交易不能记账) 两个判断模型. 在生成交易输入时, 基于模型自动输出预期结果集, 并在测试后对比实际结
                 果, 成功在主流区块链系统中发现了 6 个严重的交易逻辑漏洞. 用户自定义模型, 允许测试者根据系统逻辑理解和
                                                                [58]
                 预期, 定义一套规则或模型来检查系统行为. 典型工具 Jepsen                允许测试人员编写 Clojure 语言脚本和配置文件,
                 详细定义待测系统的异常行为判断条件. 在测试过程中, Jepsen 实时检测这些准则并输出缺陷报告, 及时识别异常
                 行为. Jepsen 已在多种主流分布式数据库和协议中挖掘出近百个系统缺陷.

                 2.2   针对安全漏洞的测试工具
                    安全漏洞是指在分布式系统中发现内存安全、断言异常、错误代码实现导致系统崩溃、未授权的访问等危
                 害系统安全性的缺陷. 崩溃漏洞可以使待测分布式系统服务宕机, 会严重影响其上层应用的运行, 容易造成较大的
                 损失. 未授权访问漏洞陷可以导致数据泄露、敏感信息被窃取、数据篡改、系统配置被恶意修改, 甚至使攻击者
                 能够完全控制系统, 造成破坏性后果.
                    崩溃漏洞检测是在待测系统执行测试输入过程中, 测试工具会监控系统的分布式进程状态, 判断是否出现崩
                 溃信号. 考虑到内存安全问题          (如缓冲区溢出、栈溢出) 在早期不会出现明显症状, 测试工具常使用                       Address-
                 Sanitizer (ASAN) [81] 对待测代码进行插桩处理, 实时监控内存异常访问并提前抛出崩溃信号. 由于检测崩溃漏洞是
                 动态测试的基础功能, 所以这一类工具的主要技术难点主要集中在生成高质量的测试用例输入以高效触发系统崩
                 溃. 典型测试工具     LOKI [75] 通过实时感知分布式系统的运行状态, 自动构建关键消息状态机模型, 并基于此优化测
                 试消息输入, 提高测试覆盖率, 检测更多安全漏洞. LOKI 认为消息状态机覆盖反映了测试工具对分布式系统测试
                 的完备程度. 如果一个消息测试输入可以触发更多的新的状态、状态转移, LOKI 将其视为一个有意义的测试输
                 入, 可以通过对其进行变异来触发之前未覆盖的消息状态转移. LOKI 通过收集每个消息测试输入的状态转移数,
                 引导消息测试输入的变异, 从而提高生成质量. 在对                Go-Ethereum、Fabric、FISCO BCOS、Diem  等系统的   24 h
                 测试中, LOKI 发现了    14  个崩溃漏洞.
                    未授权访问漏洞检测是指通过分析系统行为和权限检查逻辑, 识别系统在执行特权操作时未进行适当权限验
                 证的情况. MPChecker  [72]  首先通过静态分析对系统代码进行扫描, 识别出所有可能涉及权限检查的代码路径和特
                 权操作点. 对这些操作点建立权限检查模型, 记录系统在执行这些操作前应进行的权限检查逻辑. 基于权限检查模
                 型, 工具自动生成一系列测试用例, 这些测试用例模拟各种合法和非法的权限操作. 这些用例旨在触发系统的各种
                 功能, 并测试系统对不同权限请求的响应. 如果有违反权限模型的访问操作, 这被视为未授权访问漏洞. Morpheus
                 在     HDFS、HBase、YARN  等主流分布式系统上进行了长时间的测试, 并最终挖掘了                44  个新的未授权访问漏洞.
   49   50   51   52   53   54   55   56   57   58   59