1 .XVG挖矿异常事件简要回顾

最近几天,一个叫XVG的数字货币在普遍都不太好的币市中大出风头,短短几天之中,币价翻了好几倍,但前段时间,一起安全事件让XVG的开发团队和持有它的矿工出了一身冷汗。

4月4日,bitcointalk论坛上ID为ocminer的用户发帖反馈XVG遭到51%攻击。据反馈自XVG区块高度2007365之后,出块时间变得很快,在某些块高度上面,甚至是一秒出一个块,并且这些区块都是利用scrypt算法挖到的,如图一所示。

在ocminer发帖之后的一段时间里,起初XVG的开发团队并不认为这是一次攻击事件,并安抚大家不要太焦虑,但是随着事件的发酵,很多矿池已经无法正常工作了,开始不断挖到孤块,正常情况下,矿池一天挖到的孤块数量不会太多,连续挖到孤块的情况更不太可能发生,如下图所示,自从4月4号13点54开始,挖到的块都是孤块,因此矿池决定暂停XVG的挖矿服务。随后XVG开发团队开始响应这次事件,对于代码进行了两次patch,这样才让这次安全事件渐渐平息下来。

2 XVG简介和挖矿安全事件分析

2.1 加密货币XVG简介

XVG又名verge,是基于比特币技术的开源加密货币,主打匿名性,与门罗,达世类似。XVG最初是在2014年推出的,由于快速增长的社区,这个数字货币迅速流行,并不断吸引世界各地的用户前来投资。

XVG的挖矿算法有Scrypt/X17/lyra2rev2/MYRgroestl/blake2s这5种,并且出块时间仅为30秒,大大小于比特币的10分钟。因为支持的算法多,可以使更多矿工能够挖到XVG币,从而确保每个人都有平等的机会获取XVG币。

在生成新块的时间戳校验方面,XVG是借鉴了旧版的比特币的代码。在checkblock()和acceptblock()函数当中调用了时间戳校验的算法,与bitcoin0.8.2相同,分别是按照如图四中的函数执行流程获得调用。

图四

2.2 XVG难度的调整

XVG的难度调整算法会向前回溯取相同算法12个区块的难度平均值做一个计算,如果实际出块时间间隔小于理想出块时间间隔(12*150)的三分之一则调整难度为均值的三倍,如果大于理想出块时间间隔(12*150)的三倍则调整难度为均值的三分之一。这样做的目的是通过对比实际出块时间间隔和理想出块时间间隔进行动态难度调整,如果出块慢了,那么就降低难度,如果出块快了,就增加难度,但是调整的时候使用上下限进行限制,这是为了慢慢的调整难度值,防止难度过快的变化,相关代码如图五所示。

2.3下面是我们对攻击流程的分析

首先攻击者拥有很大的算力,攻击者很快使得自己的挖到的区块所在的链成为了主链。因为区块链的一个特点就是最长的链就是主链。同时修改时间戳,让其他矿工所挖的区块通过不了时间戳范围校验,成为孤块。这就造成了只有攻击者可以挖到块,而其他正常矿工不能在攻击者控制的主链上挖到块。

2.3.1初始阶段

通过观察发现,攻击者最开始修改时间戳的块是2007355,并不是ocminer所说的2007365,如图六:

从区块2007355到2007363可以看出,攻击者修改出块时间为每五分钟一个(上图紫色颜色的时间),当然实际上攻击者的出块时间比显示的时间戳快很多。由于伪造的时间戳间隔远远大于正常出块时间的30秒,XVG会降低难度,通过这9个块,XVG的挖矿难度已经下降了一半.正常情况下,9个块的时间45分钟左右相当于攻击者将正常挖矿时间提前了40分钟左右。在Checkblock()中,因为攻击者伪造了时间戳,使得pindexPrev->GetMedianTimePast()的值增大,即前11个区块的时间戳中值,使得正常时间戳出的块无法满足大于前11个块时间戳中值的条件,从而正常时间戳出的块无法添加到攻击者挖掘的这条长链上。图七是Checkblock()中校验时间戳的代码。

下面对代码做简单解释。

