2018 年 4 月 24 日,当时流行的以太币钱包服务(与比特币类似的一种流行加密货币)的用户在连结至网站登录时收到了一条不寻常的消息:网站上的 SSL 安全凭证显示无效。进一步检查后,他们发现该凭证是自主签名的。
有些用户在该阶段就马上停止了。因为,不要在网页上凭证出现错误时登入是个常识,完全停止任何操作。
然而,并非每个人都会停止动作。由于凭证错误之外其他一切看起来还是完全正常,所以有些用户仍然会凭着其直觉继续登入的动作。接者用户只看到一个 10 免倒数的计时器,然后他们的加密货币就被转走了。
换句话说,他们上钩了。
但这整件事是如何发生的呢?没有人点击电子邮件中伪装的连结,他们是直接连结到网站或直接使用网页储存的书籤。

所以到底发生了什麽事呢?

我们会解释这一点,但先让我们稍微回顾一下, 首先,我们必须了解网路运作的一些细节,一开始就会遇到 DNS
作为一个域名注册商,我们从事域注册业务,这也代表着我们允许您将域名(例如example.com)分配给您的伺服器的 IP 位址,像是您的网站或电子邮件等等。
DNS 是您设定网域名称连结至哪个 IP 位址的方式。您使用 DNS 伺服器管理网域名称的指向,这些 DNS 伺服器会设定 example.com 与哪些 IP 位址相连,如 www.example.com 等等,和哪些 IP 位址会包含您的电子邮件等等。
然后,当有人打开浏览器并输入 “example.com” 时,他们的电脑会询问 DNS 解析器 您网站的 IP 位址。如果网路上的其他人最近有造访过您的网站,那麽 DNS 解析器可能会将该资讯储存在其快取中,进而将答案提供给您的电脑。如果它不知道的话,它将向上一层并询问下一个 DNS 伺服器。
然后 DNS 解析器将储存快取以供后续使用,持续一段时间 (称为生存时间或TTL)。这样一来,下次网路上有人询问相同位址时,就不必从头请求答案。
今日,越来越少域名持有人亲自操作 DNS 伺服器。 他们通常会使用注册商或第三方供应商的 DNS 伺服器,像是 Cloudflare 或 Amazon 网站服务。
因为 DNS 是一分佈式的强大系统。 但是它却有一个弱点:它的系统是建立在信任的基础上。 分佈出来的每个 DNS 伺服器都会信任其上方的 DNS 伺服器,以便提供它正确的答案。
以太币钱包网路钓鱼事件的情况是,某个人让所有人的 DNS 解析器错认假答案为真答案。

您要如何伪造 DNS 的答复呢?

DNS 请求及回复是未被加密的,也就是说任何人都能够读取。
如果攻击者可以撷取您的 DNS 请求,那他们就可以欺骗回复并将您的电脑指向错误的 IP 位址。要做到这一点,攻击者必须破解目标网路服务供应商,他们的 DNS 或他们的 DNS 供应商。
在 2018 年 4 月以太币钱包攻击事件中,所有受到攻击之网站的 DNS 请求都收到了错误的答案。不知道什麽原因,有人劫持了网站的 DNS 伺服器。

劫持 DNS 伺服器

有问题的网站是使用一流行网站服务的 DNS 伺服器作为其域名的 DNS 伺服器。如果攻击者想要窃取以太币,其中一个方法就是破解该网站的伺服器并更改其密码。但是如果攻击者可以将网站的 DNS 指向新的恶意网站,那将会更容易。如果他们能够破解 DNS 供应商,他们将可以全面掌控网站的 DNS 并且将其指向任何网站。
但是相反地,去年四月以太币钱包网站攻击事件中的攻击者是选择向以太币钱包网站的域名伺服器提供 DNS 查询的假回复。
他们是如何做到这一点并得到关于网路如何运作的细节呢?

路由表

网路不仅仅是一个大网路,而是一个网路中的网路。
意思是说,当您从家中连结至网路时,您正在向 ISP 网路传送和接收数据,包括 DNS 请求。接着您 ISP 网路的路由器就会解析如何将您传输的内容传送到正确的位置。
这些路由器与某些网路直接连结,但是为了将数据传送至某些网络,它们首先必须要通过另一个网路发送它,然后将其传送到正确的网路。
基本上,路由器的作用是将一张如何到达每个网路的地图拼凑在一起,也就是我们说的路由表。 接着,路由器会与它直接连接的所有网路共享所有信息,因此这些路由表就可以在所有网络上交叉传播。
您或许已经知道网路是藉由使用 IP 位址来定位网路上的电脑位置。每个 IP 位址都有一个 “前缀”,有点像是邮政编码。网路上的每条网路都会向网路上的所有其它网路通告它能够将数据传送到该前缀中的 IP 位址。
当数据传送至终点时,网路路由器会使用其路由表 – 也就是它的网路地图 – 将数据传送到正确的网路以获取终点的 IP 位址及其目的地。这就是网路上的沟通,其中也包含了 DNS 请求,因为 DNS 伺服器也有 IP 位址。
就像 DNS 一样,因为系统是建立在信息可靠性的基础上,当网路恶意甚至意外地发送错误的路由信息时,这些信息就会在网路上的路由表中被结束。
去年春天在以太网站上的攻击便是涉及到这一点。攻击者在网路上攻击核心路由器,然后将流量发送到以太钱包网站的 DNS 服务的 IP 位址中,以及他们所拥有和控制的伺服器上。
然后,只要任何人发送 DNS 查询至攻击者劫持的 IP 位址所管理的域名时,攻击者的伺服器就会传送回复,而不是以太钱包网站的供应商回复。如果有人向攻击者发送以太币网站域名的 DNS 查询,攻击者的伺服器将使用假网站的 IP 位址进行回复,然后在受害者登入假网站时窃取他们的资料。
当天结束时,价值超过 1700 万美元的加密货币就这样被窃取了。
虽然有些人可能会说所有这些与加密货币有关的东西在本质上就是一种冒险,但无论是受攻击的用户,DNS 供应商或是以太币钱包服务商,都更应该了解在某种程度上用户是无法完全被保护的,而这些因素都与主要问题无关:即使每次攻击都为未来的改进提供了经验教训,但重要的是要记住,在最基本的情况下,网络钓鱼主要是利用用户的信任
一方面要注意的是:您不能相信任何东西,甚至是 DNS。 但另一方面,它带出了一个问题:我们要如何才能提高系统的可信度?
答案是:DNSSEC。

