D-20260710-01|loadout 簽章綁 matchId=參與證明¶
背景與驅動力¶
複審深追確認 fold 層信譽投毒鏈真實可利用:攻擊者零成本 keygen sybil 湊 ranking(多簽 quorum 自過)、把受害者列入 disconnects、matchId 綁自造名單即通過收件、時戳回填超過 30 秒繞開 live 三閘直墜 foldGuard;reputation applier 對 disconnects 無條件 −5、matchmaking 記 disconnectCount。換 startedAt 即換 matchId= 無限重放,可對任意 PeerId 做網路級決定性投毒。根因是 DisconnectInfo 與 loadouts 零簽章——事件內沒有「被列 disconnect 者確實在本場」的密碼學證明;經濟側月硬頂(D-20260709-01)只擋鑄幣,信譽 / 斷線側原無防線。
考慮過的選項¶
(流水帳未記錄替代方案;本決策以修正形式成立——深追確認可利用後使用者裁「先修」,修法 = 重用既有 loadout 簽章升格為參與證明。)
決定¶
- loadout 簽章改綁 matchId:
loadoutSigningMessage(matchId, loadout),跨場不可重放。 exchangeLoadouts收集全體簽章,隨結算寫入MatchResultEvent.loadoutSignatures。- 收件第 ⓪ 步(live 與 fold 同式)逐筆驗簽,缺簽或偽簽 =
loadout-proof-invalid整包拒收。 - applier 只罰 / 只評有 loadout 者:斷線 −5、
disconnectCount、rating 更新皆閘於 loadout 存在;完賽 +1 與里程碑不閘——被誤列 ranking 只會加分、無投毒價值,且不破壞 void 與里程碑語意。 - 行為變更(使用者裁決):absent(開賽後、交 loadout 前掉線 = 無密碼學承諾者)不再罰 −5、不記斷線——沒承諾不罰,順帶不再誤罰提交窗內網路抖動的誠實玩家。
後果與影響¶
攻擊者偽造不了受害者的 matchId-bound 簽章 = 無法把人塞進 loadouts= 投毒失效;fold 與 live 兩線同式守門(原則見 D-20260709-02)。現況權威:ledger.md(收件與 fold 守門、事件 schema)、matchmaking.md(簽章交換)、比賽進行.md。