# locize InContext editor SDK 跨站脚本 (XSS) 漏洞总结 ## 漏洞概述 **标题**: Cross-origin DOM XSS / handler hijack via missing e.origin validation in locize InContext editor SDK **CVE ID**: CVE-2026-41886 **CVSS 评分**: 7.5 / 10 (High) **描述**: locize 客户端 SDK(浏览器模块)在版本 4.0.21 之前,注册了一个 `window.addEventListener("message", ...)` 监听器,用于处理来自 `locize InContext` 翻译编辑器的消息。该监听器在分派到内部处理程序(如 `editKey`、`commitKey` 等)之前,**未验证 `event.origin`**。 攻击者可以通过构造恶意消息,利用 `window.open` 或第三方页面中的 iframe 向受影响的 locize 主机发送消息,从而触发内部处理程序。 ## 影响范围 * **受影响版本**: `locize` 版本 **`、``、`onclick` 等事件处理器,或在属性写入时注入 `href="javascript:..."` 或 `src="data:text/html,..."`。 * **API 源劫持**: 通过 `locizeEnabled` 设置,`api.source` 和 `api.origin` 可被设置为攻击者控制的值。后续所有 `sendMessage` 调用(包括翻译、回调等)都会发送到攻击者窗口,泄露翻译内容和元数据。 * **CSS 注入 / 布局逃逸**: 通过 `requestPopupChanges`,`containerStyle.height` / `width` 可被插值到 `calc()` 表达式和 `popup.style.setProperty` 中,允许注入额外的 CSS 声明(如 `semicolons`, `behavior:url(...)`)到弹出窗口内联样式中。 ## 修复方案 在版本 4.0.21 中,通过以下三层修复: 1. **Primary**: 在 `src/api/postMessage.js` 的顶层验证 `event.origin`。期望的源是配置的 iframe 源(`getIframeOrigin()`),因此自定义环境可以继续工作。来自其他源的消息在分派给任何处理程序之前被静默丢弃。 2. **Defense in-depth**: `handleEditKey` 现在拒绝危险属性名称(`on*`, `style`)和 `javascript: / data: / vbscript: / file: / src / action / formation / xlink:href: innerHTML`。赋值通过第三方 DOMParser 文档进行清理(剥离 ``, ``, ``, ``, ``, ``, ``, `` 以及事件处理器和危险的 URL 方案)。合法的翻译格式化(``, ``, ``, ``)通过。 3. **CSS-injection**: `handleRequestPopupChanges` 现在要求 `containerStyle.height` / `width` 匹配严格的 CSS 长度格式;格式错误的值被静默丢弃。 ## 工作区 无工作区,建议升级。 ## 参考 * CWE-346: Origin Validation Error * CWE-79: XSS * MDN: window.postMessage security