文档摘要
区块链常见漏洞列表 网络层 P2P 虚假身份攻击(Sybil Attack) 日蚀攻击(Eclipse Attack) 窃听攻击(Eavesdropping Attack) 拒绝服务攻击(Denial of Service Attack) BGP劫持攻击(BGP Hijack Attack) 异形攻击(Alien Attack) 时间劫持(Timejacking) RPC 窃听攻击(Eavesdropping Attack) 拒绝服务攻击(Denial of Service Attack) 以太坊黑色情人节漏洞(The Ethereum Black Valentine's Day Vulnerability) HTTP输入攻击(Http Input Attack)
区块链常见漏洞列表
网络层
P2P
虚假身份攻击(Sybil Attack)
日蚀攻击(Eclipse Attack)
窃听攻击(Eavesdropping Attack)
- 严重性:低
- 描述:
攻击者被动监听网络通信,以获取私密信息,如节点标识号、路由更新或应用敏感数据。攻击者可以利用这些私密信息来破坏网络中的节点、扰乱路由或降低应用性能。
- 建议:
使用加密协议(如TLS)对通信进行加密。
- 参考文献:
The RLPx Transport Protocol
拒绝服务攻击(Denial of Service Attack)
- 严重性:中
- 描述:
拒绝服务攻击(DoS攻击)是一种网络攻击,攻击者通过临时或无限期地中断连接到互联网的主机服务,使机器或网络资源不可用。通常通过向目标机器或资源发送大量无用请求,试图使系统超载并阻止某些或所有合法请求被满足来实现拒绝服务。
- 建议:
a. 增加不同区域的节点数量。
b. 防止恶意参数导致软件崩溃。
c. 限制内存队列大小。
BGP劫持攻击(BGP Hijack Attack)
异形攻击(Alien Attack)
- 严重性:低
- 描述:
异形攻击漏洞最早由SlowMist团队发现,又称为对等池污染,指的是一种诱导同类链节点相互入侵和污染的攻击方法。该漏洞的主要原因是同类链系统在通信协议中未能识别非相似节点。
- 建议:
在P2P连接协议中增加网络标识,如以太坊的ChainID和比特币的Magic。
- 参考文献:
冲突的公链!来自 P2P 协议的异形攻击漏洞
时间劫持(Timejacking)
- 严重性:高
- 描述:
时间劫持利用比特币时间戳处理中的理论漏洞。在时间劫持攻击中,黑客通过更改节点的网络时间计数器,迫使节点接受一个替代区块链。当恶意用户向网络添加多个具有不准确时间戳的虚假节点时,这种情况可能发生。
- 建议:
通过限制接受时间范围或使用节点的系统时间可以防止时间劫持攻击。
RPC
窃听攻击(Eavesdropping Attack)
- 严重性:低
- 描述:
攻击者被动监听网络通信,以获取私密信息,如节点标识号、路由更新或应用敏感数据。攻击者可以利用这些私密信息来破坏网络中的节点、扰乱路由或降低应用性能。
- 建议:
使用加密协议(如HTTPS)对通信进行加密。
拒绝服务攻击(Denial of Service Attack)
- 严重性:中
- 描述:
通过构造恶意数据请求导致节点崩溃。
- 建议:
a. 防止恶意参数导致软件崩溃。
b. 限制内存队列大小。
以太坊黑色情人节漏洞(The Ethereum Black Valentine's Day Vulnerability)
- 严重性:低
- 描述:
以太坊黑色情人节漏洞最早由SlowMist团队发现。黑客可以通过RPC请求在远程节点解锁其钱包时窃取加密货币。
- 建议:
a. 禁止外部访问RPC接口。
b. 禁止公共节点上的钱包功能。
- 参考文献:
以太坊生态缺陷导致的一起亿级代币盗窃大案
跨域钓鱼攻击(Cross-Domain Phishing Attack)
- 严重性:低
- 描述:
黑客诱骗受害者打开恶意网页,通过跨域请求连接到加密货币钱包的RPC端口,然后窃取加密资产。
- 建议:
禁止节点启用跨域访问。
账本层
共识
长程攻击(Long Range Attack)
- 严重性:高
- 描述:
长程攻击是一种攻击场景,攻击者回到创世区块并分叉区块链。新分支上填充了部分甚至完全不同于主链的历史记录。当攻击者制作的分支变得比主链更长时,攻击就成功了。长程攻击分为三类:简单的、后期腐败和权益流失。在某种程度上,PoS协议中的长程攻击与PoW协议中的自私挖矿攻击有关,因为两者中的攻击者都在添加她保密的区块。显然,自私挖矿攻击不能回到PoW协议的创世区块,因为所需的计算努力是禁止性的,因此它们可能产生的影响是有限的。然而,两者都分叉主链并尝试附加伪造的区块,其中攻击者可能包括不同的交易。
- 建议:
交易所或接收者应在交易被足够的区块确认后完成支付。
- 参考文献:
A Survey on Long Range Attacks for Proof of Stake Protocols
贿赂攻击(Bribery Attack)
- 严重性:高
- 描述:
也称为短程攻击(Short-Range attack),依靠贿赂验证者或矿工来处理特定的区块或分叉。通过这种方式,攻击者可以将任意交易呈现为有效,并让不诚实的节点支付验证它们。通过支付与区块奖励相等或更多的金额(如果区块被网络回滚),为矿工提供足够高的激励,使其处理攻击者的区块或链。这种贿赂攻击也称为P+epsilon攻击,认为可以不支付贿赂用户,因为系统会通过使该分支成为主链来奖励不诚实的节点。在这些情况下,攻击者面临更大的问题,因为如果恶意分支由于某种原因被回滚(攻击者无法继续贿赂,不诚实的节点停止在该分支上工作),攻击者将不得不支付大量贿赂,因为每个恶意铸造的区块的贿赂都会积累。在PoS系统中,这种攻击是可行的,并且可以扩展到无权益问题。
- 建议:
在两种情况下,PoS通过强制执行惩罚条件或将违规者从其职位中解除来解决这个问题。
- 参考文献:
A Survey on Long Range Attacks for Proof of Stake Protocols
竞速攻击(Race Attack)
- 严重性:高
- 描述:
当攻击者创建两个冲突的交易时,会执行竞速攻击。第一笔交易发送给受害者,受害者接受支付(例如发送产品)而不等待交易确认。与此同时,一笔冲突的交易将相同数量的加密货币返回给攻击者,并广播到网络,最终使第一笔交易无效。
- 建议:
交易所或接收者应在交易被足够的区块确认后完成支付。
- 参考文献:
blockchain-attack-vectors
活跃性否认(Liveness Denial)
- 严重性:高
- 描述:
活跃性否认是PoS协议中的一种拒绝服务攻击。在这种攻击中,一些或全部验证者决定采取行动,有意阻止交易通过停止发布区块。通过避免执行验证者职责,区块链将停顿,因为新的区块将无法被验证和发布到区块链中。一个逐渐消耗非活跃验证者权益的活跃性要求将确保即使大多数验证者离线或执行活跃性否认攻击,他们也不会破坏网络。
- 建议:
在无法评估活跃性的情况下,社区将能够决定(链下通信)分叉区块链并移除非活跃验证者。在所有情况下,执行这种类型攻击的验证者会危及其在网络中的验证者地位及其权益,如果存在惩罚条件。
- 参考文献:
A Survey on Long Range Attacks for Proof of Stake Protocols
审查(Censorship)
- 严重性:高
- 描述:
区块链中的审查是一个棘手的问题,引发了许多讨论,因为它可以被同时视为攻击或功能,取决于区块链的性质。验证者控制哪些交易将被添加到区块中,这使他们有能力将某些地址列入黑名单。交易位于交易池中,验证者会将交易添加到即将发布的区块中。验证者可能会决定从他们的区块中删除一些交易。在单个验证者执行审查的情况下,一些交易可能会被延迟或由于时间限制而失效。随着执行此攻击的验证者数量增加,审查的危险性会增加。
- 建议:
活跃性要求可以确保交易的最终处理并消除区块链上的审查。此外,协议可以惩罚不按协议定义顺序创建区块的节点。另一种更有效的解决方案是使用零知识简洁非交互性知识论证(zk-SNARKs),可以隐藏交易发送者的身份。
- 参考文献:
A Survey on Long Range Attacks for Proof of Stake Protocols
Finney攻击(Finney Attack)
- 严重性:高
- 描述:
当一个交易被预先挖掘到一个区块中,然后在该预挖区块发布到网络之前创建一个相同的交易,从而使第二个相同的交易无效时,可能发生Finney攻击。
- 建议:
交易所或接收者应在交易被足够的区块确认后完成支付。
- 参考文献:
blockchain-attack-vectors
Vector76攻击(Vector76 Attack)
- 严重性:高
- 描述:
Vector76是竞速攻击和Finney攻击的组合。
在这种情况下,一个恶意矿工创建两个节点,一个仅连接到交易所节点,另一个连接到区块链网络中的良好连接的节点。然后,矿工创建两个交易,一个高价值的和一个低价值的。之后,攻击者预先挖掘一个包含高价值交易的区块,并将其保留。发布区块公告后,攻击者立即将预挖区块直接发送给交易所服务。它和一些矿工将考虑预挖区块为主链并确认此交易。因此,该攻击利用了网络的一部分看到攻击者包含在区块中的交易,而另一部分网络没有看到该交易。
在交易所服务确认高价值交易后,攻击者将低价值交易发送到主网络,最终主网络拒绝高价值交易。结果,攻击者的账户会被记入高价值交易的金额。尽管这种攻击的成功率很高,但由于需要一个接受支付后一个确认的托管电子钱包和一个具有传入交易的节点,因此并不常见。
- 建议:
交易所或接收者应在交易被足够的区块确认后完成支付。
- 参考文献:
blockchain-attack-vectors
历史替代攻击(Alternative Historical Attack)
- 严重性:高
- 描述:
也称为区块链重组攻击(blockchain reorganization attack)。
甚至在多次确认的情况下也可能发生,但需要攻击者拥有巨大的计算能力。在这种情况下,一个恶意用户向接收者发送一个交易,同时挖掘一个包含另一个返回相同货币的交易的替代分叉。即使接收者在n次确认后认为交易有效并发送产品,例如,如果攻击者发布一个更长的链并取回货币,接收者可能会损失资金。
- 建议:
交易所或接收者应在交易被足够的区块确认后完成支付。
- 参考文献:
blockchain-attack-vectors
51% 攻击
- 严重性:高
- 描述:
也称为多数攻击。在PoW系统中,某个实体在特定时间段内控制了多数的哈希算力时,可以完全控制区块链。例如,该实体可以分叉主链并开始在其分支上挖矿。缓慢而稳定地,攻击者将能够超越主链,并使其分支取而代之。由于在PoW协议中区块生成是概率性的,因此有很多机会出现冲突的分支,当我们超过51%的门槛时,这些冲突会减少。因此,攻击者将掌控主链,但此时分支回滚现象会频繁发生。在PoS协议中,这种攻击仍然可行,但影响略有不同。一个验证者或一组协调的验证者可能拥有超过34%(对于BFT PoS)区块链的权益。在这种情况下,多数攻击可以通过执行最终性回滚影响区块链,即一个已经最终确定的区块被另一个竞争区块挑战,从而导致活跃性否认或审查。
- 建议:
交易所或接收者应在交易被足够的区块确认后完成支付。
- 参考文献:
A Survey on Long Range Attacks for Proof of Stake Protocols
磨砺攻击(Grinding Attack)
币龄积累攻击(Coin Age Accumulation Attack)
自私挖矿(Selfish Mining)
- 严重性:高
- 描述:
在自私挖矿攻击中,也称为区块隐瞒,攻击者在其自己的区块链分支上挖矿而不将其发布到网络。一旦攻击者计算了所需数量的区块,它们将被释放到网络中,并试图将主链回滚到攻击者的链上。此攻击的目的是两方面的:a)通过浪费诚实节点的资源来破坏网络,b)增加不诚实节点的奖励。
- 建议:
攻击的前一种动机纯粹影响PoW区块链。PoS区块链不会因这种动机而受到干扰。后一种动机影响两种协议,并可以通过应用削减条件或移除违规者的权力位置来缓解,这将导致他们放弃未来的奖励。
- 参考文献:
A Survey on Long-Range Attacks for Proof of Stake Protocols
双重生成区块(Block Double Production)
- 严重性:高
- 描述:
区块生产者在一个区块高度上生成多个区块,这可能是长程攻击或短程攻击的前兆。
- 建议:
对生产者进行经济制裁。
加密
密码攻击(Cryptographic Attack)
- 严重性:高
- 描述:
常见的攻击方法:分析攻击 / 实现攻击 / 统计攻击 / 暴力攻击 / 频率分析和仅密文攻击 / 已知明文攻击 / 选择密文攻击 / 选择明文攻击 / 中间相遇攻击 / 中间人攻击 / 生日攻击 / 重放攻击 / 碰撞攻击。
- 建议:
不要使用未知的加密库。
私钥预测(Private Key Prediction)
长度扩展攻击(Length Extension Attack)
- 严重性:低
- 描述:
一种攻击类型,攻击者可以利用Hash(message1)和message1的长度来计算Hash(message1 ‖ message2)(其中message2由攻击者控制),而无需知道message1的内容。
- 建议:
基于Merkle–Damgård结构的算法如MD5、SHA-1以及大多数SHA-2都易受此类攻击,建议不要使用这些算法。
- 参考文献:
Length extension attack
哈希碰撞攻击(Hash Collision Attack)
交易
交易重放攻击(Transaction Replay Attack)
- 严重性:高
- 描述:
也称为双重支付攻击。双重支付是区块链技术自诞生以来试图解决的问题之一。区块链中的大多数(如果不是全部)攻击都旨在某个阶段执行双重支付。在这种攻击场景中,攻击者尝试至少两次花费同一货币,因此称为双重支付。在现实的货币使用中,这是不可能的。无法从一个商家购买资源后再将同样的硬币用于另一个商家。攻击者尝试进行交易,等待商家批准,然后回滚交易并在另一交易中花费同样的货币。在区块链中,这可以通过在不同分支中呈现冲突交易来实现。使用绝对最终性的BFT系统被认为对双重支付问题具有鲁棒性。
- 建议:
a. 检查一个UTXO是否已被花费。
b. 使用nonce防止交易重放。
交易延展性攻击(Transaction Malleability Attack)
- 严重性:高
- 描述:
交易延展性是一种攻击,使人能够在比特币网络确认之前更改比特币交易的唯一ID。这种更改使人能够假装交易没有发生。在比特币交易所的情况下,可以用来进行双重存款或双重取款。
签名延展性
延展性的第一种形式存在于签名本身。每个签名都有一个DER编码的ASN.1八位字节表示,但OpenSSL不强制执行这一点,只要签名没有严重格式错误,它将被接受。此外,对于每个ECDSA签名(r,s),签名(r, -s (mod N))也是同一消息的有效签名。
ScriptSig延展性
比特币中使用的签名算法在创建签名时不会对任何scriptSig进行签名。虽然对整个scriptSig进行签名是不可能的——签名将对自身进行签名——但这意味着可以添加附加数据,使其在所需的签名和公钥之前被推送到堆栈上。同样,可以添加OP_DROP以在scriptPubKey执行之前使堆栈与之前完全相同。
- 建议:
检查签名库是否具有延展性。
- 参考文献:
Transaction_Malleability
bip-0066-Strict DER signatures
eip-2-Homestead Hard-fork Changes
时间锁定交易攻击(Time-Locked Transaction Attack)
- 严重性:低
- 描述:
通过指定UTXO可以被花费的区块高度,使代币对代币接收者不可用。
- 建议:
接收代币时检查交易是否被时间锁定。
- 参考文献:
XMR transfer lock
虚假充值攻击(False Top-Up Attack)
拉地毯攻击(Rug Pull Attack)
- 严重性:高
- 描述:
拉地毯是加密货币行业中的一种恶意行为,开发者放弃项目并卷走投资者的资金。拉地毯通常发生在去中心化金融(DeFi)生态系统中,尤其是在去中心化交易所(DEX)上,恶意人员创建一个代币并将其列在DEX上,然后将其与以太坊等主要加密货币配对。
- 建议:
检查开发团队是否放弃了区块链的所有权。