图七代码的意思为只要新块的时间戳大于之前11个block的时间戳的中位数,且不超过当前网络时间2个小时,则这个块都被认为有效。GetBlockTime()只是简单返回位于class CBlockHeader 中的nTime成员,也即本块生成的时间戳。

GetMedianTimePast()的实现如图八:

图八

新块的时间戳需要大于前11个block的时间戳的中位数这个容易理解,但是nMaxClockDrift为什么要设置为2个小时,将nMaxClockDrift宽泛的设置成2个小时主要是考虑到blockheader上的时间戳并不像NTP服务器那样是一个严格准确的时间,新块的开采也需要一定的时间,比方说对于比特币可能是10分钟左右才能创建成功一个新块,极端情况下可能会远远超过10分钟,一旦nMaxClockDrift时间设置的过小,后续合法产生的新块的时间戳,由于时间戳过大,很可能没办法满足时间戳校验条件,造成区块链没有办法再添加的区块。

2.3.2控制修改时间戳,使得难度不至于快速下降

经过第一阶段,攻击者已经基本上可以独占挖矿了,难度也已经下降了很多,这一阶段攻击者已经不需要很大的算力了,因为这时候,正常矿工挖出的块,已经不能通过时间校验了,攻击者可以不受干扰的挖矿,自己也完全可以控制挖矿难度。同时为了不至于难度下降过快,从而导致其他矿工发现和其他问题出现,攻击者有意的控制了出块的时间戳。

第一种方式:故意交替的改变时间戳,大约差值为一个半小时(从2007365块高度开始)

当前一个块减去后一个块时间为正的一个半小时,这时候难度是下降的

当前一个块减去后一个块时间戳为负的一个半小时,这时候难度是增长的。

如下表所示

第二种方式:每隔9个块,使得连续的三个块时间间隔改为1秒(图二红色字体)

很显然根据难度调整的函数,我们知道这里出块的速度非常的快。导致这里难度极速回调。

下表是红色的块的难度情况。

当然总体的趋势是难度不停的下降,如图九所示。

综上所述,攻击者就可以独占自己的这条长链进行挖矿,根据最长链原则(把累计了最多难度的区块链作为主链,在一般情况下,也是包含最多区块的那个链),这条链就变成了主链,并使得自己挖矿难度不断降低,从而保持最长链的优势,某些区块的难度被攻击者降为接近于0。由于XVG每30秒就出块一次,它的分叉会比特币频繁很多。同样挖掘第2007433高度的块,正常矿工和攻击者挖矿难度不同,因此正常矿工所挖的分叉链远远没有办法同攻击者的最长链做竞争,导致最后都成为了孤块

图十是矿池挖到的孤块,图十一是攻击者挖到的区块,两图对比可以看到高度2007433上的一个孤块在挖掘的时候同攻击者独占挖掘的最长链不是同一个链,并且难度也不同。

3. XVG团队的对代码的修改

3.1XVG团队的第一次patch

XVG团队第一次的patch可以在这里看到。

https://github.com/vergecurrency/VERGE/commit/a3dd53f40aaedd28bd4d0fc720f034492f7ded81

patch改动如下三图。

Patch的代码是以区块高度2040000为限,小于等于2040000高度的区块时间戳检查依然采用之前的逻辑,即新块的时间戳要大于之前11个block的时间戳的中位数、且不超过当前网络时间2个小时。而大于2040000高度的区块时间戳检查变更为,新块的时间戳要大于前一个区块的时间戳,并且不可以超过当前网络时间20分钟。很明显第一次patch的第一个条件

if (GetBlockTime() <pindexPrev->GetBlockTime())return error(“AcceptBlock() : block’s timestamp is tooearly”);

会大量误伤矿工合法产出区块。因为即使是正常出块,下一个区块的时间戳也不能总是保证比上一个块的时间戳大。由于XVG是30秒左右出一个块,不同于比特币10分钟的出块时间,后一个条件设置将nMaxClockDrift由2小时缩短到20分钟也不会造成XVG区块链无法接续的情况。XVG团队的第一次patch主要是想通过缩短nMaxClockDrift的值加强时间戳校验,阻止例如2007385和2007386,2007387和2007388这样的间隔超过20分钟的区块产生。缩短nMaxClockDrift的值以及校验前后区块时间戳顺序从表面上看似可以阻止攻击,但是如果使用大算力的scrypt继续挖矿,攻击者依然可以按照相应的时间戳判定逻辑伪造时间戳,并绕过代码检测。

