比特币盗币有漏洞吗?比特币盗币的漏洞都有哪些?

2023-11-02 15:24:54

自从比特币价格上涨之后,被盗的情况出现次数也要比之前多很多,根据最新消息报道,在今年的上半年,一对夫妻盗取了9.4万枚比特币,涉案金额高达330亿美元,现已经被抓捕,当然了,这也只是比特币被盗案件中的一例,还有很多涉案金额较高的比特币被盗案没有攻破,而比特币之所以经常被盗,一是因为比特币价格高,本身具有匿名性,被盗之后不好追踪,而是因为比特币有盗洞,那比特币盗币真的有漏洞吗?以及比特币盗币的漏洞都有哪些?下面211Coin小编为大家介绍。

比特币盗币有漏洞吗?

确实有盗洞的存在,今天要和大家说的是比特币漏洞CVE-2010-5141。这个漏洞可以导致攻击者盗取任何人的比特币,危害十分严重。万幸的是该漏洞并没有被利用过,而且修复速度极快。该漏洞与比特币的脚本引擎有关,对公链开发者具有参考意义;从当下市场上的公链来看,大多数都内置了虚拟机或脚本引擎,以此来打造DApp生态,同时也是区块链的大趋势之一。

比特币是存在被盗风险的,而且一旦被盗,其实是很难找回来的。保存好自己的钱包密码是关键。

比特币本质上只是区块链上的一串字符,记录着该比特币诞生以来的所有交易记录,由于区块链属于去中心化的结构,用户通过一个公开的地址和只有自己知道的密钥来宣示所有权,某种程度上,谁掌握了这个密钥,谁就实质性地拥有了对应地址中的比特币资产。

而区块链的防篡改特征,是指比特币的交易记录不可篡改,而非密钥不会丢失。同时,也正因为区块链不可篡改,密钥一旦丢失,也意味着不可能通过修改区块链记录来拿回比特币,所以,丢了,可能就真的丢了。

比特币盗币的漏洞都有哪些?

目前已知的只有CVE-2010-5141这一个盗洞,下面为大家简单介绍一下这个盗洞的运作方式:

script.cpp代码片段VerifySignature函数:

比特币盗币有漏洞吗?比特币盗币的漏洞都有哪些?

执行每个交易都会调用VerifySignature函数,该函数用于执行脚本以及验证签名,然后给交易标注是否被花费。

首先txFrom参数是上一笔交易,txTo是正在处理的这笔交易,如果理解了上面的章节中讲解过的UTXO模型,这里就不难理解了。重点看1125行代码,调用了EvalScript函数,第一个参数是txin.scriptSig(包含签名信息)+分隔操作码OP_CODESEPARATOR+txout.scriptPunKey(包含公钥信息、OP_CHECKSIG指令),这些就是EvalScript函数要执行的脚本,后面的参数可以暂时不用管,只要EvalScript函数返回true那么这笔验证签名就通过了。EvalScript函数如何才能返回true?

比特币盗币有漏洞吗?比特币盗币的漏洞都有哪些?

首先堆栈不能是空的,然后栈顶强转bool后必须是true。笔者简单解读为必须要有栈顶而且值不能是0。

然后再看关键的OP_CHECKSIG操作码

(注:由于操作码太多,本文针对OP_CHECKSIG操作码)

比特币盗币有漏洞吗?比特币盗币的漏洞都有哪些?

上面代码不难理解,调用Checksig函数来验证签名,然后返回给FSuccess变量,如果为真就压一个vchTrue(非0)进栈,否则就压一个vchFalse(0)进栈;如果opcode是OP_CHECKSIGVERIFY而不是OP_CHECKSIG的话就让vchTrue出栈,并开始执行后面的操作码。

按照OP_CHECKSIG的正常逻辑,验证签名不成功的话一定会有一个vchFalse留在栈顶,虽然堆栈不为空,但是栈顶的值是0,还是会返回false。

回到之前的代码,EvalScript函数执行的脚本主要由以下变量组成:

1.txin.scriptSig

2.OP_CODESEPARATOR

3.txout.scriptPubKey

第一个签名信息可控,第二个不用管只是一个分割符,会被删掉,第三个不可控,因为是来自上一个交易。

第一个变量可控,而且是作为脚本执行,所以这个变量可以不仅仅是签名信息,还能是opcode,这就好办了,下面需要引用一个神奇的操作码OP_PUSHDATA4,我们看看比特币0.3.3是怎么处理这个操作码的:

比特币盗币有漏洞吗?比特币盗币的漏洞都有哪些?

首先获取操作码。如果操作码的值小于或者等于OP_PUSHDATA4的值就把vchPushValue全压入堆栈,再跟进GetOp函数

比特币盗币有漏洞吗?比特币盗币的漏洞都有哪些?

经翻阅源码,发现OP_PUSHDATA4指令被定义为78,所以当函数遇到OP_PUSHDATA4时,指针会向又移78+4=82位,其中78位数据会被压入栈,所以只要在txin.scriptSig中注入一个OP_PUSHDATA4操作码,后面的公钥信息以及OP_CHECKSIG指令都会被”吃掉”并作为参数入栈,当指针走到最后时,进行最后的判断:

1.堆栈是否为空?不是

2.栈顶元素是否为0?不是

于是满足条件EvalScript函数返回true,然后VerifySignature函数也返回true,既然签名验证都绕过了,那别人的比特币便可以任意花费了。

上述内容解答了比特币盗币真的有漏洞吗?以及比特币盗币的漏洞都有哪些?比特币因为有盗洞的存在,所以为不少不法分子提供了有机可乘的机会,但是也不是没有办法解决,因为比特币漏洞分析是从DVP第一期漏洞专题开始连载的,目前素材来自2010年,目前漏洞分析主要存在以下难点:漏洞相关资料非常少,大多数漏洞都只有一个CVE编号和简介,不查阅大量资料无从入手,其次是环境搭建难,难在编译、私链搭建(早期的比特币甚至没有私链这个概念)等,比特币早期的源码编译需要的依赖现在很多都已经不维护并下线了。

211COIN发布此信息目的在于传播更多信息,与本网站立场无关,文章内容仅供参考,不代表任何确定性判断,且不构成投资建议,请谨慎对待,风险自担。
相关阅读
Copyright © 2018-2022 211COIN版权所有.