Havenlon|Final Veto(三):为什么多签仍然挡不住错误执行
2026/7/18 4:25:14 网站建设 项目流程

一句话结论:多签能够降低单点密钥失陷的风险,却不能自动判断一次执行是否正确。更多人同意,很多时候只是更多人共同确认了同一个错误。

00 背景:多签为什么被高估

在数字资产、企业审批和高风险操作里,多签(Multi-Signature)几乎是「更安全」的代名词。

它的直觉非常朴素:一个人说了不算,得两个人、三个人甚至更多成员共同签名,系统才会继续执行。

单签: key_A ──签名──▶ 执行 多签: key_A + key_B(+key_C…) ──满足门限──▶ 执行

这种设计当然比单点授权更稳。它能降低单个密钥被盗、单个管理员作恶、单个账户失陷所带来的风险。但也正因为「更安全」这个标签太深入人心,多签制造了一个隐蔽的错觉:

只要同意的人足够多,执行本身就足够安全。

这个推断并不成立。多签解决的是「授权权力如何分散」,它从来没有解决「最终执行是否正确」。

如果所有签名者看到的是同一个错误界面、审批的是同一个错误 Payload、依赖的是同一套失效信息,或者共同接受了 AI 生成的同一个错误结果——那么多签不但挡不住错误执行,反而会给错误盖上一个「多方共识」的合法性钢印

这一篇,我们就把多签的能力边界,一条一条拆开来看。


01 多签解决的是单点风险

先肯定多签真正的价值,再谈它的边界,才公平。

单签系统的问题非常直接:只要一把密钥被盗、一个账户被控制、或一个高权限成员作恶,攻击者就可能独立完成高风险操作。攻击面收敛到一个点,这个点一破,全线失守。

多签通过引入门限(threshold)改变了这种结构。以最常见的2-of-3为例:

场景单签结果2-of-3 多签结果
1 把密钥被盗❌ 直接失守✅ 不足门限,无法执行
1 名管理员作恶❌ 可独立操作✅ 需再拉一人共谋
1 台设备失陷❌ 失陷即放行✅ 单点不足以放行

多签能有效降低的风险清单很实在:单个私钥被盗、单一管理员作恶、单台设备失陷、单个账户误操作、单点控制权过大。

但请记住一句话——多签提高的是「授权门槛」,它证明的是「更多授权主体参与了决定」,而不是「这些主体理解的内容是对的」。门槛和正确性,是两件事。


02 更多签名 ≠ 更多事实

多签背后藏着一个统计学式的直觉:

一个人可能看错;两个人同时看错概率更低;三个人共同确认,结果应该更可靠。

这个直觉只在一个前提下成立:每个签名者都能独立获得真实、完整、可验证的信息。

现实中的系统,几乎从不满足这个前提。多个签名者通常是:

  • 通过同一个 SaaS 界面查看请求;

  • 读取同一个数据库中的内容;

  • 依赖同一个风控系统给出的结论;

  • 接收同一个 AI Agent生成的摘要;

  • 甚至在同一个已被控制的软件环境中完成签名。

表面上: 人A ─判断─┐ 人B ─判断─┼─▶ 3 次独立同意 人C ─判断─┘ ​ 实际上: ┌── 同一个 SaaS / 同一个数据源 / 同一个 AI 摘要 ──┐ 人A ─┤ ├─▶ 同一个错误 ×3 人B ─┤ │ 人C ─┘──────────────────────────────────────────┘

签名者数量增加了,但事实来源没有增加。三个签名,不一定代表三次独立判断,也可能只是对同一个错误信息的三次重复确认。

多签把「同意」复制了三份,却没有把「事实」核验三遍。冗余的是签名,不是真相。


03 分散了权力,没分散认知

这是理解多签边界最关键的一点:多签分散的是「密钥控制权」,但未必分散「认知来源」。

举个典型场景。企业要向供应商付一笔款,财务负责人、业务负责人、管理者分别签名,看起来是完整的多方治理。

但如果三个人在屏幕上看到的收款地址,都来自同一个被篡改的界面——那么他们共同确认的,仍然是同一个错误地址。

维度状态是否出问题
每个人的身份真实
每一份签名合法
多签门限已满足
最终执行的地址被篡改

问题不在「签名者是否足够多」,而在于所有签名者都被绑定在同一个错误语义上

多签分散了「谁来批」,却没分散「批的是什么」。当所有人看的是同一块被做了手脚的屏幕,人数越多,只是错误的见证者越多。


04 多签看不懂 Payload 的真实意图

对密码学系统来说,多签的本质仍然是「对某个 Payload 的联合授权」。只要足够多的密钥持有者对相同内容签名,门限条件即成立。

但 Payload 可能在很多阶段悄悄偏离原始意图:

  • 用户输入的自然语言,被 AI 错误理解;

  • 业务系统生成了错误参数;

  • 中间服务替换了目标对象;

  • 金额单位发生转换错误(如USDT与最小单位混淆);

  • 批量操作范围被意外扩大;

  • UI 展示内容与底层数据不一致;

  • 最终签名内容与审批摘要之间存在差异。

