原文:
https://jazzy.id.au/2012/08/23/why_does_chrome_consider_some_ports_unsafe.html

翻译&校对&审查:
Morxi(墨羲)


今天,在我的Twitter时间线上,我注意到Dan North发出了一条沮丧的推文,抱怨说Chrome似乎会任意阻止与某些端口的连接,并给出令人困惑的错误代码 net :: ERR_UNSAFE_PORT 我以前曾遇到过这种情况,也同样感到沮丧,所以我决定进行一些研究,弄清楚Google的不安全含义。在Stackoverflow和BBS中,有一些讨论是关于哪些端口确切被阻止的,但是我并没有找到有效的论据去说明为什么这些端口被Chrome认为是不安全的。

我的第一个假设是,Chrome程序本身连接到这些端口上是不安全的行为,因为服务协议可能会使Chrome误入歧途。但是,这并不是合理的。然后,我确定这个行为不是保护Chrome,而是保护在这些端口上运行的服务本身。许多Internet协议被设计成对它们接受的内容非常宽容,这为攻击者提供了一个有趣的攻击机会。

正如注重安全性的Web开发人员所知道的那样,当劫持用户的浏览器操作向被攻击者发出请求时,浏览器难以阻止攻击者。XSRF是一个很好的例子,但是好消息是,我们知道如何防止XSRF。如果攻击者欺骗了Web浏览器去攻击非HTTP的服务端,那又该怎么办?让我们以一个SMTP服务器为例。如果您以前从未见过SMTP会话,那么以下是我从Wikipedia中摘录的示例会话:

S: 220 smtp.example.com ESMTP Postfix
C: HELO relay.example.org
S: 250 Hello relay.example.org, I am glad to meet you
C: MAIL FROM:
S: 250 Ok
C: RCPT TO:
S: 250 Ok
C: RCPT TO:
S: 250 Ok
C: DATA
S: 354 End data with .
C: From: "Bob Example" 
C: To: "Alice Example" 
C: Cc: [email protected]
C: Date: Tue, 15 January 2008 16:02:43 -0500
C: Subject: Test message
C:
C: Hello Alice.
C: This is a test message with 5 header fields and 4 lines in the message body.
C: Your friend,
C: Bob
C: .
S: 250 Ok: queued as 12345
C: QUIT
S: 221 Bye

乍一看,这可能看起来不像HTTP。但有一个很重要的共性存在于两者之间,SMTP也使用换行符分隔其协议元素。
那么,当我们将数据发送到无法理解HTTP协议的SMTP服务器时会发生什么?

以下带有示例SMTP服务器的简单HTTP GET请求:

C: GET / HTTP/1.1
S: 500 5.5.1 Command unrecognized: "GET / HTTP/1.1"
C: Host: www.example.com
S: 500 5.5.1 Command unrecognized: "Host: www.example.com"
C: 
S: 500 5.5.1 Command unrecognized: ""

显然,SMTP邮件服务器很困惑,但是它并不是直接拒绝浏览器发起的连接,而是告诉客户端有错误,但仍在继续接受命令。我们可以利用这一点吗?答案是肯定的。如果我是攻击者,要制作一个具有表单的页面,该页面会自动提交表单给SMTP服务器(使用调用事件的javascript加载事件,该提交事件类似于基于表单的XSRF攻击)。为了在该服务器上使用SMTP,我需要能够在邮件中包含换行符。首先排除 application/x-www-form-urlencoded ,因为换行符是URL编码的,但是使用 multipart/form-data 是可行的,这样就可以在上述SMTP对话中构建一个包含客户端消息的字段。接下来,通过受害者的Web浏览器,就可以向目标SMTP服务器提交电子邮件。SMTP服务器将忽略上例中的所有HTTP协议,包括方法和标头以及 multipart / form-data 标头内容,但是一旦到达指定的字段,SMTP服务端将接收到包含 HELO MAIL FROM RCPT TO 等命令,并开始处理它们。

当然,攻击者为什么不可以直接连接到SMTP服务器呢?对于某些SMTP服务器,直接攻击是可行的。但是,许多SMTP服务器受防火墙保护,尤其是如果将SMTP服务器配置为使用它作为验证电子邮件来源的真实性的安全机制,在这种情况下攻击者希望能够通过这样的SMTP服务器发送电子邮件。因此,发动这样攻击的前提是攻击者可以使用在防火墙信任面运行的浏览器(防火墙保护SMTP服务器作为连接到该SMTP服务器的代理),然后使用SMTP服务器发送消息。

事实证明,某些SMTP服务器实际上检测到对它们发出的请求是HTTP报文就立即关闭连接(我的SMTP服务器就这样做了)。但是,并非所有SMTP服务器都执行此操作,因为并未预想到可以将诸如IE之类的客户端服务器用作攻击受保护网络的开放代理。假设其他类型的服务/服务器(例如FTP服务器,甚至IRC服务器)也可以被这样工具,那当然不是一个好消息。

那么,为什么Chrome拒绝连接某些端口?由于Google工程师收集了知名端口列表,并弄清楚了使用这些端口的协议对发送HTTP请求的容忍度,并且如果容忍了,他们将其标记为不安全,然后将其阻止。以防止Google Chrome浏览器成为安全网络的开放代理。

大概所有的网络浏览器都应该这样做。

2012年8月23日发布
James Roper

标签: none

发表新评论