AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

使用 Websockets 窃取开发人员的秘密

  • 2020-06-23
  • 本文字数:2440 字

    阅读完需:约 8 分钟

使用Websockets窃取开发人员的秘密

这个故事讲的是一种很复杂,但也不是很有用的方法,用来从开发最机密项目的 JavaScript 开发人员那里窃取代码。


最近网上出现了两篇文章,谈的是一些网站滥用 Websocket 功能来扫描用户计算机的端口



这些技术之所以能起作用,是因为浏览器在缺乏很多防护措施的情况下,允许来自公开源的 Websocket 开启到 localhost 的 Websocket 连接。


于是我开始沿着这个方向进一步思考下去。我知道很多流行的 JavaScript 框架在开发中使用了 Websocket,用来在内容更改时自动重载页面。那么恶意网站能否窃听这些流量,并找出开发人员是何时保存代码的呢?


现实比我想的还要糟糕。

方法

  1. 创建一个受欢迎的前端开发网站,或将恶意软件注入到前端开发人员经常访问的站点中。比如说:http://frontend-overflowstack.com/

  2. 在这个页面上添加一些代码,尝试打开与普通端口的 Websockets 连接(扫描 1 万个端口大约需要一秒钟的时间,因此这里请随意操作)

  3. 如果页面打开了某个连接,请使其保持打开状态,然后将收到的所有消息转发到你的恶意数据库。

  4. 获利

这种法子行得通吗?

我在这里托管了一个非常简单的页面:http://frontend-overflowstack.com/。页面加载时,它会尝试将一个 Websocket 连接到访问者计算机上,从 2000 到 10000 全部试一遍(除去 Firefox 不允许的一些端口)。如果某个端口成功连接,它会侦听该端口并输出自己收到的所有消息。这个页面不会保存或传输任何捕获的数据,只是会暂时显示在页面上


如果这个页面显示了任何输出结果,那就意味着一个真正的恶意站点可以轻松地将自己捕获的输出发送到黑客指定的任何服务器上。

生成数据

为了测试这个概念,我们需要一个使用了热重载的简单 Web 服务器。下面是我能想到的最简单方法:


var express = require('express')var http = require('http')var path = require('path')var reload = require('reload');var app = express() app.get('/', function (req, res) {  res.sendFile(path.join(__dirname, 'public', 'test.html'));})var server = http.createServer(app) reload(app).then(function (reloadReturned) {  server.listen(3000, function () {});  setInterval(reloadReturned.reload, 5000);});
复制代码


运行时,它将在端口 3000 上启动一个服务器,在端口 9856 上启动一个 Websocket 服务器,并发送一条消息:每 5 秒 reload 到连接的任何 Websocket 客户端上。


如果我们启动嗅探器站点,则会显示以下内容:



也就是说,frontend-overflowstack.com 直接窃听了本地开发服务器发送到我本地浏览器的重载消息。


在这个阶段,黑客可以轻松得出我们网站的访问者对其本地 JavaScript 代码更改的次数,但是我们可以借此获得更多信息吗?

扩大漏洞

如今,大多数前端开发工作似乎都在使用 React,并且往往会运行 webpack-dev 服务器。这个服务器提供了更好用的 Websocket 接口。


它会通过自己的 Websocket 共享更多数据(稍微有趣一些)。只需调用 create-react-app 即可:


$ npx create-react-app test$ cd test/$ npm start
复制代码


如果我们运行此命令,然后再次查看我们的恶意站点:



马上就有了更多数据,我们收到了哈希和状态消息,还有很多无用信息。


但当开发人员输入错误时会发生什么呢?Webpack 开发服务器会通过其 Websocket 连接,尝试将大量调试信息和堆栈信息发送到开发人员的屏幕上。


不幸的是我们的邪恶站点也可以看到这些信息:



现在事态愈加严重。我们得到了代码段、文件路径、位置之类各种有用的信息。


如果开发人员在包含有用数据的代码行上意外输入了错误代码,情况就更糟了:



现在,我们已经获得了这位开发人员的 AWS Dev 凭证的副本。赶快,拿他的服务器去挖矿吧!

“攻击”的剖析

任何技术设计都需要某种形式的图表才称得上完整。下面是这种攻击机制的图形说明:



(为简化这张图,我省略了运行的本地 Web 服务器,并假装 Websocket 服务器直接来自编辑器内部)


某些浏览器标签上的恶意网页会以静默方式连接到用户计算机上开启的 Websockets。当用户通过这个 socket 发送敏感数据时(从本应只通过本地通道通信的进程来发送),网站就可以收到消息数据,并将其转发到任意外部数据库。

威胁评估

局限因素

认真来说,这种攻击途径是非常狭窄的。你必须诱使不知情的用户访问你的网站,并在他们开发 JS 代码时依旧开着你的页面。


然后你必须等待他们出现编码错误,才能从中收集少量数据,找机会从这些数据中获取利益。

风险因素

但我们知道,很多站点都在使用 Websocket 端口扫描技术,开发人员不一定对此有足够的了解。鉴于 JS 工具链倾向于使用少量知名端口,因此编写脚本来巧妙地泄露 React 开发流量并不是特别困难。


想象一下,为 Twitbook 工作的内部开发人员只是在编辑器中按了“保存”按钮,就会将访问令牌或内部服务器地址泄露给了恶意方。


