背景
在游戏刚出来的时候,体验上感觉有一丝不对劲,就是操作的时候竟然可以连点来实现一个回合操作两次,凭借程序猿的敏锐嗅觉,我知道这里肯定有 bug,他的后端没有校验。 于是开始解析协议,发现这个游戏问题越来越多。
问题
无鉴权系统
所谓鉴权,需要让后端知道你是谁,确保这个人一定是你而不是别人。在 Web3 里,鉴权一般是后端构造一条包含 nonce 的消息,返回给前端让用户签名,用户把签名 结果确认后返回给后端,这样后端就知道这个人是谁了。正常的鉴权应该是这样的:
在这个游戏中,也有鉴权机制,但是他的鉴权是这样的:
显然这个鉴权是完全由前端完成的,后端只是简单的验证了一下签名,然后把钱包地址当做 token 返回给前端。这样的鉴权机制有一个很大的问题,就是前端可以伪造 token。 开发里有一句话叫:"永远不要信任用户的输入"。Web2 如此,Web3 更加如此,因为那将是更加开放的。
角色参数可修改
在游戏里,会获取 Unicorn 的 metadata,这个 metadata 里包含了 Unicorn 的属性,比如攻击力、防御力、速度等等。正常情况下,这些属性代表 Unicorn 的实力,不应该能够修改,但是在这个游戏里,这些属性竟然通过前端输入。这样的话,用户可以随意修改自己的属性,这样就可以通过修改属性来作弊了。
消除次数可修改
在游戏里,消除次数不是通过后端计算出来的,而是前端自己计算的。这样的话,用户可以任意修改消除次数,这样就可以通过修改消除次数来作弊了。
总结
还有两个发现的漏洞没有公布出来,我需要留作自己使用嘿嘿。当我在发现问题并验证了后,我第一时间通知了团队,但是团队认为这是原型,游戏玩法更重要。 在我看来,Web3 世界里,安全是第一位的,如果你的产品不安全,那么你的产品就是一个垃圾。 这个产品像是由一个不熟悉后端开发的前端来开发的, 他没有后端经验,所以造成很多问题。 对于团队我认为有这些经验:
- 安全摆在首位,因为这涉及了金钱。
- 不要找外包来解决问题,因为他们只会实现功能,不会关心产品的长远发展。
- 组织社区或团队,先发布一个开放的测试版让社区来测试,不涉及金钱的,发现安全问题可以有奖励。