矿池漏洞安全科普

  • A+
所属分类:安全闲碎

扣(藏)块攻击

就是在矿池,混水摸鱼,反正有的矿池是根据你的算力,按时间给你“钱”的,矿池是怎么知道我的算力的,我能不能欺骗矿池???

挖矿软件和矿池之间的都是用的公开的协议,json格式发包,可以说是明文传输的,    {"worker":"00test","id":4,"method":"eth_submitWork","params":["0xd43ab721192c4498","0x3368da58f1a38c7f152132d1a6dab23f46d6876eff827f365db4b4328a47d6c2","0xb31650969106dd74701ca08ea6d9a28c7bf818ecdef3d6fb2718ef6e4ea18fd3"]},这个是提交结果的报文。

这种攻击是针对矿池的,降低矿池的收益,最终矿池入不敷出导致破产

扣块或者藏块攻击,是指当自己计算出正确的 hash  后,没有回传给矿池,私自广播出去了,那样区块的奖励就自己独吞了;欺骗矿池是矿池下发计算任务后,矿工并不真的去执行计算任务,而是直接返回一个错误的计算值,然后也享受矿池根据算力分发的币值奖励; 对于第一种扣块攻击,由于客户端是可控的,觉得完全可以实现啊,对于第二种欺骗,不知道矿池会不会对矿工的计算结果做校验

伪造算力

equihash算法(equihashverify:https://github.com/joshuayabut/equihashverify)实现上的逻辑漏洞。该漏洞可导致恶意矿工向z-nomp矿池提交虚假share,从而伪造自己的算力。从矿池中窃取诚实矿工的挖矿成果。由于目前许多新生数字货币均使用equihash算法进行工作量证明,且多数equihash矿池依赖于该equihashverify进行矿工算力校验,所以该漏洞严重已经影响多个数字货币矿池。

Equihash 是一种工作量证明算法,由 Alex Biryukov 以及Dmitry  Khovratovich设计而成,以一种计算机科学以及加密学概念(叫做广义生日悖论)为基础。Equihash是一种需要高内存的工作量证明,这意味你能挖到多少币主要取决于你的设备内存的大小。在短期内要创建一个低成本的挖矿定制硬件(专用集成电路)几乎不可能,所以Equihash被认为可以构造更去中心化的一种POW算法。z-nomp在对Equihash工作量证明进行验证的时候使用了equihashverify依赖库来对矿工提交算力证明份额进行校验。equihashverify对Equihash解验证的错误实现,导致了该漏洞。

细节:在equi.c文件中,在函数bool verifyEH(const char hdr, const char soln)中,hdr是区块头信息,参数soln是矿工求解出来的{Xij}序列。verifyEH函数的作用,就是用来判断{Xij}是否是由区块头信息hdr产生的广义生日悖论问题的正确解。

矿池漏洞安全科普

矿池漏洞安全科普

Equihash算法的整体实现可以理解为将Xij序列带入到

Vhash=hash(hdr,x1)^ hash(hdr,x2) ^…^. hash(hdr,x512);

然后判断Vhash的结果是否全部为0。如果全部为0,则返回true;如果全部不为0,则返回false。这看似正确的实现,但实际上编程人员没有考虑到:在广义生日悖论问题中,所有的xij必须是不相同的。而这里并没有检查是否由重复。对于任意区块头hdr,攻击者只要让所有的 xij全部相等,则得到结果:

hash(hdr,x1)=hash(hdr,x2) =…= hash(hdr,x512)

由于这里刚好有偶数个,那么可以得到:

Vhash=hash(hdr,x1)^ hash(hdr,x2) ^…^. hash(hdr,x512)=0

也就是说,对于任意hdr,攻击者随机选择一个21bit的数xij,让后让soln={x,x,x,…,x},就可以绕过广义生日悖论问题验证,从而实现高达数十万倍的算力数虚构。由于equihashverify实现中缺乏equihash论文中的多种其他校验算法,所以除了这个简单的碰撞攻击之外,该代码还存在其他安全问题。密码算法的实现应严格按照算法标准来进行,否则就容易出现安全漏洞。Equihash算法标准详细细节可参考论文:https://www.cryptolux.org/images/b/b9/Equihash.pdf

矿池漏洞安全科普


本文始发于微信公众号(IDLab):矿池漏洞安全科普

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: