主页 > 如何下载imtoken钱包 > 你的比特币怎么能不被比特币盗窃的漏洞偷走!

你的比特币怎么能不被比特币盗窃的漏洞偷走!

如何下载imtoken钱包 2023-05-07 05:47:14

很多人会担心我的比特币会不会被盗,如何不让我的比特币被盗。今天要给大家介绍一下比特币漏洞CVE-2010-5141.,它可以导致攻击者盗取任何人的比特币,危害非常大。好在该漏洞没有被利用,修复速度极快。该漏洞与比特币的脚本引擎有关,对公链开发者具有参考意义;从目前市场上的公链来看,大部分都内置了虚拟机或者脚本引擎来打造DApp生态,这也是区域性区块链的大趋势之一。

一、比特币中的UTXO模型是什么?

Tips:漏洞代码片段中会涉及到一些UTXO相关的知识和概念,所以在对漏洞进行理论分析之前需要了解这些知识点,已经知道的可以跳过。

一、账户模型和 UTXO 模型

在看 UTXO 模型之前,我们先说一下常见的账户模型。什么是账户模型?账户模型的数据结构可以简单理解为“账户=>余额”,每个账户对应一个余额。例如:账户A向账户B转账200.,在账户模型中只需要A-200再B+200即可完成本次转账操作;目前大多数软件都使用账户模型,如银行系统、以太坊等。

但是,比特币使用的是自研的UTXO模型。UTXO中没有“账户=>余额”之类的数据结构。如何转账?

Ⅱ.比特币如何进行转账

以上述从 A 到 B 的转账为例,在 UTXO 中完成本次转账需要以下操作:

1.找到A账户下200余额的来源,意思是找到A收到200的交易x

2.以x交易为输入,向B转账200笔交易y作为输出,x和y对应,x和y的转账金额必须相等

3.x 个事务被标记为已使用,y 个事务被标记为未使用

比特币被盗能否立案_比特币容易被盗吗_我的比特币发币被盗

两次交易的转账金额必须相等。简单的解释是,你只能转移你收到的多少,实际上是这样的。

但是,当我只需要将一部分转让给其他人时,我该怎么办?答案是只转一部分给别人,然后把剩下的部分转给我自己的另一个账号。

三、引用网上两张图文:

从比特币盗币漏洞浅析你的比特币怎么才能不被盗!

账户模式

从比特币盗币漏洞浅析你的比特币怎么才能不被盗!

UTXO 模型

在这篇文章中,比特币为什么采用 UTXO 模型并不是重点,我们只需要了解 UTXO 的原理。

二、比特币的脚本引擎

比特币脚本是非图灵完备的。比特币使用自定义脚本进行交易和其他操作,为比特币提供了有限的灵活性。实现简单的多签、冻结资金等功能,但是多了就不行了。

我的比特币发币被盗_比特币被盗能否立案_比特币容易被盗吗

比特币这样做的原因是为了安全而牺牲了一定的完整性。Bitcoin Script 的原理是先定义一堆操作码,然后脚本引擎根据堆栈逐个执行每个操作码。

堆栈很好理解。队列是先进后出的,堆栈正好相反。它是先进先出的。一个元素被压入堆栈后,该元素将首先被弹出(pop)。

在早期版本的比特币中发送标准转账(pay-to-pubkey)交易需要脚本签名(scriptSig)和公钥验证脚本(scriptPubKey)。具体处理流程如下:

图片3

首先填写要执行的脚本(Script),然后将签名(sig)和公钥(pubKey)压入栈中,然后操作码OP_CHECKSIG会验证签名等,如果验证通过,则压入true堆栈,否则将假被压入堆栈。

三、CVE-2010-5141 漏洞分析

了解了以上知识后,就可以开始分析CVE-2010-5141漏洞了。笔者下载了易受攻击的版本0.3.3.下载地址是在github的比特币仓库中找到release。

script.cpp 代码片段 VerifySignature 函数:

从比特币盗币漏洞浅析你的比特币怎么才能不被盗!

执行每笔交易都会调用 VerifySignature 函数,该函数会执行脚本并验证签名,然后将交易标记为已花费。

比特币容易被盗吗_比特币被盗能否立案_我的比特币发币被盗

首先,txFrom 参数是最后一笔交易,txTo 是正在处理的交易。如果你理解了上面章节中讲解的 UTXO 模型比特币容易被盗吗,这里就不难理解了。重点看1125行代码,调用EvalScript函数,第一个参数是txin.scriptSig(包括签名信息)+分离的操作码OP_CODESEPARATOR+txout.scriptPunKey(包括公钥信息,OP_CHECKSIG指令),这些就是要执行的EvalScript函数Script,以下参数可以暂时忽略,只要EvalScript函数返回true,验证签名通过。EvalScript 函数如何返回 true?

1

首先栈不能为空,然后栈顶被强制bool后必须为真。作者简单解释说,一定有栈顶,值不能是0.

然后看关键OP_CHECKSIG操作码

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

从比特币盗币漏洞浅析你的比特币怎么才能不被盗!

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

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

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

1.txin.scriptSig

比特币被盗能否立案_我的比特币发币被盗_比特币容易被盗吗

2.OP_CODESEPARATOR

3.txout.scriptPubKey

第一个签名信息是可控的,第二个只是一个分隔符,会被删除,第三个是不可控的,因为它来自之前的交易。

第一个变量是可控的,作为脚本执行,所以这个变量既可以是签名信息,也可以是操作码。看看比特币 0.3.3 如何处理这个操作码:

从比特币盗币漏洞浅析你的比特币怎么才能不被盗!

首先获取操作码。如果 opcode 的值小于等于 OP_PUSHDATA4 的值,则将 vchPushValue 压入栈中,然后跟进 GetOp 函数

从比特币盗币漏洞浅析你的比特币怎么才能不被盗!

看了源码发现OP_PUSHDATA4指令定义为78.,所以当函数遇到OP_PUSHDATA4时,指针会移动78+4=82位,将78位数据压入栈,所以只要将 txin 一个 OP_PUSHDATA4 操作码注入到 .scriptSig 中,后面的公钥信息和 OP_CHECKSIG 指令就会被“吃掉”并作为参数压入栈中。当指针到达末尾时,进行最终判断:

1.栈是空的吗?不

2.栈顶元素是0吗?不

比特币容易被盗吗_我的比特币发币被盗_比特币被盗能否立案

所以如果满足条件,EvalScript 函数返回 true,然后 VerifySignature 函数也返回 true。由于绕过了签名验证,所以其他人的比特币可以随意使用。

四、CVE-2010-5141 漏洞修复

笔者下载比特币版0.3.8.直接看代码关键部分

从比特币盗币漏洞浅析你的比特币怎么才能不被盗!

维修计划也很明确。分别执行scriptSig和scriptPubkey,不管你的scriptSig里面有什么,都不会影响后续scriptPubkey的执行。

写在最后:

因为比特币漏洞分析是从第一期DVP漏洞专题连载的,目前的素材是从2010年开始的,目前的漏洞分析主要有以下几个难点:

1.关于这个漏洞的信息很少。大多数漏洞只有一个 CVE 编号和介绍。不咨询大量信息是不可能开始的。

2.环境搭建比较难,比如编译和私链搭建(早期的比特币甚至没有私链的概念)等等,比特币早期源码编译需要的很多依赖现在都无人维护,离线。

由于这些原因,作者只进行了理论研究,没有进行实际验证。如果有任何错误比特币容易被盗吗,请纠正我。

此外,您需要确保您的比特币的安全性。钱包的安全性非常重要,就像您的钱一样。现在银行不能为你承担黑客攻击的风险。您只能自己准备一个保险箱,以确保您的比特币不被盗。Go,这也可能是去中心化的一个特点。