利用Slack视频嵌入实现端到端加密通信
速览
该研究展示了如何滥用Slack平台的视频嵌入功能来建立端到端加密通信通道。这种方法利用了Slack前端渲染机制的潜在漏洞,使得通信内容在传输过程中保持加密状态。此举揭示了大型协作平台在安全设计上的潜在风险。
AI 深度解读
Show HN: 利用 Slack 的视频嵌入实现端到端加密通信
背景
Slack 的 Block Kit 是构建 Slack 应用界面的核心框架,允许开发者通过 JSON 结构定义消息块(Blocks)。在探索其参考文档时,作者注意到一个名为“视频块”(Video Block)的组件。该组件接受一个 video_url 参数,用于在聊天界面中嵌入视频内容。
通常情况下,企业级通信平台对嵌入内容会有严格的安全限制,例如限制来源域名、检查 MIME 类型或进行运行时内容扫描。然而,Slack 的视频块实现相当简单:它仅验证提供的 video_url 是否可访问,并检查服务器是否返回 2xx 或 3xx 状态码。一旦通过这两项基本检查,Slack 就会将其渲染为一个简单的 <iframe>。
这种缺乏深度内容检查的机制,加上 iframe 能够执行客户端 JavaScript 的特性,为作者提供了一个思路:能否利用这一漏洞,在 Slack 的封闭环境中构建一个具备端到端加密(E2EE)功能的通信应用?
核心内容
作者开发了一个名为 e2ee-slack 的项目,旨在通过 Slack 的视频嵌入功能实现消息的端到端加密。其核心逻辑在于利用 Slack 视频块中加载的 iframe 作为客户端执行环境,从而在本地完成密钥管理和加解密操作,确保服务器端无法获取解密密钥。
技术实现细节
-
技术栈选择:
- 应用后端使用 TypeScript 开发,以便快速迭代。
- 加密逻辑依赖于浏览器提供的
Web Crypto API(具体为subtle crypto)。 - 由于自行实现复杂的加密协议难度较大,作者引入了 openpgpjs 库。该库由 Proton(知名加密邮件服务商)维护,提供了成熟的 OpenPGP 标准实现,简化了密钥生成、加密和解密的过程。
-
架构设计:
- 密钥管理:用户在客户端(浏览器)生成密钥对。私钥经过加密后发送给服务器存储。当需要执行签名、加密或解密操作时,服务器将加密后的私钥返回给客户端,客户端在视频块的 iframe 环境中解密私钥并执行操作。服务器始终不接触未加密的私钥。
- 数据存储策略:Slack 的消息或视图支持存储
metadata字段,这些字段在客户端不可见。作者最初尝试利用此特性存储数据,但由于加密消息长度较长,超出了限制,因此放弃了该方案。 - Iframe 加载机制:为了在 iframe 中传递必要的上下文数据(如加密后的私钥、接收者公钥等),作者采用了一种基于 slug(短标识符)的系统。每次需要客户端交互时,服务器在 KV 数据库(键值存储)中生成一个唯一的 slug 并存储必要数据。当视频块加载时,该 slug 被嵌入到客户端代码中,iframe 加载后通过 slug 从数据库获取数据,从而在本地完成所有加密操作。
-
操作流程示例(加密消息):
- 用户在 Slack 中执行命令
/e2ee send,触发一个模态框(Modal)以输入接收者信息。 - 提交模态框后,服务器生成一个包含作者私钥(加密状态)和接收者公钥的 slug,并存入 KV 数据库。
- 用户在 Slack 界面点击视频块,加载包含上述信息的本地客户端代码。
- 用户在本地输入密码,解密私钥。
- 用户输入消息,在本地使用接收者公钥加密消息,并使用自己的私钥进行签名。
- 用户发送仅包含密文的信封(Envelope)。
- 服务器将密文分发给各个接收者。
- 用户在 Slack 中执行命令
-
遇到的限制与发现:
- Ephemeral Messages 限制:在开发过程中,作者发现 Slack 的视频块无法包含在临时消息(Ephemeral Messages)中,这一行为在官方文档中并未明确说明。
- Node.js 特性:作者提到现代 Node.js 原生支持
.env文件加载,这是一个在开发中意外发现的便利特性。
关键要点
- Slack 视频块的 iframe 特性:Slack 的视频嵌入功能本质上是一个简单的 iframe,缺乏对嵌入内容的深度安全审查,这为执行自定义客户端代码提供了可能。
- 端到端加密的实现路径:通过利用 iframe 内的
Web Crypto API和openpgpjs库,可以在不依赖服务器解密能力的情况下,实现基于密钥对的加密通信。 - 数据传递机制:由于 Slack 元数据字段的长度限制,项目采用了基于 KV 数据库的 slug 系统来在服务器和 iframe 客户端之间安全地传递加密上下文。
- 非官方文档行为:视频块不支持在临时消息(Ephemeral Messages)中显示,这是一个未被文档记录的 Slack 行为限制。
- 项目性质:该项目被作者自称为一种“黑客”行为(Hack),因为它利用了 Slack 的设计约束而非官方支持的功能。
意义与影响
对 Slack 生态的启示
该项目揭示了 Slack 在应用扩展性方面的一个潜在矛盾:一方面,Slack 提供了 Block Kit 等工具允许丰富的界面定制;另一方面,其安全模型(如 iframe 的宽松策略)可能被用于构建超出官方预期的功能。虽然 e2ee-slack 并未完全符合 Slack 的设计规范,但它证明了在现有框架下实现高级安全功能(如 E2EE)的技术可行性。
行业对比与趋势
作者将此项目与 Discord 的“Activities”功能和 Telegram 的“Mini Apps”进行对比。Discord 和 Telegram 已经在其客户端中正式支持嵌入完整的 Web 应用,提供了更灵活、更强大的用户体验。相比之下,Slack 目前仍主要依赖传统的 Bot 交互模式,缺乏原生支持复杂 Web 应用的能力。
未来展望
这一实验引发了一个值得思考的问题:主流企业通信服务是否应该采纳类似 Discord 或 Telegram 的“Mini Apps”模式?如果 Slack 等平台能够提供更规范、更安全的 Web 应用嵌入机制,开发者将能够构建功能更丰富、安全性更高且用户体验更好的应用,而无需依赖此类“黑客”手段。这不仅提升了开发效率,也有助于推动企业级通信平台向更开放、更灵活的生态系统演进。
目前,该项目的源代码已开源(gh:v1ctorio/e2ee-slack),用户可以在约 5 分钟内自行部署到 Slack 工作区进行体验。
