View on GitHub

CryptoUnicorn RPG 游戏破解

English Version

背景

在游戏刚出来的时候,体验上感觉有一丝不对劲,就是操作的时候竟然可以连点来实现一个回合操作两次,凭借程序猿的敏锐嗅觉,我知道这里肯定有 bug,他的后端没有校验。 于是开始解析协议,发现这个游戏问题越来越多。

问题

无鉴权系统

所谓鉴权,需要让后端知道你是谁,确保这个人一定是你而不是别人。在 Web3 里,鉴权一般是后端构造一条包含 nonce 的消息,返回给前端让用户签名,用户把签名 结果确认后返回给后端,这样后端就知道这个人是谁了。正常的鉴权应该是这样的:

sequenceDiagram actor User participant Server User ->> Server: I need login Server ->> User: Give u a message with a randomly nonce User ->> Server: I sign this message with my private key, this is my signature Server ->> User: I verify your signature, if it's ok, I will give you a token User ->> Server: I use this token to do something. With this token, I needn't to sign message again.

在这个游戏中,也有鉴权机制,但是他的鉴权是这样的:

sequenceDiagram actor User participant Server User ->> Server: I need login, generate a nonce a sign it with my private key Server ->> User: I verify your signature, if it's ok User ->> Server: I use my wallet address as my token.

显然这个鉴权是完全由前端完成的,后端只是简单的验证了一下签名,然后把钱包地址当做 token 返回给前端。这样的鉴权机制有一个很大的问题,就是前端可以伪造 token。 开发里有一句话叫:"永远不要信任用户的输入"。Web2 如此,Web3 更加如此,因为那将是更加开放的。

角色参数可修改

在游戏里,会获取 Unicorn 的 metadata,这个 metadata 里包含了 Unicorn 的属性,比如攻击力、防御力、速度等等。正常情况下,这些属性代表 Unicorn 的实力,不应该能够修改,但是在这个游戏里,这些属性竟然通过前端输入。这样的话,用户可以随意修改自己的属性,这样就可以通过修改属性来作弊了。

修改属性

消除次数可修改

在游戏里,消除次数不是通过后端计算出来的,而是前端自己计算的。这样的话,用户可以任意修改消除次数,这样就可以通过修改消除次数来作弊了。

修改消除次数

总结

还有两个发现的漏洞没有公布出来,我需要留作自己使用嘿嘿。当我在发现问题并验证了后,我第一时间通知了团队,但是团队认为这是原型,游戏玩法更重要。 在我看来,Web3 世界里,安全是第一位的,如果你的产品不安全,那么你的产品就是一个垃圾。 这个产品像是由一个不熟悉后端开发的前端来开发的, 他没有后端经验,所以造成很多问题。 对于团队我认为有这些经验: