为抗议Web{*}推土机,响应WebSocket端口扫描

2020-05-21 02:51:55

今天早上我的信息源上突然出现了一个故事。有人发现,在访问eBay时,他们的Web浏览器使用WebSockets在本地主机上运行端口扫描。据推测,浏览器将这些信息反馈给eBay,这样他们就可以进行某种风险评估。用户是欺诈网络的一部分吗?

不用说,这有点令人担忧。我的网络浏览器可以用来端口扫描我的网络吗?我试着相当密切地跟踪安全措施,我甚至不知道会发生这种情况。更重要的是,扫描只是在后台静悄悄地进行,只有碰巧在寻找它的人才能看到。

我知道足够多的网络开发是危险的…。但老实说,我还没有读过WebSockets。恶意的JavaScript会用0天的有效负载攻击我的桌面的SSH服务器吗?

答案是否定的,也是肯定的。最后我还有一些想法要补充。

首先,我调查了WebSocket是否像我想象的那样危险。老实说,我不知道他们做了什么,因为直到现在我才有动机去调查他们。我最初担心WebSockets可能会被用来向我的计算机或网络上的其他设备发送任意数据包。

首先,WebSocket似乎被禁止访问192.168.0.0/16和10.0.0.0/8。在Firefox中,它会引发SecurityError。奇怪的是,它可以访问localhost,但是。

在Firefox中,WebSocket不能打开端口21、22或23。控制台返回相同的SecurityError。我原本希望特权端口(<;1024)的WebSockets会被阻止,但它没有引起端口24的错误。似乎火狐有一个黑名单?(我没有进一步调查这一点,也没有构建完整的端口列表。)。

最后,我在我的机器上运行了一个简单的Netcat侦听器,并为它打开了一个WebSocket。Netcat发出带有几个标头的HTTP请求,表明它是WebSocket。在连接建立之前,控制台也不允许我发送数据。

我的恐惧得到了些许的满足。WebSocket只能在本地主机上工作,您不能发送完全任意的有效负载。有一些限制使这一点变得更加困难。尽管如此,我仍然能够重复作者的观察:WebSockets绝对可以用作端口扫描器。

下一部分是偶然发现的。我想看看eBay是否也会对我进行portscan,并复制作者的这一部分研究。

我无法让eBay端口扫描我的电脑,无论是在Firefox(带有一些隐私插件,如uBlock)中,还是在全新的Google Chrome浏览器中。即使在登录时,我也没有进行端口扫描。

此外,当我在eBay上时,我试图从控制台打开一个到localhost的WebSocket,但发现它被内容安全策略(从网站发送的头)阻止了。(非常好奇!我以为是某个第三方脚本在进行端口扫描,而易趣不知道…。但似乎运行的任何脚本都需要与发送CSP的任何脚本协同工作!)。

这是一个有点中性的发现。为什么默认情况下没有阻止localhost?我可以理解这可能是it…的用例。也许是一些专有软件,使您的浏览器与计算机上运行的守护程序接口。但这应该是请求的权限,而不是默认授予的权限。

如果你的屏幕上弹出一条信息,你不会担心吗?“易趣想要访问您计算机上的内部网络。是否允许访问?“。

前述文章的作者推断,端口扫描是一种略具攻击性的操作。我同意,但有一个警告。

如果我把一台计算机放在面向互联网的公共场合,匿名用户的端口扫描是公平的。主要是因为如果您将Web浏览器指向我的IP地址,查看它是否响应…。严格来说这是端口扫描!这不是恶意行为吧?我不想试着写一个法律…。您可以检查端口是否打开,但只能检查这些端口,而且速度也只能这么快。这似乎违反了“零、一、多”的原则。

如果您的端口扫描器开始发送任意数据以尝试从服务获取更多信息(如正在运行的软件版本),情况就会变得更加灰暗。不过,公平竞争。如果我有一项监听公共互联网的服务,它的设计应该是抗滥用的。如果我在公共互联网上托管守护程序,我必须接受这样的风险:我的守护程序容易受到某种形式的0天攻击。

