[Switch] 浅谈EShop的连接验证机制

April 13, 2019 乱七八糟 奇怪的代码

算是个半搬运吧,毕竟好久没写文章了,都在搞wiki之类的事情上了。

Reddit上的原文

总览:

你的Switch是如何尝试运行一个联网游戏的:

  1. 你的机器判断自己有没有连上互联网
  2. 你的机器拿到并验证一个设备专属的授权令牌(token)(ban机拿不到)
  3. 你的机器登陆你的任天堂账号
  4. 你的机器拿到你玩的游戏的的授权令牌

深层技术细节

  • 你的机器判断有没有连上互联网
    这一步很好理解。

你的机器连接到ctest.cdn.nintendo.net
判断拿到的回复中是不是包含一个X-Organization: Nintendo的包头,
如果存在包头,那你的机器会认为你正常联网了,如果没有,那机器就开始弹提示了。

后台操作

推荐阅读这篇生肉来获得更佳体验。(可能以后会翻译)
在Switch上,只有bugyo是无需授权的。也就是说没有正确的客户证书,你啥都连不上。
目前客户证书是独一无二的,在出厂时就已经写入了机器。
客户证书的私钥是加密存储的,只能通过 TrustZone(一个独立的安全内核,提供加解密API)使用。
ssl模块在启动时就通过设置服务将其解密出来,然后请求spl模块把加密数据传给TrustZoneTrustZone使用“GenerateAesKek”“DecryptPrivk”命令将其解密。

  • 这意味着不像3ds时代,任天堂现在可以明确的识别到哪台机器给出了哪个请求。
  • 这也同时意味着任天堂可以ban掉尝试破解的人的证书,让他们无法连接到任天堂网络。

机器验证拿到的设备授权令牌并连上任天堂网络

这是网络连接过程中的一个更有趣的部分。
任天堂有一个特殊的服务器来处理设备授权令牌 -- "dauth-lp1.ndas.srv.nintendo.net"(dauth意味着设备授权(Device AUTHorization),lp1意味着给零售在线服务的“live production”(在线生产)环境)。
其中很重要的一件事是:一个令牌并不能提供给所有的系统操作使用。不同的系统操作是通过不同的用户id来在系统中区分的。

  • 下面是设备授权的工作流程:
  • 1.你的设备连接到Dauth服务器的“/challenge”目录,发送一个包括“key_generation”的表单来告诉服务器你的机器使用的Masterkey的版本
  • 2.Dauth服务器发送会一个json格式的随机“challenge”字符串,其中包括一个“data”字符串。
  • 3.你的机器使用base64解密data字符串,并把它作为加密的key的来源,然后使用SPL服务配合TrustZone将其改变成keydata,之后再将其载入AES的keyslot
  • 4.你的机器生成他的授权请求数据。将 challenge字符串,需要请求令牌的client_id,Masterkey版本,当前系统的digest 组合成类似"challenge=%s&client_id=%016x&key_generation=%d&system_version=%s"的字符串。
  • 5.你的机器使用通过其授权请求派生的仅限Trustzone密钥来计算AES-128 CMAC,然后将其进行url-safe的base64加密后按照"&mac=%s"的格式将其附在上面的字符串后面。
  • 6.你的机器将上面的请求字符串发送到Dauth服务器的"/device_auth_token"目录。
  • 7.如果全都正常,Dauth会返回一个你的机器的授权令牌。如果你的机器被ban了,你会收到一个错误信息来告诉你你的机器被ban了。

This is a pretty effective custom scheme -- it requires, in order to get a token, that the requester be able to perform TrustZone-only cryptographic operations for the current system version. Provided TrustZone isn't compromised on the latest firmware, this is totally safe. TrustZone is, for better or worse, compromised on all system versions due to shofusel2, though. This means the only real benefit here is that dauth provides an ideal place for console bans to be implemented -- almost all interesting online functionality requires a dauth token of some kind, including purchasing and installing new games from the eShop, so consoles that get blocked here can't do much besides install system updates.

添加新评论