不要开公开 issue。 请使用 GitHub 的私密漏洞报告:
仓库页 → Security → Report a vulnerability(jitOffice/office-ui)。
该入口会创建一条仅维护者与报告人可见的私密议题,并会为你保留一份草稿编号用于后续跟进。
处理时限(拟定,正式发布前确认):
| 阶段 | 时限 |
|---|---|
| 确认收到 | 72 小时内 |
| 初步分级与影响面判断 | 7 天内 |
| 修复或给出缓解方案 | 视严重程度,高危在下一次补丁版 |
我们不会对善意报告者采取法律行动,前提是你遵守下面几条。
- 只做证明漏洞存在所需的最小操作。不要抓取真实用户数据,不要横向移动到其他系统。
- 不要在公开渠道(issue、讨论区、社交媒体、博客)披露细节,直到修复发布或我们书面同意披露。
- 报告里请给出:受影响版本、复现步骤、触发所需的最小示例、你判断的影响面。
办公类组件库的风险不在"组件本身被攻破",而在它如何渲染来自他人的内容。文档、表格、批注 都是不可信输入。以下是我们已知的重点面:
| 面 | 风险 | 设计要求 |
|---|---|---|
| 富文本 / 粘贴内容 | XSS:<img onerror>、javascript: 链接、SVG 内脚本 |
内容渲染属于宿主文档引擎;L1 组件不得把任意 HTML 塞进 v-html/innerHTML |
| 单元格与公式栏 | CSV / 公式注入(`=cmd | …、@INDIRECT、HYPERLINK` 拼接) |
| 批注 / 评论 / 修订说明 | 用户生成内容直接渲染、Markdown 解析放大 | 一律按纯文本渲染;需要链接时走白名单协议(http https mailto tel) |
| 文档导入解析 | ZIP 解压炸弹、XML 外部实体、深层嵌套 | 解析在引擎侧,但组件库不得提供"无限制读取整个文件"的工具函数 |
| 链接与图片 URL | javascript: / data: 协议、外链跟踪像素 |
URL 一律经协议白名单校验;默认不加载外部资源(内网/信创部署是第一类场景) |
| 命令注册表 | 宿主把未校验字符串注册成命令 id / label | 命令只从 Map 注册表取;未注册 id 返回 { ok: false, skipped: 'not-found' },绝不回退到全局对象或动态属性查找(window[id] 这类写法一律禁止) |
UMD 全局 OfficeUI |
与第三方脚本共存时命名冲突、被提前占用 | ADR-0001 定的是固定名 OfficeUI(选完整词正是为了不与业务代码的 OJ 撞名)。"全局已被别人占用时怎么办"目前没有方案,属于待补设计,不要假定它可配置 |
声明式 API data-oj-* |
属性值直接成为配置来源 | 属性值只接受白名单枚举与数值,不解析成选择器或 HTML |
| 文档站 Playground | 浏览器内 compiler-sfc 在线编译 = 刻意的任意代码执行面 |
必须在 sandbox 化的 iframe 内运行;不携带任何凭据;不接受来自父页面的未校验消息;预览域名与主站隔离 |
- 宿主应用自己的鉴权、会话与权限模型。
- 你集成的第三方文档引擎(Univer、OnlyOffice 等)自身的漏洞 —— 请报给对应项目。
- 依赖尚未发布版本的破坏性变更、缺少测试覆盖、代码风格问题。
- 已公开的第三方漏洞(走该依赖自己的渠道)。
许可与依赖面是本项目的安全边界之一:
- 运行时依赖为零(ADR-0004),CI 强制检查发布包的
dependencies必须为空。 - 依赖许可白名单见
NOTICE,CI 做许可扫描;GPL/AGPL/LGPL 与来源不明的图标、字体直接拒绝。 - 产物不得含任何外部 URL(
fonts.googleapis.com、CDN、统计脚本等),CI 扫描产物文本。 这条既是内网部署要求,也是防止数据外泄与供应链替换的措施。 - 发版走
npm publish+ provenance,构建在 CI 干净环境完成,不接受本地直接发包。
浏览器基线(ADR-0002,Proposed)会影响可用的安全原语 —— 例如较旧的 Chromium/Firefox ESR
上部分 sandbox、trusted-types、crypto 能力不完整。基线定案前,任何依赖这些能力的方案
都只能标记为待验证,不得当作既有防线写进文档或代码。