DNSSEC

在 DNS 创立时,无从得知您获得的 DNS 回复实际上是否来自他们所声称的来源。 随着网路的发展,人们开始意识到这是一大疏忽,因此人们开始向 DNS 提出”扩展” 的想法,特别是一组 “DNS 安全扩展” 称为 DNSSEC。
它需要进行一些实验才能做到正确,但目前存在的 DNSSEC 包括使用公钥加密技术签署 DNS 记录。 域名持有人生成他们自己的密钥,然后将公钥发送到他们的域名注册商 (通常是藉由上传它们)。 然后,域名注册商将密钥发送到注册局,注册局再签署密钥并发佈它们。 它类似于网站管理员生成 SSL 凭证的方式,然后将其发送给认证机构 (CA) 并由其签名。
当使用 DNSSEC 对 DNS 区域进行签名时,每次查找该区域中的 DNS 记录时,都可以验证收到的记录是否为实际来源。
这表示当在区域上使用 DNSSEC 时,能够检测到所有中间人、缓存中毒,甚至是 DNS 伺服器的危害。
重要的是,DNSSEC 让您能够信任由 DNS 伺服器回复出来的答案是正确的。以太网站的例子来说,假的 DNS 伺服器无法伪造已签名的 DNS 记录并将用户指向假的网站。
更重要的是,如果没有 DNSSEC,攻击者可以利用控制被攻击网站的 DNS 伺服器去创建一个真正的 SSL 凭证,该凭证看起来将与其他任何有效凭证一样,使浏览器看起来有效,让用户无法从那个假的页面得到任何警告。但如果使用 DNSSEC,这种情况就不可能发生。

风险和信任

值得注意的是,以太币钱包网站发生的事情并非加密货币固有的风险。 DNS 劫持不止会发生在加密货币上。2016 年底,一家巴西银行的域名与以太币钱包网站遭受到同样的攻击持,这不仅仅影响了他们的网站,更影响了全国各地、美国和维尔京群岛的 ATM,使数百万人暴露于资讯被盗窃的风险下。
但这些攻击都不只是针对某种货币或频道,而是针对各种网站。 任何网站都可能在这种方式下受到损害,而不仅限于加密货币网站或是金融网站。
风险随时存在,利用技术上的漏洞可以导致潜在的攻击者窃取高额款项。
但是货币的另一的面向是信任问题。人们很容易被许多网路攻击和看似明显的漏洞所矇骗。 而以太币钱包网站的用户所遭受的攻击类型与日常生活中典型的诈骗并没有那麽大的差异。
人们转帐给奈及利亚王子,因为他们认为他们所收到的电子邮件是诚实可靠的信息。 他们因而点击网络钓鱼邮件中的连结,他们相信他们在连结中所看到的域名就是真实的域名。 因此,他们无视凭证发出的警告并登录他们的加密货币钱包,因为他们对网路的核心服务,像是 DNS 和路由器深信不疑。
DNSSEC 是一项非常有用的技术,因为它使用加密技术来增加对其中一个核心服务的信任,因此我们强烈地建议每个人都去使用它,这不只是为了避免这类型的攻击,而是因为它使我们在有疑虑时能更加有信心。然而,它并不完美。

其它考量

一个考量因素是以太币网站的域名并没有启用 HSTS。 这种保护会绕过自签名证书的警告使之变得更加困难,因为没有任何选项会被提交给用户,导致用户忽略警告并继续进行操作。
另一方面,当用户收到警告时是幸运的。 因为攻击者将以太币钱包网站之域名的所有 DNS 流量指向至他们自己的伺服器,使得攻击者也可以使用 DNS 验证去取得 “有效的” SSL 凭证。
另一个考虑因素是,如果攻击者选择将流量重新路由到 DNS 解析器,那麽使用该解析器的每个人都可以将其流量重新路由到他们建立的钓鱼网站,DNSSEC 将无力阻止它。 这是因为 DNSSEC 验证是由 DNS 解析器自己完成的,因此如果 DNS 在您的浏览器与 DNS 解析器之间的任何地方被劫持,DNSSEC 将无法保护您。
最后,没有任何一种安全技术足够抵挡各种类型的攻击。攻击总是能够被多种方式防御,但是 DNSSEC 绝非阻止所有攻击的唯一防御。