← 返回博客

·

BluffKing 安全悬赏审计:三类目标全部已防御

三个 Claude 审计代理分别审查预测公共牌、取得他人底牌、篡改结算三项悬赏目标,再由 Codex 跨厂商对抗复核:审查过的路径里没有符合悬赏条件的利用方式,局中三项在两种发牌模式下均已防御;复核顺带找到一个范围外的「看牌后退出」公平缺陷,当天修复。

BluffKing 的安全悬赏设了三项挑战:提前预测公共牌、取得他人未公开的底牌、修改自己的手牌并让服务端据此结算,每项经复现确认奖励人民币 10,000 元,三项共 30,000 元。2026 年 10 月 30 日我们用两家厂商的 AI 模型对这三项做了一次完整审计:三个 Claude 审计代理各自只负责一项挑战,逐行读源码并给出「可利用」或「不可利用」的裁定和对应的文件位置;随后由 Codex 作为对抗复核方,任务不是附和,而是尽力推翻这三项「不可利用」的结论。整个过程只读源码,没有改动任何文件,也没有在生产服务器上运行任何东西。结果是:在审查过的全部路径里,没有找到任何一项符合悬赏条件的利用方式。牌局进行中的三项目标,在默认密封发牌和高级加密发牌两种模式下都已被正确防御,两家模型对三项结论一致,可领取的悬赏为零。我们不会为了「领赏」编造一个不成立的漏洞;但对抗复核确实找到了一个不在悬赏范围内的公平性缺陷,当天已修复,见文末。

提前预测公共牌:高级加密发牌用 n-of-n 门限加密,每张公共牌都要所有参与方各交一份解密份额才能打开,服务器自己不持有份额;份额只在当前街、按牌序和参与方双重校验后才会被请求和接受,翻牌阶段不存在索要转牌份额的入口。默认密封发牌在开局前只公布秘密种子的 SHA-256 承诺值,种子本身要到本手结束后才披露;兜底的随机数生成器用操作系统随机数播种,密钥从不下发。要提前知道公共牌,就得逆推 SHA-256 或拿到泄漏的种子,两者在源码里都没有路径。取得他人底牌:发给每个连接的牌桌快照只有一个出口,而且按「观看者座位」遮罩,局中只有座位与观看者一致时才带底牌,身份不明的连接按全部遮罩处理;高级加密发牌中底牌份额只转发给牌主本人,发送方身份取自已认证的连接而不是消息里的字段,伪造不了座位。摊牌时只能开自己的牌,公开亮出的牌对所有人可见,重连快照恢复的也只有这些公开牌;弃掉的牌在局中不会出现在任何人的快照里,观战者看到的快照在每一层都剥掉了底牌字段。有一个边界要重复说明:默认密封发牌在一手结束后会把种子交给本手参与者用于复算,参与者因此能还原别人弃掉、没有亮出的底牌,这是默认机制有意为之的设计,三项安全挑战一文已经披露过;它不是局中读牌,是否计入悬赏要按活动规则的时间范围判定。这两项的默认模式链路在外挂能看到未发的牌吗里也逐段讲过。

修改手牌影响结算:引擎是唯一的评牌方,赢家从服务端权威牌面算出。高级加密发牌的摊牌消息里只有牌序号和门限证明,没有任何牌值字段;服务端用自己早已承诺的密文还原那张牌,证明不通过的座位按弃权处理,而不是按它声称的牌赢。彩池算术全部用检查过溢出的运算并带守恒断言。客户端能发的「赢家」「牌力」「牌值」都不是结算输入,因此没有可伪造的字段。这三项正是整套「服务器盲发的心智扑克加承诺揭示」架构专门要堵的攻击面,这次审计的意义在于确认实现与设计一致,而不是设计本身有多好。

范围外的发现:看完自己的牌再退出。Codex 在试图推翻第二项结论时注意到,高级加密发牌在发牌阶段交换底牌解密份额时,没有把「交出你欠别人的份额」和「收到属于你自己的份额」绑成一个原子步骤,于是一个座位有机会在看到自己两张底牌之后,再决定要不要继续这手牌。旧逻辑把这种「还没下注、只下过盲注」的退出判为无责作废,整手退回盲注,等价于免费看牌、看完不满意可撤回盲注,是对强制盲注机制的期望值套利。它不属于悬赏三类中的任何一项:既没有预测公共牌,也没有看到别人的底牌,更没有改变结算用的牌面,涉及的也只是无货币价值的金豆。已有的缓解(作废一次后,本桌在本次会话内粘滞降级为默认发牌)只能限制频率,不能消除套利。我们逐行核实机制成立后当天就改了:发牌阶段现在和翻牌、摊牌阶段用同一条规则,退出、扣住份额或在裁定时没有连接能接收自己份额的座位被记为违约,它投入底池的筹码归诚实玩家结算,未被跟注的多余部分照常退回;只要还有诚实玩家留在牌局里,这手牌就不再作废、不再降级。诚实掉线同样按此处理,和真实牌局一样。这个修复经 Codex 四轮复核后已合入主分支,随下一次后端发布上线;本文也在那次发布之后才发出。

几条边界必须说清楚。这是源码审查,不是针对生产环境的渗透测试,也没有单独验证线上二进制与源码一致;结论不推广到其他游戏和锦标赛。两种模式仍然要求信任运营方和客户端程序,秘密种子泄漏、服务器被控制或尚未发现的缺陷都会改变上面的结论,所以我们不会说「绝对安全」。悬赏活动仍在进行,规则和截止时间以悬赏页为准;这次审计用的提示词和相关资料,按悬赏页的说明联系管理员即可获取。如果你也想对自己的项目做同样的事,可以直接套用这次的分工:给每个攻击目标一个只负责它的审计代理,要求结论必须落到文件位置;再换一家厂商的模型做对抗复核,提示词的核心是一句话:「下面是三项『不可利用』的裁定和证据,你的任务是推翻它们;找不到反例就说明为什么,找到了就给出完整的攻击序列和对应代码。」这次范围外的那个缺陷,就是这句话问出来的。