本周的周报披露了一项负责任公开的拒绝服务漏洞,该漏洞影响较旧版本的 LND。此外还包括我们的常规栏目:来自 Bitcoin Stack Exchange 的精选问答、新版本和候选版本的公告,以及流行比特币基础设施软件的重大变更介绍。

新闻

  • LND 零时间戳 gossip DoS 漏洞披露: Nishant Bansal 在 Delving Bitcoin 上发帖,披露了一项他通过对 LND 的 gossip 处理进行状态机模糊测试所发现的拒绝服务漏洞。LND v0.20.1-beta 之前的版本都可能被一条时间戳为零的 channel_updatenode_announcement gossip 消息击溃。尽管 BOLT7 要求 channel_update 的时间戳必须大于零,但它并未规定节点应如何处理违反该规则的消息,而 LND 对该取值的处理最终导致了崩溃。

    当一个存在漏洞的节点尝试处理此类零时间戳消息时,其内部记账错误会使一个数据结构处于无效状态,从而导致运行时 panic 并终止节点。攻击者可以通过广播一个真实公开通道的公告,或者广播一个伪造通道的公告来触发该 bug;后者可通过为一个由攻击者控制的 2-of-2 输出进行注资来构造,因此在无需运行闪电网络节点的情况下也能更低成本地重复实施。

    该漏洞已进行了负责任披露,并由 Matt Morehouse 独立确认;它已在 LND 0.20.1-beta 中修复,修复方式是在解析阶段就拒绝时间戳为零的 gossip 消息,使其在到达脆弱代码之前就被拦截。

Bitcoin Stack Exchange 精选问答

Bitcoin Stack Exchange 是 Optech 贡献者查找问题答案的首选之地——也是我们在闲暇时帮助好奇或困惑用户的地方。在这个月度专题中,我们重点介绍自上次更新以来投票最高的部分问题和答案。

版本发布和候选版本

热门比特币基础设施项目的新版本和候选版本。请考虑升级到新版本或帮助测试候选版本。

  • LDK v0.1.10 是这个用于构建支持闪电网络的钱包和应用的库的一个维护版本。它修复了若干拒绝服务漏洞和一个净化问题,以及影响异步通道监视器持久化、Electrum 同步、BOLT12 要约验证、洋葱消息处理、MPP keysend HTLC 以及基于路由的支付发送的若干 bug。

  • LDK v0.2.3 是这个用于构建支持闪电网络的钱包和应用的库的一个维护版本。它修复了若干安全问题,包括拒绝服务漏洞、锚点通道的储备金计算错误以及一个净化问题,同时还修复了影响异步通道监视器持久化、LSPS 处理、零手续费承诺通道、BOLT12 要约、洋葱消息以及 rapid gossip sync 内存使用的若干 bug。

  • BTCPay Server 2.4.0 是这个自托管支付处理器的一个版本发布。它增加了全局搜索、passkey 身份鉴别、引导式多重签名钱包设置、更细粒度的钱包权限、订阅和 POS 机改进、钱包交易搜索与过滤、插件生态改进以及更新后的闪电网络支持,同时移除了若干已弃用的闪电网络后端。

重大代码和文档变更

以下是来自 Bitcoin CoreCore LightningEclairLDKLNDlibsecp256k1Hardware Wallet Interface (HWI)Rust BitcoinBTCPay ServerBDKBitcoin Improvement Proposals (BIPs)Lightning BOLTsLightning BLIPsBitcoin InquisitionBINANAs 的近期重大变更。

  • Bitcoin Core #35070 防止重复条目被加入 m_blocks_unlinked。这是一个验证内部数据结构,用于追踪那些已经下载、但由于缺少更早区块数据而暂时无法连接的区块。此前,一个面对深度重组的修剪节点可能会意外向该结构加入重复条目,导致 ReceivedBlockTransactions() 在收到缺失数据后,对同一个区块重复 reconsider,并在修改其 nSequenceId 后再次将它加入 setBlockIndexCandidates。这可能破坏候选链尖集合在内存中的排序,从而导致未定义行为。该 PR 通过新的 AddUnlinkedBlock() 辅助函数统一插入流程,以去重条目,并强化 CheckBlockIndex(),确保其中不存在重复。

  • Bitcoin Core #35182#34411 用 Bitcoin Core 自行维护的一套新 HTTP 与套接字处理实现,替换了基于 libevent 的 HTTP 服务器(用于 RPC 和 REST)。新的服务器运行自己的 I/O 线程、直接处理套接字,并将接收到的请求分发给现有 HTTP worker 池。后续 PR 移除了剩余的 libevent 构建、CI、依赖项和 CMake 相关配置。这些变更延续了该项目减少外部依赖、简化从源码构建 Bitcoin Core 的努力。

  • BIPs #2198 更新了 BIP360 的 P2MR 提案(见周报 #393):任何知道并揭示深度为零的脚本树中的单个叶子的人,都可以在不执行该脚本的情况下花费该输出。这一设计有意让单路径 P2MR 输出变得不安全:一旦用户在尝试花费时揭示该叶子,矿工就可以利用同样已揭示的叶子把输出花到自己手里。该变更意在阻止钱包为了节省见证字节,而省略后量子或其他后备叶子。

  • LDK #4713 为 Rapid Gossip Sync(RGS)增加了拒绝服务加固(见周报 #308);RGS 是 LDK 用来快速导入闪电网络 gossip 数据的格式。文档现在警告说,RGS 数据源应被视为“半可信”的,因为它们可以通过省略数据阻止路径查找成功,也可能试图膨胀客户端的网络图。LDK 现在会拒绝节点或通道更新数量明显荒谬的快照;并且一旦网络图中包含的通道数量超过预期值的十倍,就会跳过添加新的通道公告

  • LDK #4684 修复了一个罕见的异步签名器与通道监视器排序 bug:重连后可能会发送重复的 revoke_and_ack。此前,如果某条被签名器解除阻塞的路径在监视器更新仍处于待处理状态时重新生成并发送了一个应发送的 revoke_and_ack,那么之后由监视器恢复的路径可能再次生成相同消息,导致对等节点拒绝重复的 secret 并强制关闭。现在,当签名器待处理路径返回一个 revoke_and_ack 时,LDK 会清除监视器待处理的 revoke_and_ack 标志,因为这一消息也同时满足了监视器待处理的重发要求。