<>区块链安全测试

<>前言

* 区块链如何进行安全测试?
* 如何挖掘区块链源码中的安全漏洞?
* 如何验证可能存在的安全的漏洞?
这些,都是想进入区块链安全领域会遇到的一些常见问题。区块链安全与web安全有很大的不同,但是有些地方却与传统安全有相通之处,比如拒绝服务,资源消耗,错误处理。

<>范围

本文主要讨论以go语言写的区块链源码中的安全问题。主要原因是golang中许多小工具是方便测试的,如gotest, go fuzz等。

<>架构


在进行测试之前,心里面有一个测试的蓝图很重要。正如web渗透测试需要进行信息收集工作一样,当遇到一条新的区块链,需要尽可能收集区块链的信息。而区块链之间一般都有一些共通的地方,了解区块链的架构有助于安全测试的进行。

* 账户(account)
* 区块数据(block)
* 存储(database)
* 节点(node)
* 节点之间的交互,seed节点寻找(P2P)
* 节点同步(共识)
* 共识机制的实现(consensus)
* 接口(可fuzz)
<>方法

类似于源码审计。了解架构和常见的漏洞,直接找到区块链的相关部分代码。通过写go_test
文件来学习和验证自己的所想。可视化相关的数据结构(通过t.Log()打印出来)。在函数之间跳转和定位(通过Go_land进行加载)。通过go-fuzz
半自动化进行fuzz测试。通过历史漏洞(github issue)和公开漏洞报告(hackerone, community)不断进行学习。

<>安全测试点

* 可能产生崩溃(panic, 错误处理不当)
* 组件之间的逻辑依赖(需要考虑某个组件如果崩溃,会不会导致另一个组件崩溃)
* 寻找使程序一直挂起的特定状态(死锁,死循环)
* 序列化和反序列化,编码解码产生的崩溃(一般通过fuzz测试)
* P2P安全(节点连接)
* 节点连接失败
* 种子节点配置不当(畸形的格式导致崩溃)
* 种子地址格式
* 节点并发连接限制(防日食攻击)
* 接口安全
* 畸形数据导致崩溃(如区块高度类型为int则可发送负值)
* 接口并发连接限制(gRPC)
* 不安全的随机数(但要识别是否会影响敏感数据)
<>Bug与漏洞

* Bug与漏洞是一样的吗?

这是一个很有趣的问题,区块链中bug和漏洞经常被混淆。从利用者的角度来看,如果这个bug能被外部利用,这个bug可以称之为漏洞;如果因为代码不合理,导致用户在操作过程中产生崩溃,服务停止的现象,这就bug。但是在区块链的赏金计划中,bug和能被利用的漏洞都是被鼓励提交的,所以有时候考虑一些代码的逻辑不合理,并且提交给赏金计划,也是一个不错的选择。

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信