Intent(用户真正想要): 向供应商 X 付 100 │ ← 自然语言解析 / AI 生成 / 中间服务转发(任一环节可失真) ▼ Payload(最终被签名) : 向地址 0xBAD… 付 100000 │ ▼ 多签: ✅ 3 人都对这个 Payload 签了名 → 门限满足 → 放行

多签能证明「多个人签了最终 Payload」,但它不能自动证明「这个 Payload 就是最初想执行的事情」。

多签能建立共识,却不能保证共识对象正确。一群人对着错误对象达成一致,系统拿到的只是一个「高度合法的错误」。


05 共同依赖失陷:一改全改

很多人把多签想象成「多个相互独立的安全边界」。但现实中的多签系统,往往共享大量基础设施:

  • 同一个 SaaS

  • 同一个审批界面

  • 同一个身份系统

  • 同一个 API 网关

  • 同一个策略引擎

  • 同一个消息通知渠道

  • 同一个组织管理后台

  • 同一个数据源

只要这些共享组件中的关键部分被控制,攻击者根本不需要分别攻破每个签名者的密钥。他只需要做一件事:改变所有签名者看到的事实。

传统想象:攻击者要偷 2 把密钥 → 成本高 真实路径:攻击者改 1 个共享界面 → 3 个人自愿地、合法地签了错误内容

这是一种共同依赖失陷(shared-dependency compromise)。它不直接盗取密钥,而是让所有合法持有者在错误信息下完成真实签名。从密码学角度看,一切正常;从执行结果看,错误已经发生。

攻破多签最省力的方式,不是偷更多的钥匙,而是换掉大家共同盯着的那一块屏幕。


06 共同误判:没人作恶,结果照错

错误执行并不总是攻击造成的,很多时候它来自组织内部的共同误判

一个真实感很强的例子:

  1. 某 AI Agent 建议「批量关闭某类风险账户」;

  2. 系统给出一份看似合理的风险分析报告;

  3. 业务、合规、管理层分别签名;

  4. 事后才发现——模型用的是过期数据,错误地把处理范围扩大了 10 倍。

在整个过程中:

  • 没有人作恶;

  • 没有密钥泄露;

  • 没有签名伪造;

  • 每个人都按职责完成了确认。

但结果依然是错的。

多签能防止一个人擅自行动,却防不住一群人基于同一个错误前提,非常有秩序地一起犯错。

治理结构可以减少「个人风险」,但无法自动消除「集体认知错误」。人多,有时候反而让每个人都以为「别人已经把关了」。


07 授权是「过去时」,执行是「现在时」

多签流程需要时间。而时间里,世界会变。

t0 第一个人签名 → 系统状态 A t1 第二个人签名 → 系统状态 B t2 达到门限,准备执行 → 真实环境已经是状态 C

t0 → t2之间,可能发生:

  • 市场价格剧烈变化

  • 设备状态改变

  • 目标账户风险等级更新

  • 资产余额发生变化

  • 生产环境已经切换

  • 策略版本被更新

  • 时间窗口已经过期

  • 前置依赖失效

每一个签名,在它「各自发生的那一刻」都可能是合理的。但在执行真正发生的那一刻,当初的条件可能已经不再成立。

多签验证的是「签名是否达到门限」,它通常不会在执行前重新判断:现在的执行状态,是否仍然符合当初授权成立时的条件?

多签是一张昨天开出的通行证,执行却发生在今天。没有人在放行前,重新看一眼今天的天气。

这正是授权事实执行事实之间的差距——也是本系列反复强调的那条裂缝。


08 门限不能代替最后裁决

2-of-33-of-55-of-7,本质上都是授权门限。它们回答的是:

有多少合格主体已经同意?

这个问题很重要,但它和下面这个问题根本不是一回事

当前这个具体动作,此刻是否仍然允许进入现实?

如果系统把「达到门限」直接等同于「执行」,那么多签只是把「谁能放行」从一个人换成了一组人——放行逻辑本身没变,仍然是「凑齐同意就向前」。

对比项多签门限Final Veto
核心问题有多少人同意了?这一次现在还该不该发生?
方向向前推进(凑齐即放行)向后阻断(不成立即拒绝)
默认行为满足门限 → 默认执行条件存疑 → 默认停止
判断依据签名数量执行时的真实状态与证据
角色定位授权的充分条件授权之上的独立裁决

Final Veto 的逻辑不同:即使签名数量满足要求,即使授权完全有效,最终执行仍然必须接受一次独立判断。

多签可以成为执行的「必要条件」,但绝不应该自动升级成「充分条件」。凑齐了同意,只是拿到入场券,不是拿到放行令。


09 Final Veto 不是替代多签