值得关注的是,在开发人员的一般认知中,在代码编辑器中按“保存”按钮应该完全不会将数据泄漏到第三方 Web 服务。而本文介绍的这种攻击机制意味着,这种数据泄漏的风险还是存在一些的。

对策

我之所以采用了这种尝试拦截 JavaScript 热重载机制的方法,是因为我熟悉的唯一一种 Websocket 通用用法就是它了。


Discord 也使用了 Websockets,但初看起来那里没什么漏洞可钻,因为这个通道在设计时就考虑到了公共互联网环境。


令人担忧的是,仅此一种单向通信通道的简单用例,就可以将大量潜在信息暴露给恶意网站。


鉴于此,Websocket 的其他用途(针对本地使用的数据)可能也会存在类似的漏洞。


我建议,webpack-dev 服务器应该进行一些身份验证,或者为热重载功能选择其他一些浏览器通信通道(我相信这部分工作已经在计划中了,不过是出于其他原因)。


浏览器/Web 标准竟然会以这种方式来实现 Websockets 的策略,这实在很让人惊讶。结果开发人员只是在本地编写代码,就可能会无意中将敏感信息泄漏到公共互联网上,


我希望人们针对这个问题能开发出修复措施,在浏览器中增加额外的安全控制策略。


原文链接:


https://medium.com/@stestagg/stealing-secrets-from-developers-using-websockets-254f98d577a0


2020-06-23 15:342812

评论 1 条评论

发布
用户头像
描述的很清晰,感谢
2021-03-12 12:59
回复
没有更多了
发现更多内容

精华抢先看|龙蜥社区操作系统安全两大白皮书即将重磅发布

OpenAnolis小助手

操作系统 白皮书 系统安全 Meetup 龙蜥社区

【活动报名】 拥抱公平《 Impact Tech, She Can 》

亚马逊云科技 (Amazon Web Services)

人工智能

如何防止AD域环境遭受恶意攻击?

嘉为蓝鲸

AD #运维

低代码开发平台如何推动企业数字化转型

力软低代码开发平台

开发和测试融合,到底该怎么做?

BY林子

敏捷开发 敏捷测试

ITSM | 如何通过设计提升工单处理效率

嘉为蓝鲸

IT ITSM 流程管理

电力行业等保定级评级依据是什么?分为几个等级?

行云管家

电力 等保 等保测评

Docker等容器技术应用到移动开发的探索

Onegun

容器 docker build 小程序容器

ChatGPT能否取代程序员?仍然是一个需要认真探讨的问题,对此你怎么看?

兴科Sinco

OpenAPI openai #人工智能 ChatGPT

模型训练过程中,混合精度训练稳定性解决方案

Openlab_cosmoplat

模型训练 开源社区

优秀!阿里甩出GC面试小册,仅7天Github获赞96.9K

Java你猿哥

Java ssm 面经 GC Java工程师

论文分享丨Holistic Evaluation of Language Models

华为云开发者联盟

人工智能 华为云 论文 华为云开发者联盟 企业号 3 月 PK 榜

矩阵佛萨奇(MetaForce)合约开发源码搭建

薇電13242772558

web3

大数据计算引擎 EasyMR:拥抱开源,引领技术创新

袋鼠云数栈

大数据 大数据基础平台

蛇形走线用在哪里,一文告诉你

华秋PCB

信号 PCB PCB设计 布线 滤波

一站式管理多平台小程序的办法

Onegun

微信小程序 小程序管理平台 小程序管理

BugBuilder: 高质量大规模缺陷库自动构建方法

华为云开发者联盟

开发 华为云 补丁 华为云开发者联盟 企业号 3 月 PK 榜

记一次 rr 和硬件断点解决内存踩踏问题

NebulaGraph

数据库 debug

赋能数字经济新动能 焱融科技获评「人工智能高质量发展-行业责任担当」企业

焱融科技

人工智能 文件存储 容器存储 分布式文件存储 全闪存储

聊聊池化层和步长为2的卷积层

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 3 月 PK 榜 卷积层

gRPC快速整合SpringCloud

Java你猿哥

Java gRPC Spring Cloud 后端 ssm

开门见山|首期《崖山论“见”》技术 Meetup启程

YashanDB

JAVA实战:如何让单元测试覆盖率达到80%甚至以上

Java你猿哥

Java ssm 单元测试 Java工程师 java实战

直击面试!阿里技术官手码12W字面试小册在Github上爆火

Java你猿哥

Java 后端 面经 简历 Java工程师

手把手教你如何使用MyBatisPlus

Java你猿哥

mybatis 实战 Mybatis-Plus

HummerRisk 使用教程:k8s检测

HummerCloud

瓴羊Quick BI数据门户,让管理企业像浏览网页一样轻松

对不起该用户已成仙‖

2023飞书未来无限大会谢欣演讲highlight:三件套、Office提升、出海

B Impact

软件测试/测试开发丨app自动化测试之Appium 源码修改定制分析

测试人

软件测试 自动化测试 测试开发 appium

MySQL中这14个小玩意,让人眼前一亮!

Java你猿哥

Java MySQL 后端 ssm Java工程师

使用Websockets窃取开发人员的秘密_大前端_Steve Stagg_InfoQ精选文章