【问题标题】:Simulate JS execution to read heap memory模拟JS执行读取堆内存
【发布时间】:2021-01-17 08:54:31
【问题描述】:

我有一个问题,我需要查看特定 JavaScript 源代码是否占用大量堆空间。理想情况下,我希望能够访问堆内存使用情况和堆中对象的数据类型。问题是我似乎必须执行代码才能访问堆内存分配信息。

然而,代码是恶意的(堆喷射攻击),所以我想避免完全执行。有没有办法让我模拟执行?我读过我可以使用sbrk 或 API 挂钩 (MSFT Detours) 来获取特定进程(通常是 JS 解释器/引擎)的内存使用情况,但看起来这些用例实际上执行了代码。

编辑: 我需要访问堆内存作为多个 JS 文件的管道的一部分,因此通过命令或 API 获取内存信息是理想的。

【问题讨论】:

    标签: javascript heap-memory v8 spidermonkey detours


    【解决方案1】:

    “模拟执行”是什么意思?

    一般来说:JavaScript 引擎是用来执行 JavaScript 的。真的。

    为了分析恶意代码,您可能希望尽可能多地研究沙盒/隔离它。理论上,在浏览器中正常执行它就足够了——但实际上,浏览器中有时确实存在安全漏洞,并且恶意代码会尝试利用这些漏洞,因此对于这个特定目的而言,这可能还不够。

    一种方法是添加一个全新的沙盒层。为自己找到一个 JavaScript-on-JavaScript 解释器。或者选择一个非 JIT 编译的 JavaScript 引擎,将其编译为 WebAssembly,然后从您的应用程序中运行它。然后,您可以检查运行恶意代码的 WebAssembly 实例的内存;此内存作为 ArrayBuffer 公开给您的 JavaScript 应用程序。 (对于这样的 JS 引擎,我没有特别的建议,但我确信它们存在。)进行这样的设置可能需要一些努力(不确定;没有尝试过),但它' d 让您与恶意代码完美隔离。

    【讨论】:

    • 似乎 Node/V8 使用其 VM api 提供了沙盒模式。 V8 似乎也支持跟踪。是否可以使用 C++ 连接到 Node 应用程序并在沙箱中执行不安全的源代码时捕获堆统计信息?
    • 是的,正如我所说:就其本质而言,所有 JavaScript 引擎都提供了一些沙盒功能。但是,如果您已经知道该代码是恶意的,我希望您会需要另一层安全性。 Node 应用可以监控自己的内存使用情况;我不了解 C++ 钩子,请参阅 Node API。但是:请勿在您的真实系统上的 Node 中运行不受信任甚至已知恶意的 JS! 节点,例如提供浏览器不提供的文件系统交互——恶意代码可能会删除或感染您的硬盘内容! Node 是为运行您自己编写并因此信任的代码而设计的。
    【解决方案2】:

    如果您使用 Chrome,您可以使用开发者工具的“性能”选项卡。只需按记录刷新页面或应用 JS 脚本:

    如果你想查看 JS 内存,你也可以使用任务管理器。 -> 更多工具 -> 任务管理器

    【讨论】:

    • 对不起,我应该提到我需要访问堆内存作为多个 JS 文件管道的一部分。我需要通过命令访问内存信息。是否有无需访问浏览器 UI 即可公开 V8 内存信息的 API?谢谢你的回答。
    • 尝试 shift + esc 或 3 点的任务管理器 -> 更多工具 -> 任务管理器。在这种情况下,您可以放置​​ Memory 和 Javascript Memory (V8)。
    • 请注意,这种方法确实依赖于实际执行所有代码,这与 OP 所希望的相反。
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 2022-12-11
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    相关资源
    最近更新 更多