本文最后更新于 2024-12-16,文章内容可能已经过时。

第 1 部分 文档概述

PTE在椰奶插件之后又发现了TRSS-Plugin本体的“后门”,涉及严重的米哈游通行证账号安全问题,下面是我们简要的分析过程。

第 2 部分 技术名词解析

第 1 节 Base64加密概述

Base64是一种基于64个字符的编码算法,根据RFC2045的定义:“Base64内容传送编码是一种以任意8位字节序列组合的描述形式,这种形式不易被人直接识别”。

经过Base64编码后的数据会比原始数据略长,为原来的4/3倍。

经Base64编码后的字符串的字符数是以4为单位的整数倍。

RFC2045还规定,在电子邮件中,每行为76个字符,每行末需添加一个回车换行符 \r\n,不论每行是否够76个字符,都要添加一个回车换行符。

下面做一个简单的演示。

原文:

点个关注,是对我持续创作的最大的鼓励!

Base64加密后:

54K55Liq5YWz5rOo77yM5piv5a+55oiR5oyB57ut5Yib5L2c55qE5pyA5aSn55qE6byT5Yqx77yB

第 2 节 MD5加密和“加盐”算法概述

 1991年,罗纳德.李维斯特教授开发了MD5算法,将MD算法推向成熟。

MD5算法经MD2、MD3和MD4算法发展而来,算法复杂程度和安全强度大大提高,但这些MD算法的最终结果都是产生一个128位的信息摘要。这也是MD系列算法的特点。MD5算法的算法特点如下:

  • 压缩性:任意长度的数据,算出的MD5值长度都是固定的。
  • 容易计算:从原数据计算出MD5值很容易。
  • 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
  • 弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
  • 强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。

  我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码。

  加Salt可以一定程度上解决这一问题。所谓加Salt方法,就是加点“佐料”。

  这里的“佐料”被称作“Salt值”,这个值是由系统随机生成的 (很重要后面要考),并且只有系统知道。这样,即便两个用户使用了同一个密码,由于系统为它们生成的Salt值不同,他们的散列值也是不同的。即便黑客可以通过自己的密码和自己生成的散列值来找具有特定密码的用户,但这个几率非常小(密码和Salt值都得和黑客使用的一样才行)。

点这里查看注册时加盐保护的流程

用户注册时

  1. 用户输入【账号】和【密码】(以及其他用户信息);
  2. 系统为用户生成【Salt值】;
  3. 系统将【Salt值】和【用户密码】连接到一起;
  4. 对连接后的值进行散列,得到【Hash值】;
  5. 将【Hash值1】和【Salt值】分别放到数据库中。
点这里查看登录时加盐保护的流程

用户登录时

  1. 用户输入【账号】和【密码】;
  2. 系统通过用户名找到与之对应的【Hash值】和【Salt值】;
  3. 系统将【Salt值】和【用户输入的密码】连接到一起;
  4. 对连接后的值进行散列,得到【Hash值2】(注意是即时运算出来的值);
  5. 比较【Hash值1】和【Hash值2】是否相等,相等则表示密码正确,否则表示密码错误。

第 3 部分 调查过程

为什么说上面那个“Salt值是由系统随机生成的”要考,是因为我们在TRSS-Plugin的米哈游登录插件里的第8~12行发现了这玩意:

const publicKey = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDvekdPMHN3AYhm/vktJT+YJr7cI5DcsNKqdsx5DZX0gDuWFuIjzdwButrIYPNmRJ1G8ybDIF7oDW2eEpm5sMbL9zs
9ExXCdvqrn51qELbqj0XxtMTIpaCHFSI50PfPpTFV9Xt/hmyVwokoOXFlAEgCn+Q
CgGs52bFoYMtyi+xEQIDAQAB
-----END PUBLIC KEY-----`
}

以及第29~32行里的:

function ds(data) {

const t = Math.floor(Date.now()/1000)

const r = random_string(6)

const h = md5(`salt=JwYDpKvLj6MrMqqYU6jTKF17KNO2PXoS&t=${t}&r=${r}&b=${data}&q=`)

return `${t},${r},${h}`

注意到上面的 PUBLIC KEYsalt=JwYDpKvLj6MrMqqYU6jTKF17KNO2PXo了吗?没错,这两段就是负责米游社登录的公钥和“盐”。

而很诡异的是,这个“盐”不仅不是随机生成的,而且还是硬编码在代码里的。

所以我和喵酱就很有理由怀疑,这家伙(指TRSS)是不是给我们开后门解密用户token?还是再利用其他地方的后门盗号???

这里要说一下这个token。有些群友认为我

想到这派蒙头皮发麻。毕竟...我们都用过...

再想到之前查到的TRSS和椰奶插件内部的硬编码QQ号,更让人细思极恐。

第 4 部分 结论

TRSS-Plugin有问题,下面是派蒙的吐槽。

我记得《三体1:地球往事》里有句话:

“红岸”工程的复杂,是复杂在技术之外的。

人心难猜,世事难料。很多问题只单纯的在技术上看,或许什么结果都没有。

因为,谁也不知道,屠龙者最后会不会成为龙。

第 5 部分 编辑团队

enter image description here