作者:VLS
摘要
- 闪电网络钱包和闪电网络服务商(LSP)的现状,究竟什么是真正的 “非托管”。
- 在比特币 Layer 1 上,持有密钥就意味着自主保管。而在闪电通道中,即使你持有密钥,如果你的签名器会盲目地许可支付请求而不验证,节点被攻陷也可能导致你资金丢失 —— 这是共享托管模式。
- 盲目签名既不是非托管,也不安全。它创造了两个故障点(节点和签名器)。只要任何一个被攻陷了,资金都会丢失。
- “VLS(带验证的闪电通道签名器)” 为分离私钥和节点提供了真正非托管的解决方案。节点被攻陷也不会导致资金丢失。
闪电钱包的承诺与问题
你仔细地研究和挑选 “非托管的” 闪电钱包,因为你相信 “无私钥,即无币”。你精心地保护你的种子词
直到有一天,你起床后发现自己的通道已经关闭了,应当属于你的比特币被发送到了你不知道的地址。而程序的日志显示你的签名器授权了所有东西。你的比特币就这么飞走了。你的 “自主保管的” 钱包就这么欺骗了你。
闪电钱包承诺要在即时支付上实现比特币的自治原则。但有些地方出了问题。
你的钱包软件可能会自称是 “非托管的”, 因为 “你自己持有私钥”,然而,如果你的签名器会盲目地许可请求而不验证,那到底是谁控制着你的钱?
这就是盲目签名的真相,是闪电钱包的肮脏秘密。
什么是闪电钱包里的 “盲目签名”?
闪电钱包里有两个模块:
- 节点,负责提议状态变更(增减余额);
- 签名器,决定这些更新是否可以安全地签名(许可)。
在一个妥当的非托管装置中,签名器会根据协议的规则和用户条款,在签名之前验证每一次请求。
而在 “盲目签名” 模式中,闪电钱包的私钥本身与节点隔离,然而,签名器会盲目地许可节点的请求,也就是完全不验证请求的内容。这是因为,盲目签名器可以在格式正确的交易上签名,但并没有足够的信息来分辨安全的请求和不安全的请求。
将一个盲目签名器标榜为 “非托管的”,就好像一家银行说自己是非托管的,因为它不知道你的银行卡口令。不设验证的签名器不是控制器,而是威胁。
用户有权知道真相:盲目签名模式是共享托管,它实际上比一些托管解决方案还要危险一些。多年来,闪电钱包技术公司一直将盲目签名的解决方案伪装成 “非托管” 或 “自主托管”。
硬件钱包测试
设想一个比特币硬件钱包,它会签名任何交易而不检查找零地址、手续费和支付目的地。你会管这样的钱包叫 “非托管” 钱包吗?你会信任它?
这就是闪电钱包的盲目签名模式。
为什么盲目签名比热钱包还要糟糕?
纯托管:1 个攻击点(托管商)
盲目签名:2 个攻击点(节点 + 盲目签名器)
热钱包:1 个攻击点(设备)
VLS:1 个加强后的攻击点(带有验证程序的签名器)
盲目签名,让你可能受到攻击的界面倍增(字面意义上的倍增),而且依然是托管的。只要节点或者签名器被攻陷,你就可能丢失资金。我们专门指出这一点,是因为用户有权利知道真相。
热钱包的用户至少知道自己在承担风险。盲目签名的用户却因为 “自己控制着私钥” 而误以为自己是安全的。
可能的攻击形式
每一种爆破都从某个点开始。以下是漏洞如何转化为盗窃:
场景 1:供应链 -> 攻陷节点 -> 恶意关闭通道
攻击者修改节点的依赖项,获得节点的控制权 ->
节点请求:“关闭通道,将资金发送到攻击者的地址” ->
盲目签名器:无法验证地址 -> 许可 ->
资金被盗
场景 2 :社会工程学攻击 -> LSP 访问权 -> 陈旧状态
攻击者假装成用户,向服务支持团队声称自己需要 “紧急修复” ->
获得节点访问权,广播旧的通道状态 ->
盲目签名器:无法识别这是陈旧状态 -> 许可 ->
惩罚交易取走所有资金
场景 3:内部威胁 -> 手续费操纵
恶意雇员或已被攻陷的基础设施 ->
节点为每一笔交易设置超量的手续费 ->
盲目签名器:无法验证数额 -> 许可 ->
资金被缓慢吸干
带有验证程序的签名器将拒绝所有这些请求,而盲目签名器会同意所有这些请求。
为什么闪电钱包的托管模式与比特币钱包的不同
在比特币 Layer 1 上,自主保管是非常直接的。你的硬件钱包(冷钱包)通过检查地址、手续费和找零地址来检查每一笔交易,然后才签名。这种验证程序与对私钥的控制相配合,使之成为自主保管的。你的私钥旧意味着你的钱币。
比特币的冷钱包模式无法直接移植到闪电钱包中,因为:
- 通道状态会持续更新:与比特币钱包中地址保持静态不同。
- HTLC 有截止时间:错过这个截止时间意味着丢失资金。
- 惩罚需要快速响应:如果对手广播过时的通道状态,己方必须立即响应。
- 路由支付需要在亚秒级时间内完成签名:冷钱包太慢了。
这些要求意味着,早期的闪电钱包实现都要求你运行自己的节点并使用热私钥(即两者是合在一起的),这对用户来说太复杂,也有风险。
LSP:创造了新问题的解决方案
“闪电网络服务供应商(LSP)” 是为着解决闪电钱包的易用性危机而出现的。运行一个闪电节点需要专门的技术知识、持续监视、同盖茨管理和流动性提供。LSP 可以为用户处理所有这些复杂性,也确实值得赞誉。这是一个巨大的用户体验升级。
然而,为了使用 LSP,同时保持 “非托管”,整个行业采用了盲目签名模式。这个补丁很简单:由 LSP 来运行你的节点,而你保管你的私钥。有私钥、就有币,不是这样的吗?
根本不是。当你的私钥会盲目签名 LSP 的节点请求而不加验证时,你实际上是在信任 LSP 不会偷你的钱。这不是自主保管,充其量是共享保管。
讽刺之处在于:LSP 让闪电钱包变得可用,而盲目签名又让它变得不安全,比热钱包和托管服务都要不安全。你得到的是没有控制杆的复杂性。
好消息是:LSP 的便利不是非付出这样的代价不可。带验证的签名就可以解决这个问题。
译者注:文中所述的这种对 LSP 的用法,应该只是其中一种,甚至可能不是主要的用法。
VLS 如何修复这个问题
“VLS(带验证的闪电钱包签名器)” 实现了每个闪电钱包签名器都应该做到的事:在签名之前先验证。
在签名任何东西之前,VLS 都会检查:
协议兼容性
- 这是一个陈旧的状态吗?是 -> 拒绝
- HTLC 的余额匹配吗? 是 -> 通过
- 交易的手续费数额合理吗? -> 检查限制
- 支付目的地得到过许可吗?是 -> 通过
用户条款
- 支付数额在限制之内
- 关闭通道的支付地址在许可列表上
- 阻挡不常见的使用模式
- 大额交易需要额外许可
独立验证
- 专门验证区块链状态
- 独立跟踪通道状态
- 监视时间锁过期
- 交叉检查节点声明
VLS 在行动
| 盲目签名器 | VLS | |
|---|---|---|
| 节点 | “关闭通道,将资金发送到地址 X” | “关闭通道,将资金发送到地址 X” |
| 签名器动作 | “收到!签名!” | “X 是不是白名单上的地址?交易表示最新状态吗?数额对不对得上?” |
| 结果 | 资金可能被盗 | 恶意请求被阻拦,资金安全 |
证明这真的有用:Blockstream Greenlight 钱包
Greenlight 证明了 VLS 可以大规模应用:
- 架构:Blocsteam 运行节点,用户通过 VLS 控制验证
- 跟踪记录:没有资金因为节点被攻陷而丢失
- 安全性:节点被攻陷也无法盗窃资金
- 性能:亚秒级验证,不影响用户体验
- 用户:数千名用户用上了真正的自主保管
这种模式证明了你可以获得 LSP 的便利性,并且在托管上无需牺牲。这里更加详细了讲解了为什么 Greenlight 选择了 VLS 以及他们的集成经验。
闪电钱包的四种托管模式
了解你用的闪电钱包落在光谱的哪个位置,是极为关键的:
1. 完全托管
你持有:空气
他们持有:私钥 + 节点
保管程度:0%(他们控制着所有东西)
攻击界面:1 个点(托管商)
案例:绝大部分交易所钱包
适合用户:初次尝试用闪电网络来买杯咖啡的用户
2. 共享托管:盲目签名
你持有:私钥,但它盲目签名
他们持有:请求签名的节点
保管程度:大约 50%,共享托管:双方都需要对方,但是节点可以欺骗签名器
攻击界面:2 个点(节点 或者 签名器 被攻陷 = 资金丢失)
案例:许多 “非托管的” LSP 钱包
事实检查:比完全托管更糟 —— 更复杂、更多攻击界面、依然需要信任
3. 自主保管的热钱包
你持有:私钥 + 节点,放在同一个设备上
他们持有:无
保管程度:100%(你控制着所有东西)
攻击界面:1 个点(你的设备)
案例:Zeus(使用本地节点模式)、Phoenix(自主保管)
适合用户:习惯热钱包风险的专业用户
4. 使用带验证签名器(VLS)的自主保管钱包
你持有:私钥 + 验证逻辑
他们持有:节点(但无法偷盗)
保管程度:100%(节点可以提议,但只有你才能许可)
攻击界面:1 个加强点(带有验证逻辑的签名器)
案例:Blockstream 的 Greenlight,使用 VLS
适合用户:任何投入具有重要意义资金数量的用户
现状:谁是真正的非托管?
以下是关于闪电钱包和 LSP 在托管模式光谱具体位置的表格。你可以看看多少 “非托管” 的服务实际上使用了盲目签名模式。营销口号不一定跟技术事实相匹配!
(表格请见原文,此处不附。)
如何检查你当前使用的钱包是什么模式
询问你的闪电钱包供应商以下几个问题:
问题 1:“如果你的 服务器/节点 今天被劫持了,攻击者能否偷走我的钱?”
“不能,因为验证程序保护了它” -> 带有验证的签名器的自主保管钱包
“不能,因为私钥在你手上” -> 盲目签名钱包警告
“是的,你会丢钱” -> 至少他们是诚实的
问题 2:“签名器在签名之前,会执行哪些具体的检查?”
详细的验证清单 -> 真正的自主保管
“它会签名你授权的东西” -> 盲目签名
含糊其辞的安全口号 -> 盲目签名
问题 3:“我的通道关闭时,剩余的余额可以发送到任何地址吗?”
“只能发送到你限定的地址” -> 带有验证
“将发送到你签了名的任何地址” -> 盲目签名
为你的资金选择正确的托管模式
“买一杯咖啡的钱”
- 完全托管钱包也没啥 —— 简单,而且在信任模式上是诚实的
- 避免盲目签名模式 —— 这是不必要的复杂性
“日常开支”
- 热钱包,如果你懂技术的话
- 如果你不懂技术,选择高质量的托管 LSP
- 明确规避盲目签名的风险
“不小的钱”
- 只使用带有验证签名器(比如 VLS)的自主保管钱包
- 热钱包也可以,只要你确定自己知道相关的风险
- 永远不要使用盲目签名钱包
企业用户/交易所保证金:
- VLS 是唯一负责人的选择
除非钱的数目小到你丢了也无所谓,否则就不要使用盲目签名模式。它会让攻击界面倍增,比其它选择都更危险。
呼吁开发者行动:不要发布盲目签名器
使用哪种装置?
我是一家企业或者 app 的开发者,只想要一个安全的闪电钱包装置,不想做繁重的基础设施
-> 使用一个由 VLS 赋能的带设施非托管供应商:Blockstream 的 Greenlight 或者 Breez SDK。
我希望控制我自己的闪电节点,但不希望从头开发所有东西
-> 使用 CLN + VLS ;安全又灵活,无需完全定制的插件。
我希望完全控制权以及深入的集成灵活性
-> 使用 LDK + VLS ;适合定制化的部署。
- - -
使用哪种闪电钱包技术栈?
选择你的起点:
使用我们的
vls-hsmd插件来转发来自 Core Lightning 节点的签名请求。通过
vls-proxy库,集成到你的基于 LDK 的节点。使用 Docker 运行 CLN + VLS + Bitcoind 。非常适合测试。
LND 或 Eclair
尚未支持 VLS 。请帮忙向 LND 和 Eclair 请求支持 VLS:
没有技术上的借口再使用盲目签名器了。VLS 是 Apache 许可的开源软件,而且准备好进入生产环境了。
你的行动:要求真正的自主保管
闪电钱包生态已经将持有私钥与控制资金混淆了太久了。盲目签名是带有额外步骤的共享托管,并非自主保管。
VLS 证明了,真正的自主保管闪电钱包是可以做到的。不要再找借口,不要再用盲目签名模式。
前进的道路
闪电网络的未来取决于我们对待托管模式的诚实。我们请求:
用户:
- 理解你真正信任的东西
- 选择与你的风险偏好相匹配的托管模式
- 向钱包供应商要求透明性
- 用你的聪投票:支持真正的自主保管
开发者:
- 别再把盲目签名叫做 “非托管”
- 实现验证逻辑,或者在托管模式上诚实
- 在真正的安全性上竞争,而不是打营销战
- 区分出真正的非托管产品
闪电网络生态:
- 将带验证签名确定为行业最低标准
- 指出盲目签名的实质:共享托管
- 用户将真正的自主保管放在优先地位的项目
- 完全淘汰盲目签名
现在你知道真相了:那么你会怎么做呢?
- 今天:使用我们的问题来检查你当前使用的钱包
- 这周:如有需要,移动资金到带有验证的非托管钱包
- 未来:要求透明性,支持真正的解决方案。
没有验证,你的私钥就不控制你的钱币。请做出明智的选择。
(完)