🐛 关于低版本 getPath 内部方法潜在的 XSS 安全漏洞修复说明

发布:2024-09-25

漏洞及修复说明

近期,热心开发者 @jackfromeast 在 Github 社区向 Layui 提交了一个 DOM Clobbering 安全漏洞报告,该漏洞通过 gadgets 可能导致跨站脚本(XSS)攻击。值得注意的是,我们在其他流行工具如 Rollup, Vite, Webpack 等也发现了类似的问题。

Layui 构建版(即用于生成环境的发行版本)和开发版均存在不同程度的影响,构建版的影响相对较轻。

该漏洞已在 Layui 2.9.17 版本中修复,且已按照 GitHub Security Advisories 流程发布了对应的安全公告。

Affected versions Patched versions
< 2.9.17 2.9.17

低版本修复方式

若您当前使用的版本 >= 2.8.0,可直接覆盖升级到 2.9.17+ 版本完成修复。

以下主要针对 < 2.8.0 的低版本「非覆盖升级」的修复方式进行介绍:

  1. 打开 layui.js 文件,在代码开头部分找到:
h.currentScript?
  1. 将其替换为:
h.currentScript&&"SCRIPT"===h.currentScript.tagName.toUpperCase()?

:由于构建工具的随机性,部分版本的代码开头部分可能有细微不同,建议核心查找:.currentScript?
假如其前面的字母是 t,如:

t.currentScript?

则应替换为:

t.currentScript&&"SCRIPT"===t.currentScript.tagName.toUpperCase()?

如果引入的是开发版的 layui.js(即 src/layui.js),则直接找到 getPath 方法的 jsPath 变量,将以下代码:

doc.currentScript ?

替换为:

(doc.currentScript && doc.currentScript.tagName.toUpperCase() === 'SCRIPT') ?

其他建议

  1. 尽管触发该漏洞需要多重条件的组合,但仍然强烈建议按照上述方案完成修复。
  2. 同时,建议您的网站本身也要做好 XSS 安全过滤,如 Markdown 解析器或富文本编辑器应禁止或过滤用户插入敏感的 HTML 内容。在渲染由用户产生的内容时,应对内容中可能存在的 HTML 内容进行必要的 escape 处理。
  3. 对于安全要求较高的网站,建议直接开启 CSP,设置仅允许同源或特定的外部源的脚本文件引入。