3.2xvg团队的第二次patch

由于XVG支持5种算法竞争挖矿,正常挖矿的情况下,取10个区块如下截图。

由于竞争关系,可以看到10个区块不全都是一种算法产生的。而在被恶意挖矿的区块,截图情况如图十六,scrypt算法在这段时间垄断了出新块的挖矿。

第二次patch的在如下链接

https://github.com/vergecurrency/VERGE/commit/80c81aef63272231fc39c2af4b8db9f3f2e9d328

如图十七和十八,代码主要的改动是将上次改动的判断时间戳校验的代码进行恢复,nMaxClockDrift由20分钟调整回2小时。修复了代码

if(GetBlockTime() < pindexPrev->GetBlockTime())return error(“AcceptBlock() : block’s timestamp is tooearly”);

可能误伤正常产出的区块的问题。

为了阻止单一算法独占挖矿,新加入CheckPreAlgo()函数,如图十九和图二十所示,从块高度2042000开始,在执行checkblock()函数的时候开始调用新加入的检查逻辑。自当前区块共向前回溯10个区块,检查单一算法挖出的区块数,当每10个区块有6个或者6个以上的区块是由单一算法挖出的时候,新出的这个区块不会被链接受,从而缓解单一算法独占挖矿引发的安全问题

4. XVG “算力优势+时间劫持”攻击事件总结

根据ocminer的论坛反馈和我们的区块高度统计,攻击者的两次独占挖矿造成其他矿工的损失统计如图二十一,有15000左右个区块被攻击者恶意挖矿。

两次攻击可疑的收币地址如下图所示,更详尽的信息可见https://pastebin.com/K7L1G5FE。

就这次攻击分析来看,攻击者主要利用自己算力的优势伪造时间戳,使得自己挖矿难度不断降低,从而保持自己最长链的优势,让正常的矿池挖到的都是孤块,通过“作弊”挖矿的方式去获利。

根据XVG黑皮书的描述多种加密算法可以预防51%算力攻击,通过这次安全事件我们知道世事无绝对,攻击者根据代码逻辑构造的一系列组合攻击利用还是可以进行成功攻击的,目前而言,51%攻击对于pow机制的加密货币来说还是一个逃不开的话题。

最后希望我们的声音能让更多人去关注区块链安全!

