275 - 《Webpack 的任意代码漏洞是怎么回事》

发布于 2023年3月15日

昨晚从 YingCi 的 Telegram 上看到的,然后今天研究了下,并且手动处理了 Umi 3 的 Webpack 5,在此记录下。

1、webpack 最近有个可以执行任意代码的漏洞被修复。这个漏洞如果被有心人利用,危害还是很大的。三方库里加一段「magic 代码」,就可以执行任意代码,比如打开你的计算器、读取你的账号信息啥的。

2、原理这个评论已经解释地写了,我以我的理解再说一遍。

webpack 有个 magic comment 的功能,用户可以在此定义任意代码,包括字符串、正则和数组,用于自定义模块的执行方式。

import(
  /* webpackChunkName: "my-chunk-name" */
  /* webpackMode: "lazy" */
  /* webpackExports: ["default", "named"] */
  'module'
);

这里的代码会通过 vm.runInNewContext 的方式被执行,用以拿到用户代码中自定义的内容。

 const val = vm.runInNewContext(`(function(){return {${value}};})()`); 

然后 webpack 会传入一个函数给这个自定义的内容。

importOptions.webpackExports.every( 
  item => typeof item === "string" 
))

这是问题就出现了,传给用户的函数是全局的。在 vm 里拿到这个函数后就可以先通过 const realGlobalThis = fn.constructor('return this')() 拿到全局 this 关键字,再通过 const require = realGlobalThis.process.mainModule.constructor.createRequire(realGlobalThi

内容预览已结束

此内容需要会员权限。请先登录以查看完整内容。