前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实战必读! 发现百万级用户公链漏洞,我们靠的是这套方法

实战必读! 发现百万级用户公链漏洞,我们靠的是这套方法

作者头像
区块链大本营
发布2018-12-13 16:49:48
4830
发布2018-12-13 16:49:48
举报
文章被收录于专栏:区块链大本营区块链大本营

本文作者负责支撑工信部、发改委、央行、雄安新区及多省市区块链产业落地,保障场景建设质量。受托测试的公链是国际两大楔入式侧链技术解决方案之一,拥有注册用户百万级。本文将介绍如何利用一套测试方法,发现该公链账户系统设计缺陷的实战过程和经验总结。

测试——最经济有效的区块链质保手段

对于区块链产品或系统而言,质量问题,如可靠性、兼容性、性能和安全性等都是无法回避的关键问题,也是其影响相关应用和行业发展的重要因素。

业界常用的质量保障手段,包括软件工程方法、正式技术评审、度量与控制、标准与过程、SCM和SQA、测试等方法。从工程实践看,只有综合运用上述方法才能获得高质量系统,其中测试是保障区块链信息系统质量最有效、最经济的手段之一。

图1 质量保障手段

百万级用户待测公链简介

本次受托开展测试的公链A,是以侧链技术为基础的新型非中心化应用,已成为国际两大楔入式侧链技术解决方案之一,拥有注册用户百万级,关注量近千万。其实现了双向SPV楔入方式与侧链系统或DAPP进行数据交互,适用于金融、保险、电子商务、虚拟代币、股权众筹、医疗信息等行业领域。其核心技术(侧链技术)是一种在不改变区块链信息系统或区块链场景现有架构基础上,采用扩容方式增加新功能,实现新业务场景的重要解决方案。如下图所示:

图2 公链A系统架构

公链A有几大优势:

  1. 各侧链系统上数据存储交易相对独立;
  2. 侧链系统扩容不会增加区块链信息系统主链负担,不会降低主链运行效率;
  3. 能有效避免区块链信息系统主链上数据的过度膨胀和不可控;
  4. 实现灵活定制的各项区块链侧链参数,如区块间隔、交易费、奖励等。

测试环境部署详解

数字资产提现和充值操作是区块链信息系统两个原子操作,在精准扶贫场景下,使用充值和提现原子操作,可实现贫困人口扶贫款入账和出账、扶贫物资的发放和使用、扶贫权限的监督和控制等。充值和提现原子操作,其远不止书面意义,所有涉及数值变化的所有操作可简单归纳为提现和充值两部分。公链A的提现和充值操作,在其构建的全球数字资产交易网络中,提现操作可根据资产名字、数量、接收者地址、一级密码、二级密码生成的交易数据,实现不同侧链、不同账户、不同资产之间的基于虚拟货币构建的数字资产价值的上链和转移。

以提现和充值原子操作为测试对象,为充分验证公链A升级前后的功能,可如下构建一套区块链仿真测试环境,测试仿真环境物理部署如下。

图3 仿真环境物理部署图

测试环境主侧链逻辑部署如下,不同侧链(也是由区块依次链接构建的区块链信息系统)之间无法直接交互,需通过主链之间完成价值传递。

图4 仿真环境逻辑部署图

测试用例设计细节

为较好开展提现和充值测试,分析公链A升级前后的结构变化,由于账户体系变化,结合影响域理论,建议重点对不同账户体系下的提现和充值进行测试。本次,采用探索式测试方法,结合正交矩阵法设计测试用例,设计侧链A采用base58check地址(新账户体系),侧链B采用Digital地址(旧账户体系)。

图5 测试用例设计图

如上图,对采用Digital实现的旧账户体系与采用base58check实现的新账户体系之间的充值、提现原子操作采用正交矩阵法进行用例设计,基于公链A开源代码编写测试脚本,共设计4组16个用例,对新账户到新账户、新账户到老帐户、老帐户到老帐户、老账户到新账户之间的充值和提现操作进行单笔和多笔交易。(因可能涉及用户隐私,故详细测试用例暂不披露)

测试过程展现

结合上述思路,侧链A采用base58check地址(新账户体系),侧链B采用Digital地址(旧账户体系),预期通过多次调用数字资产提现测试脚本,侧链B资产将转移至侧链A。

  1. 批量执行提现操作(如图4次),侧链A资产从100增加至500;
  2. 侧链B资产从799.29减少至 399.29(不包含手续费)。

图6 批量提现操作

系统批量执行提现,侧链A资产成功从100增加至500,侧链B资产未减少,数字资产凭空增加。反之,也存在数字资产凭空消失现象。

侧链A提现前后资产变化:

侧链B提现前后资产变化:

测试结果剖析

公链A发生数字资产提现操作异常,提现操作后侧链A资产增加,侧链B资产未有变化。采用如下步骤,对测试结果进行剖析,分析定位缺陷所在。

  1. 分析测试脚本、执行日志,未发现缺陷和异常告警;
  2. 分析侧链A/B间通信数据,侧链B发布充值成功通知;
  3. 静态分析侧链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篇。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 区块链大本营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档