XVG恶意挖矿事件透视——“算力优势+时间劫持”攻击案例分析相关推荐

  1. 解决阿里云服务器被恶意挖矿问题

    解决阿里云服务器被恶意挖矿问题 一.出现问题现象以及原因 二.解决方法 一.出现问题现象以及原因 出现现象:阿里云控制台出现高危应急漏洞,其次CPU和内存都打满:经过问题详情的查看, 发现攻击者是在e ...

  2. 黄伟:一场恶意做空事件,却成为万国数据的成长礼

    人们常用"胸有激雷,而面如平湖者"这句话,来形容危急时刻处乱不惊的领导者. 在做空风波过后面对媒体时,万国数据创始人.董事长兼首席执行官黄伟并没有表现出愤愤不平.从他对风波始末从容 ...

  3. 2019上半年恶意挖矿趋势报告

    上一期,深信服安全团队对勒索病毒进行2019半年度总结,主要盘点了高发勒索家族.受灾区域分布.勒索病毒发展走向等.本期深信服安全团队对另一流行病毒类型--挖矿木马进行深入分析,给大家揭秘2019上半年 ...

  4. 服务器被挖矿重装系统可以吗,电脑被挖矿了需要重装系统_我网上买了一个重装系统U盘重装系统之后电脑里有一个恶意挖矿软件请问把这个卸载了就可以了吗_区块链百科...

    ㈠ 一般电脑出现了什么情况下需要重装系统 一般情况下电脑出现了以下问题需要重装系统: 1.系统文件损坏,不能进入操作系统. 2.系统中了病毒,杀毒软件不能处理. 3.系统出现各种错误,修改设置比较麻烦 ...

  5. 欧洲刑警组织最新报告提醒投资者警惕黑客和恶意挖矿软件

    点击上方 "蓝色字" 可关注我们! 暴走时评:欧洲刑警组织日前发布的一份新报告中,提醒投资者要注意目前不断上升的加密货币黑客.勒索和恶意挖矿软件的威胁.根据欧盟执法机构周三发布的& ...

  6. 网站被XMR恶意挖矿

    发现: 网站首页被恶意更改 网站的关键词和描述被恶意更改 服务器和只要访问此服务器上的网页cup 直线上升100% 排查代码发现js 文件被恶意更改,访问了挖矿网站 操作:删除js 里面的恶意代码,更 ...

  7. flink设置watermark以及事件时间字段源码分析

    flink设置watermark以及事件时间字段源码分析 背景 1.1.提取时间戳字段,用于事件时间语义处理数据 1.2.设置水位线(水印)watermark TimestampAssigner 核心 ...

  8. 游戏安全资讯精选 2017年第十九期:WebLogic Server WLS组件漏洞入侵挖矿事件分析,苹果手游代充灰色产业深度揭秘,《绝地求生》99%外挂都来自...

    摘要: WebLogic Server WLS组件漏洞入侵挖矿事件分析,苹果手游代充灰色产业深度揭秘,<绝地求生>99%外挂都来自国内 [游戏行业安全动态]苹果 手游代充灰色产业深度揭秘 ...

  9. 高通量测序技术的原理及各平台优势和实践应用的分析

    高通量测序技术的原理及各平台优势和实践应用的分析 2020.9.01 2060 随着人类基因组计划(human genome project )在2003年顺利完成,基因组测序技术取得了长足的进步,这 ...

最新文章

  1. 【bzoj2154】Crash的数字表格 莫比乌斯反演
  2. SAP Spartacus cost center Add按钮的href属性生成逻辑分析
  3. ukt机器人_doc/readme/feishu.md · 贫道法号-乱来/PrometheusAlert - Gitee.com
  4. 剑指 Offer 68 - II. (二叉树)二叉树的最近公共祖先
  5. python中acosh_acosh()函数以及C ++中的示例
  6. Mac brew报错Error: The following directories are not writable by your user: /usr/local/share/man/man5
  7. php dirname(_FILE_)
  8. python 继承与多态
  9. svn 迁移到git下全过程
  10. ucinet网络分析使用总结
  11. zmap扫描mysql_ZMap扫描机制剖析
  12. java生成 动态 pdf_java根据模板HTML动态生成PDF
  13. 【历史上的今天】11 月 8 日:计算机先驱诞生日;卷积神经网络 LeNet-5 问世;特斯拉发明遥控器
  14. 22021年江苏高考成绩查询,江苏省教育考试院2021年江苏高考成绩查询时间及系统入口...
  15. 微信小程序 时间轴(时间线)特效
  16. 微信小程序怎么添加到主屏幕将微信小程序放到手机桌面?
  17. supervisor详解-苏坡外泽
  18. 技能冷却: 判断技能 释放技能
  19. 武汉新时标文化传媒有限公司短视频的类型
  20. 四种主要网络IO虚拟化模型

热门文章

  1. 计算机科学与技术专业研究生分数线,同济大学计算机科学与技术专业考研录取分数线-研究生分数线-历年分数线...
  2. java jtextfield 密码_java中的文本输入框JTextField与JTextArea、密码输入框
  3. Android系统截屏功能提取
  4. Connection closed by foreign host原因ip冲突及解决办法
  5. Pixologic Zbrush 2022 Mac(三维数字雕刻软件)
  6. 自动排课系统的代码c语言,[C语言]我们的排课系统 - 代码贴 - BCCN
  7. centos7修改root用户密码
  8. MATLAB在app中扫描串口并在下拉菜单中显示
  9. 工程项目管理丁士昭第二版_[整理]工程项目管理(第二版)丁士昭主编的课后习题及答案 - 图文 -...
  10. 视觉SLAM(一)——视觉SLAM框架