CF-Navs 是自托管的书签导航站,部署实例通常带有管理员账号、私密书签和私密分类。安全问题在修复上线前公开,等于给所有已部署实例提供攻击说明。
发现安全问题请使用 GitHub 的私密漏洞报告: 打开本仓库的 Security 标签 → Report a vulnerability。该通道只有仓库维护者可见,不需要公开你的邮箱。
如果该入口不可用,请通过仓库主页的维护者联系方式私下反馈,并在标题中注明是安全问题。
- 受影响的端点、页面或功能,以及触发所需的身份(匿名访客 / 已登录管理员 / 拥有一次性安装令牌)。
- 复现步骤。如果涉及请求构造,请给出方法、路径与必要的请求头名称,不要粘贴真实 Token、Cookie 或密码。
- 你观察到的实际结果,以及你认为它违反了什么边界(例如"匿名请求读到了私密书签的数据")。
- 影响面判断:是信息泄漏、越权写入、拒绝服务,还是配置错误导致的条件性问题。
- 维护者确认并复现,判定影响面与受影响版本。
- 在
develop上修复,补上能失败于该缺陷的测试;涉及缓存或响应策略时同步更新docs/reference/API_CONTRACT.md与docs/reference/PERFORMANCE_CONTRACT.md。 - 从
develop发版、部署并完成部署后验证;main只在维护者明确要求时作为归档快照合入,遵循CONTRIBUTING.md的分支规则。 - 上线后在
CHANGELOG.md中公开描述问题与修复,并致谢报告者(除非报告者希望匿名)。
修复期间不会在公开 Issue、提交信息或文档中给出可直接利用的细节。 Code scanning 告警以其关联分支的重新扫描结果为准。本地扫描通过、提交修复或推送其他分支都不等于告警已修复;真实问题不通过关闭规则、缩小扫描范围或标记误报来消除。涉及归档分支的修复,先取得合并授权,再重扫并核对 GitHub 返回的状态。
以下是当前设计上的已知取舍,报告前请先确认不是这几项:
- 公开对象的图标可按 ID 枚举。
/api/icon/:id与/api/category-icon/:id匿名可访问,但只对匿名访客可见的书签和分类返回真实图标;私密对象及挂在私密分类下的公开书签返回与"ID 不存在"完全一致的兜底图标。 custom_css与custom_js属于公开设置,会随公开数据下发给每个访客并在其浏览器中执行。这是"自定义 CSS/JS"这个功能的预期行为,由管理员自行负责内容。- 登出撤销是最终一致的。 会话撤销名单写入 KV,其他 Worker isolate 最多约 15 秒后感知;KV 写入失败时登出接口仍返回成功,token 会继续有效到
exp。 - 缺少
SESSION绑定时会跳过撤销检查。 这是部署配置问题,请按部署文档正确配置绑定。 - 一次性安装令牌
SETUP_TOKEN由部署者保管。 站点安装完成后该令牌不再需要,后续安装请求会被永久拒绝。
直接作为静态资源返回的 HTML 入口与 Worker 返回的 HTML 使用同一安全策略。构建从 worker/lib/assetHeaders.ts 生成规则,并将规则纳入离线外壳指纹;不要再手工维护另一份 CSP。
HTML 在保持再验证的同时使用 no-transform,阻止与严格脚本策略冲突的代理自动注入,而不是为消除控制台错误开放第三方脚本执行。Cloudflare 的 Web Analytics 设置说明 描述了该行为。因此,这些响应上的自动注入统计会被停用;后续若需要统计集成,应单独审查 CSP 和隐私边界。