区块链常见漏洞列表
网络层
P2P
女巫攻击
- 严重性:高
- 描述: 攻击者可以通过将某个恶意节点伪装成多个虚拟节点,创建大量假身份来攻击区块链系统。可造成 DoS 或 DDoS 等攻击。
- 建议: 增加节点的最大连接数,限制单个IP地址的主机数。
- 参考: 利用分布式矿工行为监测防止区块链女巫攻击
日蚀攻击
-
严重性:高
-
描述: 攻击者切断了受害者与外界网络间的所有传入和传出的连接,将受害者与网络中的其他节点隔离开来。
-
建议: 增加节点的最大连接数,限制单个IP地址的主机数。
窃听攻击
-
严重性:低
-
描述: 攻击者被动监听网络通信以窃取节点身份标识、路由表等敏感数据。攻击者可以利用这些信息来破坏网络中的节点或路由的可用性。
-
建议: 使用加密协议(例如 TLS)加密通信。
-
参考: RLPx 传输协议
拒绝服务攻击
-
严重性:中
-
描述: 攻击者通过发送大量的请求,使受害系统资源耗尽,服务暂时中断或停止,导致正常用户无法使用网络服务。
-
建议:
- 增加不同区域的节点数量。
- 避免畸形数据导致软件崩溃。
- 限制内存大小。
BGP 劫持攻击
- 严重性:低
- 描述: BGP 劫持(有时称为前缀劫持、路由劫持或 IP 劫持)是指通过一个自治系统错误宣称 IP 为其所有,使得使用边界网关协议维护的互联网路由表的路由器错误地将用户发送的数据传送给非数据传送目的地。
- 建议: 增加不同区域的节点数量。
- 参考: BGP 劫持 劫持比特币:对加密货币的路由攻击 KlaySwap 加密用户在 BGP 劫持后损失资金
异形攻击
- 严重性:低
- 描述: 异形攻击漏洞最早由慢雾团队发现,又称地址池污染,是指诱使同类链的节点互相侵入和污染的一种攻击手法,漏洞的主要原因是同类链系统在通信协议上没有对不同链的节点做识别。
- 建议: 为P2P连接协议添加网络标识,如以太坊中的 chain ID,比特币中的 Magic。
- 参考: 来自P2P协议的异攻击形漏洞的公链
时间劫持
- 严重性:高
- 描述: 时间劫持是比特币时间戳处理中的一个理论漏洞。攻击者在网络添加多个具有异常时间戳的虚假节点并强制其他节点接受替代区块链。
- 建议: 通过限制可接受的时间范围或使用节点的系统时间来防止时间劫持攻击。
RPC
窃听攻击
- 严重性:低
- 描述: 攻击者被动监听网络通信以窃取节点身份标识、路由表等敏感数据。攻击者可以利用这些信息来破坏网络中的节点或路由的可用性。
- 建议: 使用加密协议(例如 HTTPS)加密通信。
拒绝服务攻击
- 严重性:中
- 描述: 节点因接收到畸形格式参数请求而崩溃。
- 建议:
- 防止格式错误的参数导致软件崩溃。
- 限制内存大小。
以太坊黑色情人节漏洞
- 严重性:低
- 描述: 以太坊黑色情人节漏洞最早由慢雾团队发现。当节点解锁其钱包时,黑客可以通过远程 RPC 请求窃取加密货币。
- 建议:
- 禁用 RPC 接口的外部请求。
- 禁用公共节点的钱包功能。
- 参考: 以太坊生态发现的一起级代币盗窃大案
HTTP 输入攻击
- 严重性:低
- 描述: 包括XSS/模板注入/第三方组件漏洞/HTTP参数污染/SQL注入/XXE注入/反序列化漏洞/SSRF/代码注入/本地文件包含/远程文件包含/命令注入/缓冲区溢出/ 格式化字符串等
- 建议: 进行渗透测试。
- 参考: SlowMist Exchange 安全审核计划
跨域钓鱼攻击
- 严重性:低
- 描述: 黑客诱骗受害者打开恶意网页,通过跨域请求连接到加密钱包的RPC端口,然后窃取加密资产。
- 建议: 禁止RPC允许跨域访问。
分类帐层
共识
长程攻击
- 严重性:高
- 描述: 长程攻击是攻击者从创世区块分叉链,新链与主链部分或完全不同。当攻击者制造的分叉变得比主链更长时,则攻击成功。长程攻击分为三种:简单攻击、变节攻击和权益流损。 在某种意义上,PoS 中的长程攻击与 PoW 协议的自私挖矿攻击类似,因为两种情况下的攻击者都在试图添加保密区块。不过由于 PoW 对计算量的要求,自私挖矿攻击无法从创世区块开始,所以造成的影响是有限的。这两种攻击都分叉了主链,并尝试在伪造的区块中包含不同的交易。
- 建议: 等到交易被足够的区块确认后,交易所或接收方再支付。
- 参考: 长程攻击调查权益证明协议
贿赂攻击
- 严重性:高
- 描述: 贿赂攻击也被称为 短程攻击 。攻击者通过向验证者或矿工支付大于等于区块奖励的金额,贿赂验证者或矿工来产生特定的区块或分叉。这样一来,攻击者可以将任意交易放入区块,并让不诚实的节点通过区块验证。 一种被称为P+epsilon 攻击的贿赂攻击,表明可以在无需支付费用的情况下贿赂用户,因为系统会将贿赂奖励给不诚实的节点,使该分叉成为主链。 攻击者在贿赂攻击中,面临着一个严重的问题:如果恶意分叉由于某种原因被还原(攻击者无法继续贿赂,不诚实的节点停止在该分叉上工作),攻击者将不得不支付巨额贿赂,因为随着恶意铸造的区块累积,需要的贿赂金额也在增长。在 PoS 系统中,这类攻击是可行的。
- 建议: 在这两种情况下,PoS 通过强制惩罚或释放攻击者者来解决这个问题。
- 参考: 长程攻击调查权益证明协议
种族攻击
- 严重性:高
- 描述: 种族攻击指攻击者创建两个冲突的交易。如果第一笔交易被发送给受害者,受害者没有等待交易确认就接受了付款并执行承诺(例如发送产品等)。同时,另一笔冲突的交易被广播到网络,最终使第一笔交易无效。
- 建议: 交易被足够的区块确认后,交易所或接收方再支付。
- 参考: 区块链攻击向量
活性冻结攻击
- 严重性:高
- 描述: 活性冻结攻击是 PoS 协议中拒绝服务攻击的一种形式。在这种攻击中,部分或全部验证者停止产生区块,从而阻止新区快的验证和产生。对验证者的活跃度进行评估,减少活跃度小的验证者的权益,能确保即使大多数验证者处于离线状态或执行活性冻结攻击,也不会危害网络的可用性。
- 建议: 在无法评估活跃度的情况下,社区将能够决定(链下治理)并移除不活跃的验证者。在这种情况下,即使存在漏洞利用条件,试图进行攻击的验证者也会考虑攻击是否划算。
- 参考: 长程攻击调查权益证明协议
审查攻击
- 严重性:高
- 描述: 区块链中的审查是一个棘手的问题,有许多相关的讨论。根据不同区块链的性质,它可能区块链的特性,也可能带来危害。由于验证者可以控制哪些交易将被添加到一个区块中,这使他们可以将某些地址列入黑名单,即不打包在黑名单中的地址。在验证者执行审查的情况下,由于时间限制,某些交易可能会延迟或失效。一旦执行进行审查的验证者数量增加,区块链的抗审查性可能受到挑战。
- 建议: 对验证者的活跃度要求可以确保交易的最终过程并消除对区块链的审查。除此之外,还可以惩罚未按照协议预定的顺序创建区块的节点。另一个更有效的解决方案是利用零知识简洁非交互式知识论证(zk-SNARKs),它可以可用于隐藏交易发送者的身份。
- 参考: 长程攻击调查权益证明协议
芬尼攻击
- 严重性:高
- 描述: 将一个交易预挖到一个块中,并且在该块被放入到网络之前,发送了一个相同的交易,从而使该交易在区块发布后失效。
- 建议: 等到交易被足够的区块确认后,交易所或接收方再支付。
- 参考: 区块链攻击向量
Vector76 攻击
- 严重性:高
- 描述: Vector76 是竞争攻击和芬尼攻击的组合。 恶意矿工创建两个节点,其中一个仅连接到交换节点,另一个连接到区块链网络中的正常节点。之后,矿工创建两笔交易,一笔高价值,一笔低价值。然后,攻击者从交易所服务中预挖并扣留具有高价值交易的区块。某个区块发布后,攻击者迅速将预挖区块直接发送到交易所节点,试图使交易所与一些矿工一起将预挖区块视为主链并确认此交易。 交易所服务确认高价值交易后,攻击者向主网发送低价值交易,最终拒绝高价值交易。最终,攻击者的交易所账户被记入了高价值交易的金额。尽管这种类型的攻击有可能成功,但并不常见,因为它需要交易所钱包,在一次确认后就接受付款,以及一个将交易发到交易所的节点。
- 建议: 等到交易被足够的区块确认后,交易所或接收方再支付。
- 参考: 区块链攻击向量
替代历史攻击
- 严重性:高
- 描述: 也称为区块链重组攻击。 如果黑客拥有大量的计算能力,在区块被多次确认后也能完成重组攻击。在这种情况下,恶意用户将发送交易,同时在分叉链上发送另一个同样价值的交易。即使接收方等到若干区块确认后,并认为交易有效,此时攻击者放出更长的分叉链并取回代币,从而导致接收方损失代币。
- 建议: 等到交易被足够的区块确认后,交易所或接收方再支付。
- 参考: 区块链攻击向量
51% 攻击
-
严重性:高
-
描述: 也称为多数攻击。 在 PoW 系统中,在特定时间范围内控制大部分算力的攻击者可以完全控制区块链。例如,拥有超过 51% 算力的攻击者可以分叉主链并在他的分叉上开始挖矿。该分叉可以逐渐超越主链并取代它。 在 PoS 协议中,这种攻击仍然可行,但影响略有不同。当一个验证者或一群合伙的验证者拥有超过 34%的权益,这种攻击就可能发生。
-
建议: 等到交易被足够的区块确认后,交易所或接收方再支付。
-
参考: 长程攻击调查权益证明协议
权力压迫攻击
-
严重性:高
-
描述: 也称为预计算攻击。 攻击者在获得记账权的时候,利用自己手中的权利实施一些计算或者一些操作让系统的随机数产生偏斜,来增加自己下一次获得记账权的可能。
-
建议: 等到交易被足够的区块确认后,交易所或接收方再支付。
-
参考: 长程攻击调查权益证明协议
币龄累积攻击
- 严重性:高
- 描述: 在早期版本的 Peercoin 协议中,用户质押的时间越长,其权重就会越多,没有任何时间限制。如果有足够的时间,攻击者将积累大量权重,这使他们能够接管网络。
- 建议: 在去中心化系统较稳定后,取消币龄系统。
- 参考: 长程攻击调查权益证明协议
自私挖矿攻击
-
严重性:高
-
描述: 在自私挖矿攻击(也称为区块扣留)中,攻击者在自己的区块链分叉中挖掘区块,并且不将它们发布到网络。当攻击者计算出一定数量的区块,再将它们发布到网络中,并尝试替代主链。这种攻击可以做到:通过浪费诚实节点的计算资源来破坏网络;增加恶意节点挖矿的奖励。
-
建议: 削减恶意攻击者的奖励及权益。
-
参考: 长程攻击调查权益证明协议
区块双产
-
严重性:高
-
描述: 攻击者在某个区块高度上生产多个区块,这可能是长程攻击或短程攻击的前兆。
-
建议: 惩罚恶意攻击者。
加密
密码学攻击
- 严重性:高
- 描述: 常见攻击方法:分析攻击/实施攻击/统计攻击/暴力破解/频率分析/已知明文攻击/选择密文攻击/选择明文攻击/中途相遇攻击/中间人攻击/生日攻击/重放攻击/碰撞攻击
- 建议: 不要使用未知的加密库。
私钥预测
- 严重性:高
- 描述: 如果密钥的生成依赖于随机数生成,而该随机数生成器可预测,则密钥可能被窃取。
- 建议: 使用密码学安全伪随机数生成器 (CSPRNG) 或密码学伪随机数生成器 (CPRNG)。
- 参考: 密码安全的伪随机数生成器
长度扩展攻击
- 严重性:低
- 描述: 对于部分摘要算法,若已知
Hash(message1)
和length(message1)
,则可以直接计算出由攻击者控制的message2
和对应的Hash(message1 ‖ message2)
。无需知道message1
的内容。 - 建议: 像 MD5、SHA-1 和大多数基于 Merkle-Damgård 结构的 SHA-2 算法很容易受到这种攻击,使用时需要注意。
- 参考: 长度扩展攻击
交易
重放攻击
- 严重性:高
- 描述: 也称为双花攻击。 双花是区块链技术从一开始就试图解决的问题之一。攻击者尝试将相同的货币花费至少两次,所以叫做双花。 在现实中,这种攻击是不可能的。因为无法从一个供应商那里购买资源,然后将完全相同的钞票支付给另一个供应商。 而在区块链中,可以通过在不同的分叉中利用冲突的交易来实现。攻击者尝试执行交易,等待商家批准,然后将其还原并在另一个分叉的交易中花费相同的货币。
- 建议:
- 检查 UTXO 是否已经被花费过
- 使用 nonce 来防止事务重放。
交易延展性攻击
- 严重性:高
- 描述: 交易延展性攻击允许攻击者做到,在任意交易被比特币网络确认之前,篡改该交易的TXID。此更改使该攻击者可以假装交易没有发生,以实施对交易所的攻击,例如双重存款或双重提款。 签名延展性 延展性的第一种形式是在签名本身。每个签名都可以表示为一个八字节的 DER 编码 ASN.1 ,但 OpenSSL 不强制执行该操作,只要签名没有严重格式错误,该签名就会被接受。 另一种方法为,由于使用椭圆曲线签名算法,根据其特点,对于某个消息的 ECDSA 签名
(r,s)
,签名(r, -s (mod N))
也是该消息的有效签名。 ScriptSig 延展性 比特币中使用的签名算法在创建签名时,不签署任何 scriptSig 。虽然对整个 scriptSig 进行签名是不可能的,但可以添加额外的数据,将指令放到堆栈中,并且在所需的签名和公钥之前。所以攻击者可以添加OP_DROP
指令,从而做到在scriptPubKey被执行前离开堆栈。 - 建议: 检查签名库是否具有延展性。
- 参考: Transaction_Malleability bip-0066-严格 DER 签名 eip-2-Homestead 硬分叉变更
交易时间锁攻击
- 严重性:低
- 描述: 在转账时,通过指定代币在某个区块高度后才能被使用,造成代币接收者无法使用代币。
- 建议: 接收代币时检查交易是否有时间锁定。
- 参考: XMR转账锁
假充值攻击
- 严重性:高
- 描述: 发起特殊结构的交易以进行虚假转账,但交易所以为是真实充值。
- 建议:
- 检查事务事件日志中的所有字段。
- 等到交易被足够的区块确认后,交易所或接收方再确认支付。
- 参考: USDT假充值 EOS假充值 XRP 虚假充值 ETH假充值 BTC RBF虚假充值 UTXO 多重签名假充值
Rug Pull
- 严重性:高
- 描述: Rug Pull在加密货币行业中,专指项目开发人员放弃项目并拿走投资者的资金。Rug Pull通常发生在去中心化金融 (DeFi) 项目中,尤其是在去中心化交易所 (DEX) 上。例如攻击者创建一种代币并将其上架到 DEX 上,然后将其与以太坊等具有高价值的加密货币组建交易对,受害者用以太坊换取恶意代币后,攻击者撤出流动性,拿走用户的以太坊。
- 推荐: 检查开发团队是否放弃了项目的所有权,即不再具有撤出全部流动性,无限增发代币等较高权限。