指出多签的边界,绝不是说多签没用。恰恰相反,多签依然是极其重要的治理机制:它限制单点权力、降低私钥失陷风险、强制高风险操作必须多人参与。

真正的问题不是「要不要多签」,而是不能把多签当成执行安全的终点

更完整的结构,应该是分层的:

┌─────────────────────────────────────────────┐ │ 授权层 │ │ ├─ 多签 → 分散授权权力 │ │ ├─ 策略 → 约束「允许范围」 │ │ └─ 证据链 → 绑定整个过程 │ ├─────────────────────────────────────────────┤ │ 裁决层 │ │ └─ Final Veto → 保留最终「否决权」 │ ← 独立、不可绕过 └─────────────────────────────────────────────┘

在这个结构里,多签仍然重要,但它只是授权层的一部分。达到门限之后,系统不是自动执行,而是获得了进入最终裁决阶段的资格

多签和 Final Veto 不是二选一,而是上下游。一个负责把关「谁批准」,一个负责把关「现在能不能落地」。


10 最后一层验证的是「这一次」

多签验证的是「参与者与门限」。Final Veto 关心的是这一次具体执行——不是某类操作是否曾被允许,不是某些人是否拥有权限,也不是签名数量是否达标。

用伪代码表达 Final Veto 的核心检查,会比一堆形容词清楚得多:

def final_veto(execution): # 授权已满足只是前提,不是结论 assert execution.signatures_meet_threshold # 多签这一关已过 ​ checks = [ payload_still_binds_original_intent(execution), # Payload 是否仍绑定原始 Intent target_unchanged(execution), # 执行对象是否被替换 time_and_state_still_valid(execution), # 当前时间/状态是否仍有效 local_evidence_sufficient(execution), # 本地边界是否掌握足够证据 policy_sources_converged(execution), # 多个策略来源是否收敛一致 no_unprovable_gap(execution), # 是否存在无法证明安全的缺口 within_irreversible_risk_budget(execution), # 是否可能造成不可逆后果 ] ​ # 关键:任何一项「无法被证明为真」,都不放行 if not all(checks): return REJECT # 默认保守 return ALLOW

Final Veto 不一定比所有审批者更聪明,也不需要重做一遍完整业务判断。它只需守住一条原则:

当最终执行条件无法被证明时,不因为「多签已经完成」而默认放行。

注意伪代码里的措辞是「无法被证明为真」,而不是「被证明为假」。在最后一道边界上,「存疑」就等于「拒绝」。


11 合法的错误,比非法请求更危险

非法请求其实很好识别:

非法请求的特征系统反应
签名缺失直接拒绝
门限不足直接拒绝
身份无效直接拒绝
权限不够直接拒绝

真正难防的,是合法请求:它拥有完整审批、满足多签门限、通过身份验证、符合接口格式,甚至通过了所有传统安全检查——但最终执行的对象、状态或结果是错误的

这种错误最难防,因为它看起来完全合规。而且有一个反直觉的副作用:

多签越完整,错误看起来越可信。「这么多人都签了,应该不会有问题吧」——这句话,正是错误执行最好的掩护。

执行安全不能依赖这种「人多好像就没事」的心理推断,它必须回到最终事实本身。


12 总结:真正的共同治理,包含「独立阻止」

「共同治理」常被简单理解成「多人共同授权」。但真正成熟的共同治理,应该包含两种能力

  • 一种是共同允许(Approve together);

  • 一种是独立阻止(Veto independently)。

如果系统只有「共同允许」,那么门限一旦形成,执行方向就不可逆地向前。而健康的安全结构,应当让不同边界承担不同职责:

有人负责提出 → 有人负责审批 → 有人负责签名 │ ▼ ┌───────────────────────────┐ │ 最后一个独立边界(Final Veto)│ │ 不代表任何一方「继续同意」 │ │ 只判断执行条件是否成立 │ │ 条件不成立 → 拒绝 │ └───────────────────────────┘

回到开头。多签解决了一个非常重要的问题:不能让一个人独自决定高风险执行。但它没有自动解决另一个问题:多人共同决定的事情,是否一定正确。

  • 多个真实身份,可以共同签署错误 Payload;

  • 多个诚实成员,可以共同依赖错误信息;

  • 多个独立密钥,也可以被同一个失陷界面引导。

多签能降低单点作恶,却不能消除语义偏差、状态漂移、共同依赖、集体误判

因此,多签不应该是执行路径的终点,而应该是进入最终执行判断之前的一项必要条件。真正的最后一道边界,不能只计算「有多少人已经说了『是』」,它还必须保留一个独立、真实、不可绕过的能力:

即使所有签名都合法,即使门限已经满足,只要最终执行条件不成立,系统仍然可以说「不」。

这,才是 Final Veto。


下一篇预告 · Final Veto(四):授权和否决,为什么不是同一种能力。我们将从权力结构的角度,说明为什么「能批准」和「能拒绝」必须由不同的边界分别持有。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询