发现安全问题请不要直接 PR 或 public issue。
唯一报告渠道:GitHub Security Advisory—— 到 https://github.com/LinekForge/ink/security/advisories/new 提交 private advisory。
我们尽量在 7 天内回复,30 天内提供 fix 或缓解方案。
如果 GitHub 不可用(极端场景),请在 repo 的 issue 里开一个不含具体漏洞细节的 placeholder(例如:"security concern, please contact me")并留联系方式,maintainer 会主动联络。不要把漏洞细节发在 public issue 里。
Ink 是本机桌面 app。没有网络服务、不起 rpc、不调用外部 API(除了用户点击的 http 链接由系统浏览器打开)。
- 用户主动打开的 md 文件是信任的:通过
File → Open/ 拖拽 /open -a Ink foo.md打开。Ink 读取内容用 Milkdown 渲染,不执行任何嵌入脚本——Milkdown 走 ProseMirror doc model,HTML 里的<script>不会被执行。 - 粘贴 / 拖入的图片落盘路径受限:Rust
save_image/save_image_from_path落到{tab_dir}/assets/或~/Pictures/Ink/,路径经canonicalize()校验。 - md 里的 http 链接由系统浏览器接管:点击交给
@tauri-apps/plugin-opener,Ink 本身不发起任何 http 请求。
- Unsigned DMG:Ink 是源码项目,不做 Apple Developer ID 签名 + notarize。首次打开 macOS 会报 Gatekeeper 警告,需右键「打开」绕过一次。介意者自行 clone + build。
- macOS only(当前):仅构建 Apple Silicon DMG。Windows / Linux / Intel Mac 可自行交叉编译(Tauri 支持但未测试)。
- asset 协议 scope 较宽:
$HOME/**、/Volumes/**、/tmp/**都可读——为了渲染用户 md 里任意位置的本地图片。系统目录(/etc//var//usr等)被隔离。 - CSP img 不限域:
tauri.conf.json里security.csp: null,远程图片(http/https)可渲染。不嵌入 script 执行的前提下这是可控的,但打开不信任来源的 md 文件时注意——图片加载会产生 DNS 请求。
- 路径 canonicalize 防穿越:所有文件 IO 命令(
read_file/write_file/show_in_finder/stat_file/save_image/save_image_from_path)在 Rust 侧走Path::canonicalize()解析 symlink +..。write_file额外 canonicalize 父目录再拼文件名。 - asset 协议 scope 白名单:Tauri
assetProtocol.scope明确限定三个目录前缀——绝对路径 img 超出范围会 load 失败。 - 无脚本执行路径:Milkdown schema 不含 script node,外部 md 里的
<script>被当作文本渲染或忽略,不会执行。
订阅 GitHub Releases。安全 fix 会在 release notes 里标 [security]。