实战必读! 发现百万级用户公链漏洞,我们靠的是这套方法
本文作者负责支撑工信部、发改委、央行、雄安新区及多省市区块链产业落地,保障场景建设质量。受托测试的公链是国际两大楔入式侧链技术解决方案之一,拥有注册用户百万级。本文将介绍如何利用一套测试方法,发现该公链账户系统设计缺陷的实战过程和经验总结。
测试——最经济有效的区块链质保手段
对于区块链产品或系统而言,质量问题,如可靠性、兼容性、性能和安全性等都是无法回避的关键问题,也是其影响相关应用和行业发展的重要因素。
业界常用的质量保障手段,包括软件工程方法、正式技术评审、度量与控制、标准与过程、SCM和SQA、测试等方法。从工程实践看,只有综合运用上述方法才能获得高质量系统,其中测试是保障区块链信息系统质量最有效、最经济的手段之一。
图1 质量保障手段
百万级用户待测公链简介
本次受托开展测试的公链A,是以侧链技术为基础的新型非中心化应用,已成为国际两大楔入式侧链技术解决方案之一,拥有注册用户百万级,关注量近千万。其实现了双向SPV楔入方式与侧链系统或DAPP进行数据交互,适用于金融、保险、电子商务、虚拟代币、股权众筹、医疗信息等行业领域。其核心技术(侧链技术)是一种在不改变区块链信息系统或区块链场景现有架构基础上,采用扩容方式增加新功能,实现新业务场景的重要解决方案。如下图所示:
图2 公链A系统架构
公链A有几大优势:
各侧链系统上数据存储交易相对独立;
侧链系统扩容不会增加区块链信息系统主链负担,不会降低主链运行效率;
能有效避免区块链信息系统主链上数据的过度膨胀和不可控;
实现灵活定制的各项区块链侧链参数,如区块间隔、交易费、奖励等。
测试环境部署详解
数字资产提现和充值操作是区块链信息系统两个原子操作,在精准扶贫场景下,使用充值和提现原子操作,可实现贫困人口扶贫款入账和出账、扶贫物资的发放和使用、扶贫权限的监督和控制等。充值和提现原子操作,其远不止书面意义,所有涉及数值变化的所有操作可简单归纳为提现和充值两部分。公链A的提现和充值操作,在其构建的全球数字资产交易网络中,提现操作可根据资产名字、数量、接收者地址、一级密码、二级密码生成的交易数据,实现不同侧链、不同账户、不同资产之间的基于虚拟货币构建的数字资产价值的上链和转移。
以提现和充值原子操作为测试对象,为充分验证公链A升级前后的功能,可如下构建一套区块链仿真测试环境,测试仿真环境物理部署如下。
图3 仿真环境物理部署图
测试环境主侧链逻辑部署如下,不同侧链(也是由区块依次链接构建的区块链信息系统)之间无法直接交互,需通过主链之间完成价值传递。
图4 仿真环境逻辑部署图
测试用例设计细节
为较好开展提现和充值测试,分析公链A升级前后的结构变化,由于账户体系变化,结合影响域理论,建议重点对不同账户体系下的提现和充值进行测试。本次,采用探索式测试方法,结合正交矩阵法设计测试用例,设计侧链A采用base58check地址(新账户体系),侧链B采用Digital地址(旧账户体系)。
图5 测试用例设计图
如上图,对采用Digital实现的旧账户体系与采用base58check实现的新账户体系之间的充值、提现原子操作采用正交矩阵法进行用例设计,基于公链A开源代码编写测试脚本,共设计4组16个用例,对新账户到新账户、新账户到老帐户、老帐户到老帐户、老账户到新账户之间的充值和提现操作进行单笔和多笔交易。(因可能涉及用户隐私,故详细测试用例暂不披露)
测试过程展现
结合上述思路,侧链A采用base58check地址(新账户体系),侧链B采用Digital地址(旧账户体系),预期通过多次调用数字资产提现测试脚本,侧链B资产将转移至侧链A。
批量执行提现操作(如图4次),侧链A资产从100增加至500;
侧链B资产从799.29减少至 399.29(不包含手续费)。
图6 批量提现操作
系统批量执行提现,侧链A资产成功从100增加至500,侧链B资产未减少,数字资产凭空增加。反之,也存在数字资产凭空消失现象。
侧链A提现前后资产变化:
侧链B提现前后资产变化:
测试结果剖析
公链A发生数字资产提现操作异常,提现操作后侧链A资产增加,侧链B资产未有变化。采用如下步骤,对测试结果进行剖析,分析定位缺陷所在。
分析测试脚本、执行日志,未发现缺陷和异常告警;
分析侧链A/B间通信数据,侧链B发布充值成功通知;
静态分析侧链B源代码,发现提现或充值操作设计缺陷。
公链A迭代升级后,新引入一种采用base58check实现的新账户体系,且同时存在采用Digital实现的旧账户体系,从而导致新旧账户体系之间提现和充值原子操作异常。采用Digital实现的旧账户体系存在设计缺陷,其对于非Digital发起的任一操作不做响应,但又返回非空的特定值。在旧账户体系中,特定值代表执行失败,然而不同账户体系下,非空值也许意味着成功(非空即为真)。也就是基于此,采用Digital实现的旧账户体系对于采用base58check实现的新账户体系发起的任一充值和提现原子操作均返回特定值,旧账户体系是未正确执行,在新账户体系下,却意味着成功执行。
经深入了解其开发流程,发现其根本原因在于新版本上线前,未严格执行准入准出制度,自测试用例不足,测试不充分,无法保障新系统上线质量,从而引入账户系统设计缺陷,新版本无法向下兼容,最终导致公链A提现异常。
对读者的建议
运营人员:建议提早禁止旧版本登陆,强制升级至新版本,同步对采用base58check实现的新账户体系进行升级改造,防范采用Digital实现的旧账户体系进行重放攻击,并全面禁止数字地址跨链转账到侧链或应用链,拥有数字地址的老账户可以先把资产中转到新的base58check账户,然后再跨链转移到侧链。
开发人员:建议对升级补丁或版本变更部分做合理、有效分析,邀请同行确定其影响域,充分开展自测试后再提交合并。
测试人员:采用下述准入准出制度,充分设计测试用例,严格执行确保测试未达到要求前,系统测试不进入下一阶段。
建议的准入准出制度:
1. 测试用例设计已经通过评审
2. 按照集成构件计划及增量集成策略完成了整个系统的集成测试
3. 达到了测试计划中所规定的覆盖率的要求
A. 语句覆盖率最低不能小于 98%
B. 测试用例执行覆盖率应达到 100%
C. 测试需求执行覆盖率应达到 100%
4. 在测试中发现的错误已经得到修改,各级缺陷修复率达到标准。
A. 一、二级错误修复率应达到100%
B. 三、四级错误修复率应达到98%以上
C. 五级错误修复率应达到90%以上
作者简介:相里朋,工信部电子五所高级工程师、中国计算机学会区块链专委会委员、贵阳区块链测试认证中心、重庆区块链测试认证中心主任,开展区块链质量保障技术研究。支撑工信部、发改委、央行、雄安新区、重庆市、贵州省、广东省等地市,推进区块链产业落地,保障场景建设质量。借调贵阳副市长秘书,市秘书长助理。完成省课题2项,标准5项(《区块链系统测评和选型规范》、《区块链与分布式记账信息系统评估规范》),区块链丛书1本(区块链与产业创新),发表SCI及期刊5篇。
🔚
公众号又双叒改版了,为了不错过第一手行业动态与技术风向,建议你按照图片的提示,将【区块链大本营】设为星标(安卓用户设为置顶),标星看大图更舒服哟!
推荐阅读
识别二维码入群,备注姓名+公司+职位
内容转载请加 171075719,备注“转载”
商务合作请加 fengyan-1101