证据标记:已验 代码/运行时实证 推断 代码结构已验、利用链待运行时复现
| 级别 | 问题 | 业务影响 | 证据 |
|---|---|---|---|
| P0 | 玩家身份可伪造 登录凭证无签名、网关不校验 | 冒充任意玩家登录、进房、读其余额、以其身份操作;测试环境证实可从外网做到 | 已验 运行时 |
| P1 资损 | 跨款并发钱包时序缺口(TOCTOU) | 同账户同时在两款下注,"同一本金押多注",长期使赔付期望偏向玩家、公司缓慢失血 | 推断 代码已验 |
| P1 | 可用性 / 拒绝服务 应用层限流只统计不拦、全局队列无界 | 构造异常/高频请求拖慢或影响全服稳定,干扰正常玩家;不直接造成资损 | 已验 代码 |
| P1 | 3 款命中目标可被客户端指定 | 可指定攻击鱼种(含不在场)。台架量化证 RTP 中性、无法套利,属完整性/风控问题,非资损 | 已验 台架 |
| P2 | 下注额无档位白名单 | 可发任意正值下注绕过投注档风控;RTP 中性不白嫖 | 已验 |
| P3 | 网关握手空指针异常 | 特制畸形凭证触发,被框架兜住不崩服,可静默刷连接/日志 | 已验 |
登录服签发给客户端的身份凭证是明文 JSON 经 Base64 编码、无签名、无有效期(flogin_http_utils.go:66-79)。网关在建立连接时直接解码即信任其中的用户 ID、不验签、不查 Redis(net_ws_conn_mt_client.go:117-139);逻辑服再全盘信任网关传入的身份(net_conn_manager_proxy.go:33)。逻辑服另有的 token 比对只挂在存档定时器、不在登录路径,且比的是 Redis↔Redis、与客户端凭证无关 —— 拦不住伪造。
网关端口绑 0.0.0.0、经 docker-compose 映射至宿主,外部公网机 TCP 直连成功 ⇒ 该缺口在测试环境任意互联网用户可利用。全程仅"登录+进房+读余额"即止,未动用任何资金。
同一玩家跨多款游戏共享一个钱包(Redis GL:user),但开炮时的"余额够不够"判定走的是每款各自内存中的余额快照,真实扣款仅在约 1 秒后异步落库;而本应阻止"同一账户在多款同时在线"的互斥函数 GetOnlineGameType(db_online.go:52)在整个代码库中零调用(已核)。钱包另有"余额不可为负"的硬门(fish_balance_update.lua:161)。
同账户同时在两款各开一局,双方都基于同一份"余额 100"的内存快照下注 → 可拿到多条只押了一份本金的独立中奖线;赢的照常入账,而亏穿本金的差额被"余额不可为负"拒绝并丢弃 ⇒ 赔付期望向玩家偏移,公司缓慢失血。此为经典 TOCTOU 多会话钱包弱点(已上网印证业界案例)。此前的同会话串行审计未覆盖此跨执行体面。
GetOnlineGameType"不足以修复——其为"先查后判"本身即竞态,需改原子占位式互斥。mt_filter_rate_limit.go:138/335,注释实锤"不再踢出/拦截")。IngressGoNum=1),队列无容量上限、永不拒投(net_manager.go:90)⇒ 灌入流量可无限积压、拖垮全服消息处理(团队自注释已载此病)。net_ws_listener.go:170)⇒ 伪造身份可海量建连耗尽资源。net_ws_conn_mt_client.go:134 触发空指针;被框架兜住不崩服,但产生孤儿连接+日志、无告警。JLOH / JLRS / JLBL 三款在生产态下,当客户端提交的鱼种配置 ID 非 0 时,服务端不校验该鱼是否在场,直接以客户端给的鱼种计算倍率结算(fpool_impl.go:56,代码注释明示"兼容以鱼种参数判鱼的游戏 JLOH/JLBL/JLRS")。客户端可点名任意鱼种、甚至对不存在的鱼开火。
结论:可点名鱼种=完整性/风控问题(可打不在场鱼、刷高倍广播、绕鱼池存在性风控),但期望上赚不到钱、非资损。
攻击者最常尝试的方向,经代码审计 + 数据量化确认目前有防护,客户端篡改请求无法得手:
cmd_validate.go:109),进不到业务。| 优先级 | 动作 | 收益 |
|---|---|---|
| 最高 | 登录凭证加签名(HS256)+有效期;网关握手升级前校验签名/有效期、核对服务端记录(仓内已有同口径现成实现可复用 rebate_reader.go:74-127,不改客户端、不改凭证格式);同批:凭证不再写入日志、补空指针判空 | 一处封堵身份伪造(P0)+顶号骚扰,并把多数 DoS 挡在建连前 |
| 最高 | 网关端口收敛为仅内部入口可达,不对公网直出;收紧云安全组 | 消除"任意外部人可直接攻击"的前提 |
| 高 | 跨款钱包改原子占位式互斥(非简单接通在线判定);拒负单独告警+停火;二期按预留额度模型预扣(RFC 4006 / GLI-19 §4.3.3b) | 消除唯一资损路径 |
| 中 | 网关入口加限流(并发连接+速率,前提先修真实 IP 还原)+全局连接上限+慢连接超时 | 降低 DoS 风险(入口限流间接给无界队列封顶) |
| 中 | 3 款命中改分层校验(鱼种白名单+已击杀去重+高倍频控);下注额限定配置档位白名单(数据源现成 m_bet_list) | 消除完整性/风控缺口 |