2014年8月
在Primedice第三版发布不久后,我们的团队遇到威胁着我们网站生存的竞争对手。尽管我个人只有非常有限的编程经验,但是我们团队具有接近两年的比特币赌博网站建立经验。巨大的压力之下同时也为了避免进一步的延误,我们经过短短一周的内测beta之后就发布了新版。
这场“抢劫”是从两个不寻常的账户开始的,Nappa和Kane。我们发现在这两个账户发现了一些不正常的赌博模式。Kane自动套现,我们重新观察了Nappa的赌注,发现他们极其可疑却又无法找出问题出在哪里,于是在稍微延迟了其兑现之后进行了简单的电子邮件交流。
2014年9月
在被我们延迟支付了之后,这名“开发者”似乎受到一丝惊吓,于是他在几周之后创建了一个名为“Hufflepuff”的新账户。Hufflepuff是在Primedice上出现过的最大的赌徒,他经常连续每秒赌注在价值8000美元比特币以上,并持续数小时。我们整个团队都非常震惊Hufflepuff持续地打败庄家(正常情况概率很低1%),随时间的他推移获得越来越多的收益。
我们高度怀疑他奖金收益的来路,并一次又一次地限制他的账户以进行调查,然而每次我们的开发者都没有发现任何违规操作。我们没有证据证明他是作弊,因此无法以适当的理由长时间延迟他的提款要求。
另一方面,出于驱使他继续玩下去的强烈动机,我们立即便将奖金支付给他。
我们对每一种可能性进行了大量的研究,运行模拟程序……但最终我们得出的结论是: 他只是难以置信的幸运 。
惊人发现
在Hufflepuff提光了账户中超过2037比特币奖金大约两天之后,我们的主要开发人员发现有少数账户共享同一台服务器上的种子,由此发现了Hufflepuff的攻击利用程序exp。
要了解Hufflepuff是如何打败我们的系统前,首先需要了解一下公平系统(RNG)是如何运作的:
一个用户在下注前得到一串加密随机值(服务器种子),同时必须提交自己的随机值(客户端种子)。这两个随机值结合,用于确定最终输赢。然后用于赌局的随机加密的随机值将在下注后交给用户,以保证他们的赌局是不受操纵的。
你可以在这里找到详细深入的解释:
我们网站的部分功能是发放解密服务器种子(以向用户保证没有赌局的情况发生),放置一个新的随机种子同时丢弃旧的种子。
Hufflepuff发现了一个可以“混淆”我们服务器的方式,使其发放一个同样活跃的解密服务器种子。这个方式就是通过发送大量无法在短时间内处理完成的请求,而每分钟数百个请求即可。 Hufflepuff便可知晓他究竟是否会赢,从而决定要不要参与。
在疯狂地检查我们的服务器之后,EUREKA!!!我们发现了这一问题。我们怀疑可能存在一些问题,而最终发现了上面描述中时间攻击的可能性。我们的数据库中的种子都不活跃,同时都连到了Hufflepuff账户。由于这些“薛定谔”种子,看起来或许无用的种子都连接到同一个账户,表示着有需要获得种子的海量请求。
似曾相识
不幸的是,我们在Hufflepuff提现2400+比特币(那时大约可兑换100万美元)后发现这个exp的。鉴于比特币的特性(被指“世界最危险货币”)我们除了认输别无他法。我们通过Hufflepuff的比特币论坛账户与其进行沟通,要求其返还奖金,然而这样的回击适得其反。
事实表明,我们开发人员对故障的补丁并不恰当。为了回复我们的要求,Hufflepuff创建了一个新账户名为Robbinhood,然后迅速绕过补丁又多赢了2000+的比特币。然而这次他无法提现超过50或者60比特币(www.okcoin.cn),因为我们已经没有更多的金币了。