菜单

安全模型

相关源文件

目的与范围

本文档描述了 drawio-desktop 应用程序的安全模型。该安全模型旨在将应用程序与互联网隔离,并防止任何未经授权的数据传输,从而确保您的图表数据保持私密和安全。此页面重点介绍 Electron 封装应用程序中实现的安全功能,而不是 draw.io 核心绘图引擎的安全性。

drawio-desktop 的主要安全原则是完全隔离互联网,唯一的例外是更新机制,它遵循严格的安全协议。

核心安全架构

drawio-desktop 的安全架构建立在多层保护之上

来源: src/main/electron.js358-389 README.md10-17

互联网隔离

drawio-desktop 应用程序旨在完全隔离互联网,唯一的例外是更新机制。

这种隔离带来了一些功能上的影响

  • 图表数据绝不会外部发送
  • 不收集应用程序使用情况的分析数据
  • 需要外部连接的功能(如 .vsd 和 Gliffy 导入)在桌面版本中不可用

用户可以使用 --disable-update 命令行选项、DRAWIO_DISABLE_UPDATE=true 环境变量,或者通过在代码库中设置 disableUpdate 标志来完全禁用更新。

来源: README.md10-17 src/main/electron.js19-25 sync.cjs15-16

内容安全策略实施

强制执行严格的内容安全策略 (CSP),以防止包括跨站脚本 (XSS) 攻击在内的各种安全漏洞。

CSP 通过拦截所有 HTTP 响应并添加适当的标头来应用。

CSP 指令目的
default-src'self'将资源限制为同一来源
script-src'self' + hashes仅允许来自同一来源的脚本或具有特定哈希值的脚本
connect-src'self'仅允许连接到同一来源
frame-src'none'防止在 iframe 中嵌入
base-uri'none'防止更改基本 URL
object-src'none'防止使用 object 标签

Google Fonts 访问仅在用户明确允许的情况下才启用。

来源: src/main/electron.js358-371 src/main/electron.js80-82 src/main/electron.js959-967

文件访问控制

应用程序严格控制文件访问,以防止未经授权的文件操作。

文件访问仅限于

  1. 应用程序自己的代码目录(codeUrl
  2. 插件目录(pluginsCodeUrl),如果启用了插件。

任何试图访问这些目录之外的文件的尝试都会被阻止,从而防止了访问用户系统上的敏感文件等潜在安全风险。

来源: src/main/electron.js372-389 src/main/electron.js349-352

进程隔离和上下文桥

该应用程序使用 Electron 的上下文隔离功能,在进程之间创建安全的边界。

与进程隔离相关的关键安全功能

  1. 上下文隔离:确保渲染器进程(运行 Web 内容)与主进程(有权访问系统资源)分离。

  2. 上下文桥:通过预加载脚本仅向渲染器进程公开特定的、受控的 API。

  3. 发送者验证:所有 IPC 消息都经过验证,以确保它们来自合法来源。

validateSender 函数检查 IPC 消息是否仅来自应用程序自己的代码。

来源: src/main/electron.js166-176 src/main/electron-preload.js36-71 src/main/electron.js125-128

为维护应用程序安全,对导航和窗口创建进行了严格控制。

应用程序实施了多项限制:

  1. 导航阻止:阻止所有导航尝试,确保应用程序保持隔离。

  2. 窗口创建限制:只能创建特定类型的窗口。

    • 空窗口(about:blank),具有安全选项。
    • 通过 openExternal 检查的外部 URL。
  3. WebView 禁用:阻止所有 webview 附件尝试,防止潜在的安全绕过。

这些限制协同工作,以维护应用程序的安全边界。

来源: src/main/electron.js1224-1255

更新机制安全

更新机制是唯一允许连接到互联网的组件。

更新机制包含多项安全功能:

  1. 受信任的来源:更新仅从 GitHub releases 和 GitHub 拥有的 AWS S3 存储桶下载。

  2. 用户控制:用户可以选择是否下载和安装更新(除非启用了静默更新)。

  3. 禁用选项:可以通过命令行标志、环境变量或配置文件完全禁用更新。

这种受控的更新流程可确保应用程序保持最新,同时维护安全性。

来源: src/main/electron.js1129-1138 README.md10-17 src/main/electron.js1258-1353

安全验证

在整个代码库中,各种验证机制确保操作的安全执行。

  1. IPC 发送者验证:所有 IPC 消息都经过验证,以确保它们来自应用程序自己的代码。

  2. 文件 URL 验证:文件 URL 经过验证,以确保它们指向允许的位置。

  3. 窗口位置验证:窗口位置经过验证,以确保它们在显示范围内。

validateSender 函数在所有 IPC 通信中被调用,以防止未经授权的代码触发主进程中的操作。

这种验证出现在整个代码库中,例如:

来源: src/main/electron.js125-128 src/main/electron.js232-237

安全设计原则

drawio-desktop 的安全模型遵循几项关键设计原则:

  1. 默认隔离:应用程序默认与互联网隔离。

  2. 最小权限原则:只启用最低限度的必要功能。

  3. 纵深防御:多层安全保护应用程序。

  4. 用户控制:用户可以根据自己的需求配置安全功能。

  5. 透明度:安全措施已文档化并在源代码中可见。

正如 README 中所述:“安全和隔离应用程序是 draw.io desktop 的主要目标。如果您要求任何默认情况下在应用程序中启用了外部连接的功能,答案将是否定的。”

来源: README.md10-17

结论

drawio-desktop 的安全模型通过多层安全控制为用户图表数据提供强大的保护。通过保持与互联网的严格隔离、实施内容安全策略、限制文件访问以及强制执行进程隔离,该应用程序确保图表数据保持私密和安全。

唯一的外部通信通过受控的更新机制进行,如果需要,可以完全禁用。这种安全优先的方法可能会限制一些需要互联网连接的功能,但将数据隐私和安全置于首位。

来源: README.md10-17 src/main/electron.js358-389