游戏自制加密货币遭遇DIY超级计算机攻击
速览
一款游戏的自制加密货币系统遭遇了来自DIY超级计算机的攻击。此次攻击导致该加密货币的价值大幅下跌,引发了社区对安全性的担忧。这一事件凸显了去中心化金融项目中潜在的安全漏洞风险。
AI 深度解读
游戏自制加密算法被破解:从“家庭超级计算机”到后端协议解密
背景
这项研究起源于作者 alula 对游戏《Tower Unite》(塔联盟)后端通信协议——AGC(Authoritative Game Coordinator,权威游戏协调器)的逆向工程。起初,作者的目标并非破解加密,而是为了搭建一个本地专用的“公寓”(Condo,游戏内的社交/游戏空间)服务器。
2023年,作者开始研究 AGC 协议,主要目的是探索哪些部分可编辑、哪些部分可被作弊利用。当时他发现密钥生成机制看起来有些可疑,但并未深入。直到2024年8月,随着开发商 PixelTail 宣布开放社区托管专用公寓功能,作者决定搭建本地服务器以配合开发进度。然而,服务器日志中充满了 AGC 连接失败的错误,这迫使作者深入分析 AGC 的连接握手过程,从而意外揭开了一个关于“自制加密算法”的安全故事。
AGC 并非实时游戏服务器(实时游戏由 Unreal Engine 4 专用服务器处理),而是一个带外(out-of-band)的后端组件,负责持久化数据、经济系统、XP、库存、成就、商店等功能。它在二进制文件中泄露了内部路径,显示其内部代号为 “CasinoBackend”,基于 C++ 开发。
核心内容
协议结构与握手机制
AGC 使用一种自定义的、位打包(bit-packed)且高度状态化的 RPC 协议。连接过程大致如下:
- Connect:客户端发送 Steam ID、Steam 身份验证票据以及 AES 会话密钥(该密钥本应由 RSA 保护)。
- ConnectAck:服务器确认连接。
- NameTable:服务器发送一个字典,包含即将使用的所有标识符(如
achievement,getfunds,createcondo等),每个字符占用6位。 - GameClass:定义 RPC 接口,包括事件(方法)和网络变量(复制状态),每个参数都有明确的位宽和角色权限限制。
- GameInstances & EventCalls:实际的方法调用。
该协议具有自描述性,每次连接都会下发完整的 Schema。然而,由于协议是状态化的,解码第 N 个数据包需要之前所有数据包的状态(如名称索引的位宽取决于当前名称表的大小)。此外,Schema 会根据连接者的角色进行过滤,普通客户端无法看到标记为 AGC 自身使用的事件,因此无法通过客户端日志获取完整的协议表面。
身份验证漏洞:从“翻位”到中间人攻击
在深入加密之前,作者发现了一个更直接的漏洞。游戏客户端本地保存了“管理员标志”(bIsAdmin)。通过 Unreal Engine 的反射机制(使用 UE4SS Lua 模组),作者只需将本地客户端的该标志位翻转为 true,服务器便毫无察觉地允许其在非授权公寓中生成物品、编辑表面和修改属性。
这一漏洞在2025年7月12日专用公寓功能向测试人员开放当天被确认。由于缺乏服务器端验证,任何加入者都可以随意篡改无人看管的24/7专用服务器。PixelTail 在四天后发布了包含服务器端验证的候选版本。
这一经历让作者意识到,AGC 的身份验证机制存在严重缺陷。AGC 根据角色(玩家客户端、官方 Tower 服务器、社区专用公寓服务器、AGC 自身)采用不同的验证方式。官方服务器仅需提供角色号和 Steam ID,无需票据或密码。作者意识到可以通过中间人攻击(MITM)伪装成服务器,从而决定深入探究“这个协议到底有多脆弱”。
核心突破:破解自制 RSA 加密
AGC 的后端使用了一种自制的加密层:它将 AES-256 会话密钥包裹在一个自制的 RSA 实现中。
- 模数泄露:RSA 的模数(modulus)直接硬编码在游戏二进制文件中,长度为 509 位。
- 算力整合:509 位的 RSA 模数对于现代计算资源来说太小了。作者利用几位朋友的家用游戏 PC,组建了一台“周末超级计算机”。
- 因子分解:使用
cado-nfs工具和通用数域筛法(GNFS),经过约1.5天的计算,作者成功分解了模数,获得了私钥。 - 协议解密:拥有私钥后,作者可以解密任何握手过程中的会话密钥,进而解密整个后端通信流量。
其他加密缺陷
除了主要的 RSA 破解,作者还发现了另外两种破坏加密的方式:
- 玩具级密钥生成器:存在缺陷的密钥生成逻辑。
- 静态密钥:实际部署中使用了静态密钥。
- 堆内存泄漏:解密例程中存在未初始化堆内存泄漏,导致密钥信息泄露。
关键要点
- 不要自制加密(Don't Roll Your Own Crypto):这是本次事件的核心教训。AGC 的加密实现存在多处致命缺陷,包括使用过小的 RSA 模数、静态密钥以及内存泄漏。
- 509-bit RSA 极易被破解:将 AES-256 会话密钥用 509-bit RSA 包裹是严重的工程失误。利用通用数域筛法(GNFS)和分布式算力,可以在极短时间内分解此类密钥。
- 二进制文件泄露敏感信息:游戏二进制文件中硬编码了 RSA 模数,甚至泄露了服务器内部路径(如
/home/robert/Desktop/Git/CasinoBackend/...),暴露了技术栈(C++)和内部代号。 - 角色权限验证缺失:AGC 协议依赖角色标签来过滤 Schema 和权限,但服务器端缺乏对客户端声称角色的严格验证。简单的本地标志位篡改即可绕过管理员权限检查。
- 自描述协议的局限性:虽然 AGC 协议通过下发 Schema 实现了自描述,便于逆向工程,但其状态化和角色过滤机制使得完整协议分析变得复杂,但也为中间人攻击提供了可乘之机。
- 开发商响应迅速:PixelTail 在收到报告后两周内移除了所有自制加密层,替换为标准的
secp256k1和libsodium。这是一个值得称赞的快速响应。
意义与影响
对独立游戏开发的警示
PixelTail 作为一家小型独立工作室,其经历为整个行业提供了宝贵教训。尽管他们迅速修复了加密问题,但遗留了一个关键缺口:服务器认证(Server Authentication)。这意味着主动的中间人攻击(Active Man-in-the-Middle)仍然可行。这强调了在替换自制加密后,必须全面审查协议的安全性,而不仅仅是替换算法。
逆向工程与安全研究的价值
作者 alula 的研究展示了逆向工程在发现深层安全漏洞中的作用。从最初的目标(搭建本地服务器)到意外发现协议漏洞,再到最终破解加密,这一过程体现了安全研究的典型路径:好奇心驱动,结合扎实的数学基础(数论)和工程能力(分布式计算、协议解析)。
对游戏安全生态的影响
《Tower Unite》的案例表明,即使是看似简单的游戏后端,也可能因为缺乏专业安全审查而存在严重漏洞。它提醒开发者:
- 使用标准库:应始终使用经过广泛审计的标准加密库(如 libsodium, OpenSSL),避免自行实现密码学原语。
- 最小权限原则:协议设计应严格遵循最小权限原则,确保客户端只能访问其角色所需的数据,且服务器端必须进行严格的身份验证。
- 持续监控与响应:PixelTail 的快速修复表明,建立有效的漏洞报告和响应机制对于维护用户信任至关重要。
技术层面的启示
- RSA 密钥长度:509-bit RSA 在现代计算能力下已不再安全。当前标准建议 RSA 密钥至少为 2048 位,甚至 3072 位或 4096 位。
- 分布式计算的力量:利用闲置的家用 PC 算力进行密码分析,展示了“众包”计算在安全研究中的潜力。
- 协议逆向的工程挑战:位打包、状态化、角色过滤的协议增加了逆向难度,但也暴露了设计上的复杂性风险
