摘要: 3月14日,Bitcoin Unlimited(BU)由于软件漏洞的问题导致其大部分节点突然崩溃。虽然这些节点均已恢复正常,但是节点突然被攻击下线的速度是史无前例的。 究其原因,这是代码中“断言(assert)”产生的使用问题。 ...
3月14日,Bitcoin Unlimited(BU)由于软件漏洞的问题导致其大部分节点突然崩溃。虽然这些节点均已恢复正常,但是节点突然被攻击下线的速度是史无前例的。
究其原因,这是代码中“断言(assert)”产生的使用问题。Bitcoin Unlimited的一位不愿透漏姓名的开发者以非技术的形式对此进行了解释:
“断言的作用就是用于捕获程序错误,即核对一个程序员‘信任’的条件是否在程序中的特定点上是真实的。如果一个断言被触发,它们通常会提示一段信息并中断程序。
断言并不是在针对用户处理和运行错误(无效的数据输入),因此通常情况下调试阶段退出后它们就不能被使用。如果C/C++代码中断言(0)受到了攻击,那么它一定会中断程序。
在比特币代码中(无论是BU还是Core),断言是可用的。
那么BU究竟发生了什么事呢:BU开发者在代码路径中留下了一个通过输入数据(Xthin协议需求)可以访问的断言(0),而这个断言没有被仔细检查。这就为某些想要触发断言制作特殊信息的人留下了一道门,这段信息会使得BU软件进入那个代码路径。”
用更简单的术语来说,这是编译员在测试中使用的方法,通常情况下这个方法会在客户端发布后就被禁用。然而,在比特币中,情况并非如此。这个方法仍旧可用。因此,如果断言没有被移除,那么它就会允许任何具备一定技能的人远程攻击节点。
BU开发者进一步阐述:
“在产品代码中留下断言激活不是一个好的实践,因为他们并不是用来处理运行错误,而是用于使用异常。
在产品代码中留下可用的断言是一件危险的事。这里没有调试定义。通常情况下在产品版本中断言都是不可用的,但是比特币数据库并没有这么做。”
BU开发者称在实践留下可用的断言必须被重新评估,它会产生出现意外的可能。
BU开发者告诉CCN:
“这件事需要一个详细的事故报告,其中包括代码审查,发布关键安全补丁,同时还要和安全研究人员以及其他的比特币客户端项目披露此类漏洞的问题。
作为一个开发者,我很确定比特币代码中有着很多漏洞,这不仅仅存在于BU中。因此这个问题本身要比BU的问题大。”
在这次BU攻击事件中大约有200左右的UB节点经受住了攻击,viaBTC(挖BU区块的矿池)创始人Haipo Yang告诉CNN,他们虽然受到了攻击影响,但是矿池节点/用户已经自动恢复,因此影响不大。
BU所占的全网算力没有发生变化,仍旧是全网的33%左右。