设为首页收藏本站

安徽论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 83739|回复: 0

区块链安全测试

[复制链接]

85

主题

0

回帖

267

积分

中级会员

Rank: 3Rank: 3

积分
267
发表于 2022-3-26 10:29:22 | 显示全部楼层 |阅读模式
网站内容均来自网络,本站只提供信息平台,如有侵权请联系删除,谢谢!
区块链安全测试

前言



  • 区块链如何进行安全测试?
  • 如何挖掘区块链源码中的安全漏洞?
  • 如何验证可能存在的安全的漏洞?
这些,都是想进入区块链安全领域会遇到的一些常见问题。区块链安全与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, 错误处理不当)

    • 组件之间的逻辑依赖(需要考虑某个组件如果崩溃,会不会导致另一个组件崩溃)
    • 寻找使程序一直挂起的特定状态(死锁,死循环)
    • 语言特性(Go语言的错误处理)

  • 序列化和反序列化,编码解码产生的崩溃(一般通过fuzz测试)
  • P2P安全(节点连接)

    • P2P拒绝服务(构建P2P消息,向节点发送可以使节点崩溃的信息)
    • 节点连接失败
    • 种子节点配置不当(畸形的格式导致崩溃)

      • 种子地址格式

    • 节点并发连接限制(防日食攻击)

  • 接口安全

    • 畸形数据导致崩溃(如区块高度类型为int则可发送负值)
    • 接口并发连接限制(gRPC)

  • 不安全的随机数(但要识别是否会影响敏感数据)
  • 底层逻辑实现安全(如merkle tree实现,典型的漏洞CVE-2012-2459)
Get Your Hands Dirty- RPC

有时候比较懒,不太想去看源码,那就直接从接口入手。刚刚开始测试的时候,喜欢在终端手动发curl来测试。一般来说接口分为两类,一类有权限,需要进行认证。另外一类无需认证,一般进行一些基本的链上信息查询。
对于有权限的,也可以分为基于HTTP basic authentication的,这一类需要在header增加认证,下面这段代码就是基本验证的一个代码,只有通过了基本验证才能调用RPC。
  1.         user, pw, ok := req.BasicAuth()        if !ok {                return "", ErrNoToken        }
复制代码
另外一类是在json体里带上认证的密码,这一类直接在data里面加就可以了。
最后一类是不需要权限的,直接调用。


  • Summary

    • 有权限限制

      • HTTP basic authen
      • json中带密码

    • 无权限限制(直接调用)

对于有权限的接口,可以按照传统安全的思路,去检查源码,验证是否合理,是否能绕过,如果代码写得不好,可能会出现越权问题。越权对节点进行操作,越权查看节点敏感信息
对于可以直接调用的RPC,重点关注畸形数据是否down掉节点,即DOS攻击。
Get Your Hands Dirty- P2P

除了RPC可以让节点服务崩掉,通过构建P2P服务器并且给节点发送构造好的消息,也能使得节点崩溃。而且P2P有个好处是这里一般没有权限限制,现在许多链都有在RPC处做权限限制,所以即使找到了RPC处的漏洞可能影响也要下降好几个等级。
P2P漏洞原理一部分与RPC相同,难点在于如何根据链的源码构建出P2P服务。主要分为四步:


  • 确定目标P2P地址
  • 构建P2P服务
  • 构建消息
  • 通过P2P服务向目标P2P地址发送构建好的消息
Bug与漏洞



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

各个公链的区块链项目都是开源的。所以获取源码是很简单的,获取到源码后如何去找漏洞?
在审计之前,先要做一番探索。探索,越轻越好,一上来就是各种环境,太重。
轻量级别的,源码,go环境,IDEGoland(用于跳转函数,变量),文档。
大略过一下文档,根据文档里面介绍的RPC接口,到源码搜索,找到接口集中的api文件,把这些接口复制到excel表格,对接口进行编号,功能介绍,大致对这条链的一些功能有些初步认识。


  • 接口审计
    对接口审计,还是关注外部输入量。
    注意接口处理函数对外部输入量的处理,是否进行验证(检验为空,为负值的异常情况)
    同时尝试运行相关的test文件,通过test文件运行部分功能,对功能有个直观的认识。
    第一轮对接口对应的处理函数过一遍,运气好可以发现几个漏洞。即使没有发现,对这个区块链系统的基本底层功能也大致有了个了解。
  • 一些存在风险的函数
    make,第二个参数足够大导致崩溃
    append, append的个数足够大导致崩溃
    for循环次数太多导致崩溃
下一步就是搭建测试网环境,关注其他更重要的验证部分和共识部分。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
免责声明
1. 本论坛所提供的信息均来自网络,本网站只提供平台服务,所有账号发表的言论与本网站无关。
2. 其他单位或个人在使用、转载或引用本文时,必须事先获得该帖子作者和本人的同意。
3. 本帖部分内容转载自其他媒体,但并不代表本人赞同其观点和对其真实性负责。
4. 如有侵权,请立即联系,本网站将及时删除相关内容。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表