是否可以在运行时修改 ECMAScript 模块源代码(并更改其行为)?

时间:2021-07-15 19:36:18

标签: javascript

我的问题是由 2018 年 Copay 加密货币钱包上的 the notorious attack 激发的。简而言之,有一个库,event-stream,钱包依赖。使用社交工程,黑客获得了更改此库并通过 npm 发布其新版本的能力。注入的恶意代码旨在执行以下操作:

  1. Payload A(一段代码)破译 Payload B 并在 Node.js Module.prototype._compile 函数的帮助下运行它。负载 B 导出一个函数(带有 module.exports),然后执行该函数。 (这些代码步骤在 github 问题的第一条评论中以更方便的方式给出)
  2. 这个函数的目标是注入另一个破译的 Payload C。它的代码通过 writeFileSync() 引入 ReedSolomonDecoder.js 文件,该文件实际上是 lib 依赖项(./node_modules 文件夹中的模块的一部分)。
  3. 当有人调用 require('./ReedSolomonDecoder.js') 时,注入的 Payload 3 反过来会调用 require('bitcore-wallet-client/lib/credentials.js') 并摆弄其函数原型,因此现在用户密码将发送到黑客服务器。

值得注意的是,运行中的应用程序可能会在运行时修改应用程序依赖的模块文件,从而影响它们的行为,因为 CommonJS 模块系统在下面使用了 readFileSync()引擎盖或类似的东西来加载所需的模块(如果我基本上错了,请在这里纠正我)。

ECMAScript 模块怎么样(让我们将自己限制在静态 import 中)?据我所知,在运行时修改 ReedSolomonDecoder.js 文件不会导致此模块行为发生任何变化。该规范规定运行模块依赖项的循环(InnerModuleEvaluation() 的第 10 步)并交替执行其 ExecuteModule() 例程,该例程假设已为模块设置了解析的源文本({{3} } 内部字段).

我的理解是否正确,在 ECMAScript 模块世界中不可能通过更改源代码在运行时对依赖图中的模块的行为产生任何影响?

0 个答案:

没有答案