如果我不想承担这个风险,答案很简单。不要在公共互联网上开通端口。要么设置防火墙,使其只能通过VPN访问,要么将其关闭。

端口扫描是完全有效的操作,不一定是恶意的。但是,当网站使用我的浏览器穿越NAT并扫描我的本地机器以查找打开的端口时,这是恶意行为。即使这样做是为了“保护用户”。我的个人网络是禁区。我可以连接到您,但没有我的明确许可,您不能(也不应该)连接到我。

在过去的十年里,我目睹了我将称之为Web{*}技术的出现。这是一个有点模糊的术语…。但我可以给你们举几个例子。(虽然标准中不存在花括号,但我觉得它有助于更好地说明我的观点。)。

Web{USB}:允许您的浏览器枚举USB设备并与其通信。(你在开玩笑吗?!)。

Web{?}:允许您的浏览器访问系统上的加速计和其他传感器。在某一时刻,它可以读取您的电池充电状态。(在公关特别糟糕之后,电池功能被弃用。)。

每一个都是默认启用的,大多数人甚至不知道它们的存在。

每个功能都可以用来进一步提取指纹、识别和利用用户--但是似乎功能开发人员要么认为这不会发生,要么不在乎。也许这甚至是他们的意图!

每一个都会给浏览器增加一层巨大的复杂性。有人想尝试基于加速度计的侧通道攻击来恢复单独窗口中的键盘敲击吗?

每一款都让浏览器离我的桌面越来越近,而且似乎完全是由Chromebook开发人员驱动的。

电池功能最能说明这一点。老实说,我无法想象为什么需要这个功能。完全没有。脸书,推特,gmail…。所有这些都不需要访问它。即使我在开发一些…。基于手机的全屏网络应用程序,我不需要知道电池。操作系统会将其显示在下拉菜单中,如果有问题会通知我。

作为用户,我不想要多余的通知。作为一名开发人员,我不关心用户系统上发生的事情。与臭名昭著的HTML<;blink>;标签相比,“Web电池API”的实用程序更少。我无法想象这是如何被接受为网络标准的审查过程。

这让我感觉有点像亚瑟·登特(Arthur Dent),一觉醒来发现我的房子正在被推土机推倒,而这一切都是几个月来的计划。

“但这些计划都是陈列出来的,…”“陈列的吗?我最终不得不下到地窖去找它们。“。“那是陈列部。”“用手电筒。”“啊,好吧,灯可能已经熄灭了。”“楼梯也是如此。”“但是你看,你看到通知了,不是吗?”“是的,”亚瑟说,“是的,我做到了。它被陈列在一个锁着的文件柜的底部,这个文件柜卡在一个废弃的厕所里,门上有一个牌子,上面写着“小心豹子”。

所以,是的,…。WebSocket的安全风险并不像我最初想象的那么大。与其他技术不同,它似乎有一定的用途-即使像HTTP/2流这样的东西使它变得多余。默认情况下拒绝localhost,并使站点请求权限,这是一个很小的更改。但如果你问我,这是一个更大问题的创可贴。

问题是,一旦Web{*}功能“默认开启”,就很难将其回滚。再过几个月,就会出现一些NodeJS时尚,每个人都想用WebSockets重新实现HTTP,并通过JavaScript加载他们网站的每一项资产,以便在某些涉及技术流行语宾果(Bingo)的尖端情况下节省十分之一微秒。(什么?如果没有这个臃肿的框架,我会节省更多的时间?避开非信徒!)。一旦发生这种情况,禁用WebSocket就会破坏互联网。

现在,如果我想稍微控制一下我的浏览器被动地做什么,我需要安装另一个插件来控制哪些站点使用WebSocket。我还需要用内容安全策略修改我的nginx配置,以拒绝在本地主机上使用WebSockets,这样登陆我网站的恶意JavaScript就不会以某种方式滥用我的用户。

这简直是一团糟。我已经花了一个多小时来理解这对我的影响,下周我会发现又有一辆推土机从另一个角度进来躺在我面前。WebSocket只能连接…。但现在有了WebSocketListener!或者WebRemoteDesktop怎么样!WebWiFiControl!WebCPUsageMonitor!WebDMA!WebSmellovision!