本文深入探讨了闪电网络中存在的垃圾信息攻击问题,攻击者通过控制节点或利用HTLC超时机制锁定网络中的流动性,从而干扰正常支付。文章分析了现有缓解策略的局限性,提出了多种改进方案,包括可证明的指责、本地信誉跟踪、预付费用等机制,并详细讨论了每种方案的优缺点,以及需要考虑的权衡因素, 另外还提到了与通道垃圾信息攻击相关的其他问题,例如无成本通道探测和瞭望塔信用耗尽问题。
闪电网络的主要目标之一是为付款人和收款人提供良好的隐私,这要归功于源路由和洋葱加密的结合(Sphinx)。
不幸的是,恶意行为者可能会滥用此属性来垃圾信息攻击网络:中间路由节点无法轻易判断它们正在中继的付款是真实的付款还是垃圾信息攻击尝试。
一个邪恶的路由节点可以使用此属性来确保其竞争对手的通道无法路由付款:这可能会迫使付款人通过邪恶节点的通道进行路由,从而为他赚取费用,并可能使他的竞争对手在经济上难以维持。如果一个更邪恶的实体可以访问网络的部分容量,则可能会使整个公共闪电网络无法使用。
攻击者利用 HTLC 超时机制来锁定网络中的流动性。此攻击不会直接花费路由节点的钱,但会浪费资金分配,并可能阻止合法的付款通过。
攻击者控制两个节点:A1
和 A2
(我们将此攻击称为 controlled spam
)。攻击者找到 A1
和 A2
之间的长路由,通过这些路由发送 HTLC,并在接收方保持沉默(模拟卡住的 HTLC):
A1 ---htlc1---> 某个节点 ---> ... ---> 某个节点 ---> A2
A1 ---htlc2---> 某个节点 ---> ... ---> 某个节点 ---> A2
...
A1 ---htlcN---> 某个节点 ---> ... ---> 某个节点 ---> A2
中间节点注意到 HTLC 似乎卡在下游的某个地方,但是:
当 HTLC 接近超时时,攻击者从 A2
使其失败,并重复相同的过程。攻击者唯一的成本是他需要锁定 HTLC 金额,但是当他从 A2
使 HTLC 失败时,他会立即收回资金。
由于付款路由最多可以有 20 跳,因此攻击者似乎可以锁定他分配给攻击的资金的 20 倍。但实际上情况更糟:一个通道可以拥有的待处理 HTLC 数量有限制(默认情况下为 483 个 HTLC)。通过用微小的 HTLC(略高于 dust limit)完全填满一个通道,攻击者能够以非常小的成本锁定整个通道。
请注意,攻击者可以在两端使用相同的节点(A1 = A2
)。
另请注意,攻击者不一定需要长时间持有 HTLC;他可以释放它们并立即重复相同的过程,或者保持稳定的 HTLC 流以泛洪网络;我们将这种攻击称为 short-lived controlled spam
。
值得考虑此攻击的另一种变体。攻击者不是发送到他控制的节点(A2
),而是将 HTLC 发送到他不控制的随机节点。这些最终节点会立即使 HTLC 失败(因为它与它们数据库中的任何发票都不匹配),但是由于转发延迟,HTLC 会在通道承诺中锁定一段时间。攻击者可以使用这种 HTLC 不断涌入网络,以中断合法的付款。我们将这种攻击称为 uncontrolled spam
。
如今,不可能完全阻止此类攻击,但是我们可以通过正确配置通道来使攻击者的工作更加困难:
htlc_minimum_msat * max_accepted_htlcs
自己的资金才能完全填满一个通道,因此你应该为 htlc_minimum_msat
使用合理的值(1 sat 对于具有大容量的通道不是一个合理的值;尽管对于较小的通道来说可能还可以)长时间存在的受控垃圾邮件也可以通过中继策略来缓解,该策略拒绝未来太远的 CLTV 锁定时间或需要较低的 cltv_expiry_delta
。后一种缓解措施可能会降低中继节点安全性。
我们希望防御具有以下能力的攻击者:
我们必须绝对保留闪电网络的重要属性:
我们必须避免为攻击者创造机会:
多年来,已经提出了许多想法,探索了不同的权衡。我们在此总结它们的优缺点,以帮助未来的研究进展。
最古老的提案讨论了在不快速失败/成功 HTLC 的不良行为对等方的情况下提供通道关闭证明。例如,如果 Alice 通过 Bob 向 Caroll 发送 HTLC,如果 Caroll 在短时间内没有响应,Bob 应该关闭他与她的通道,并将关闭交易作为证据呈现给 Alice,以清除自己因路由失败的责任。
该方案引入了一系列不同的问题:需要了解跨链接的通道类型、隐私破坏、通道脆弱性等。
此提案讨论了节点的信誉系统。一个节点将实时记录由于来自或发送到其相邻对等方的中继 HTLC 而获得的路由费用。每次路由失败后,都会降低 faultive 对等方的信誉,直到达到触发通道关闭的某个阈值。
该方案不能防止信誉污染。从节点角度来看,你的直接对等方或上游对等方的失败无法区分。
最明显的建议是要求节点在想要中继 HTLC 时无条件地向下一个节点支付固定的少量金额。 让我们探讨一下为什么这个提案不起作用:
此提案建立在前一个提案的基础上,但颠倒了流程。 节点为接收 HTLC 而不是发送 HTLC 支付费用。
A -----> B -----> C -----> D
B 向 A 支付接收 HTLC 的费用。
然后 C 向 B 支付接收转发的 HTLC 的费用。
然后 D 向 C 支付接收转发的 HTLC 的费用。
必须有一个宽限期,在此期间不支付任何费用; 否则,uncontrolled spam
攻击允许攻击者强迫路由中的所有节点支付费用,而他自己则不支付任何费用。
每个跳的费用不能相同,否则当攻击者位于付款路由的两端时,这是免费的。
该费用必须随着 HTLC 向下游移动而增加:这确保了持有 HTLC 时间较长的节点比快速失败的节点受到更多的惩罚,并且如果一个节点由于下游卡住而不得不长时间持有 HTLC,他们将收到比他们必须支付的更多的费用。
每个跳的宽限期也不能相同,否则攻击者可以强迫 Bob 成为唯一支付费用的人。 与我们拥有 cltv_expiry_delta
类似,节点必须具有 hold_grace_period_delta
并且 hold_grace_period
必须比下游更大。
缺点:
hold_grace_period
期间锁定 HTLC 并连续重复攻击未解决的问题:
此提案建立在前两个提案的基础上,并将它们结合在一起。 节点支付一个正向和一个后向的预付款,但如果 HTLC 快速结算,则后向的预付款将被退还。
A -----> B -----> C -----> D
我们在 channel_update
中添加一个 hold_grace_period_delta
字段(以秒为单位)。
我们在 update_add_htlc
的 tlv 扩展中添加三个新字段:
spam_fees
(msat)hold_grace_period
(秒)hold_fees
(msat)我们在 onion per-hop payload 中添加两个新字段:
outgoing_hold_grace_period
outgoing_spam_fees
当节点收到 update_add_htlc
时,它们会验证:
hold_fees
不是不合理的大hold_grace_period
不是不合理的短或长hold_grace_period
- outgoing_hold_grace_period
>= hold_grace_period_delta
spam_fees
- outgoing_spam_fees
> 0
并且不是不合理的小否则,它们会立即使 HTLC 失败,而不是中继它。
对于该示例,我们假设所有节点都使用 hold_grace_period_delta = 10
。
我们添加一个正向预付款(spam_fees
),该费用在提供 HTLC 时无条件支付。
我们添加一个后向预付款 hold_fees
,该费用在接收 HTLC 时支付,但如果在 hold_grace_period
结束前结算 HTLC,则会退还(请参阅关于此的脚注)。
正向预付款在每个跳严格递减,而后向预付款在每个跳递增(非严格)。
+---+ +---+ +---+ +---+
| A | | B | | C | | D |
+---+ +---+ +---+ +---+
| | | |
| 不可退还的费用:15 msat | | |
|----------------------------->| | |
| 可退还的费用:50 msat | | |
| 退款截止日期:100 秒 | | |
|<-----------------------------| | |
| | 不可退还的费用:14 msat | |
| |----------------------------->| |
| | 可退还的费用:60 msat | |
| | 退款截止日期:90 秒 | |
| |<-----------------------------| |
| | | 不可退还的费用:13 msat |
| | |----------------------------->|
| | | 可退还的费用:70 msat |
| | | 退款截止日期:80 秒 |
| | |<-----------------------------|
| | | |
A 向 B 发送一个 HTLC:
hold_grace_period = 100 秒
hold_fees = 50 msat
outgoing_hold_grace_period = 90 秒
spam_fees = 15 msat
outgoing_spam_fees = 14 msat
B 将 HTLC 转发到 C:
hold_grace_period = 90 秒
hold_fees = 60 msat
outgoing_hold_grace_period = 80 秒
spam_fees = 14 msat
outgoing_spam_fees = 13 msat
C 将 HTLC 转发到 D:
hold_grace_period = 80 秒
hold_fees = 70 msat
spam_fees = 13 msat
场景 1:D 快速结算 HTLC:
uncontrolled spam
和 short-lived controlled spam
)场景 2:D 在宽限期后结算 HTLC:
hold_grace_period_delta
之前),则会退还其后向的预付款uncontrolled spam
和 short-lived controlled spam
)场景 3:C 延迟 HTLC:
grace_period
之前结算,因此 C 退还其后向的预付款controlled spam
)uncontrolled spam
和 short-lived controlled spam
)场景 4:通道 B <-> C 关闭:
grace_period
之前结算,因此 C 退还其后向的预付款uncontrolled spam
和 short-lived controlled spam
)后向预付款是固定的,而不是根据 HTLC 的待处理时间缩放; 它对垃圾邮件发送者的惩罚略少,但复杂度较低,并且对诚实节点造成的潜在不良影响也较少。 通过缩放方法,单方面关闭其通道的诚实节点会受到过重的惩罚(因为它必须支付最长持有期限的费用)。
缺点:
grace_period
、hold_fees
和 spam_fees
可能会消除该探测向量。grace_period
将是一个麻烦:
commit_sig
或 revoke_and_ack
时?grace_period
之后结算,但在发送其 commit_sig
时退还自己(从他的角度来看,这使得看起来像他在 grace_period
之前结算了)会发生什么? 在这种情况下,行为可能应该是给你的对等方一些回旋余地并让他们逃脱,但要记录下来。 如果他们这样做太频繁,请关闭通道并禁止他们; 窃取预付款永远不值得失去通道。如上所述,双向预付款的一个特点是 hold_fees
与时间无关。 如果 htlc 未在 grace_period
内解决,则 htlc 的接收方将被迫支付全额持有费用。 持有费用应涵盖锁定 htlc 最长时间(可能是 2000 个区块)的费用,因此这可能是一笔可观的罚款。 原子链上/脱链交换(Lightning Loop 等)等应用程序依赖于锁定资金一段时间,并且可能会因固定的持有费用而变得昂贵。
双向预付款的另一种变体使用与时间成比例的持有费率来解决上述限制。 它旨在将支付的费用更直接地与发生的实际成本相关联,从而减少参数的数量。
完整的提案可以在此处找到。
此提案引入了取决于 HTLC 保持待处理的时间量的费用。 节点在提供 HTLC 时根据以下公式支付费用:
hold_fee = lock_time * (fee_base + fee_rate * htlc_value)
fee_base
和 fee_rate
取决于两个对等方之间的信任关系:
缺点:
解决通道垃圾邮件攻击可能有助于 LN 的其他极端情况。
一个不断探测网络中通道的节点可能会发现路由节点的付款流量,从而全局跟踪 LN 付款流量。
考虑到即将部署的公共瞭望塔,LN 节点可能必须支付每个通道更新的成本,以避免瞭望塔资源 DoS。 恶意对手不断更新通道可能会迫使受害者耗尽其瞭望塔信用,从而使受害者失去撤销保护。
如果恶意 HTLC 发送者/中继者必须向受害者支付固定费用,则会在受害者瞭望塔预算上创建一个更高的上限。 超出此固定费用所能承受的额外瞭望塔覆盖范围必须由受害者承担。
Eltoo 可能会通过将每个更新的瞭望塔资源成本限制为仅带宽成本来解决此问题。
- 原文链接: github.com/t-bast/lightn...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!