Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2024-29943-but-with-wasm — CVE-2024-29943,但使用 wasm | Kitploit
工具/GitHubGitHub/sneakynachos/cve-2024-29943-but-with-wasm
漏洞利用ShellcodeWeb安全二进制利用
GitHubsneakynachos/cve-2024-29943-but-with-wasm

CVE-2024-29943-but-with-wasm

CVE-2024-29943,但使用 wasm

查看仓库

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
1141个月前尚未审核

CVE-2024-29943,但使用 wasm

一条针对 CVE-2024-29943 的端到端漏洞利用链,通过将 shellcode 以 f64.const 立即数的形式偷运进 SpiderMonkey 的 WebAssembly JIT 代码页,实现任意原生代码执行——无需 ROP,无需 VirtualProtect,无需外部工具链。

已验证可用,针对 2024-03-20 mozilla-central nightly 的 SpiderMonkey shell(JavaScript-C126.0a1,linux x86-64,修复前版本):利用链完整运行,payload 成功执行(write(1, "PWNED by wasm!\n"); exit(0))。

漏洞

CVE-2024-29943 是一个 sec-critical 级别的 IonMonkey 范围分析漏洞,由 Manfred Paul 在 Pwn2Own 2024 上使用,影响 Firefox < 124.0.1(Bugzilla 1886849,CVSS 9.8)。

在 Object.keys 被改为可省略(由 bug 1845728 引入回归)之后,MObjectKeysLength::computeRange 为 Object.keys(x).length 返回了错误的整数范围。Ion 范围分析据此断定某个循环计数器不可能为负,从而消除了仍然可达的边界检查,导致对 Uint8Array 的越界读/写。

利用链

root@kitploit:~
Object.keys 范围分析漏洞 -> 对 Uint8Array 的越界读/写
  -> 破坏相邻的 ArrayBuffer -> addrof / fakeobj / 任意读/写
    -> 实例化手工构造的 WASM 模块(shellcode 以 f64.const 立即数形式嵌入)
      -> WasmInstanceObject -> wasm::Instance -> wasm::Code -> CodeTier
         -> ModuleSegment.bytes_(JIT 代码页,RX)
           -> 扫描页面寻找标记常量
             -> 覆写 FuncExport.eagerInterpEntryOffset_(普通堆内存)
                为 shellcode 在页面内的偏移
               -> 通过解释器调用该导出函数 -> payload 执行

有两个细节,每一个都让我们付出了一次段错误的代价才搞明白,所以记录下来:

  1. 代码页是 RX,不是 RWX。 SpiderMonkey 在编译完成后会对 wasm 代码段执行 mprotect;就地修改指令会触发错误。重定向改为通过覆写堆上 FuncExport 中的 eagerInterpEntryOffset_ 来实现——解释器会计算 codeBase + offset 并跳转过去。
  2. 触发调用必须来自解释器。 顶层代码因原语训练循环而变热,会被 Warp 编译,从而通过 JIT 入口路径调用 wasm 导出函数,永远不会查看解释器入口偏移。从冷函数中调用可强制走解释器路径。

WASM-JIT-页 shellcode 技术来自 WasmBlazeFox;本仓库演示了该技术可以与一个现代、实际发布的浏览器漏洞组合使用,以替代最初的 2018 年训练漏洞。

文件

  • poc.js — 范围分析漏洞的最小触发器。
  • exploit.js — 完整利用链:原语 + WASM JIT shellcode 阶段。
  • gen_wasm.py — 组装嵌入 shellcode 的 WASM 模块,并验证常量往返。使用 python3 gen_wasm.py mysc.bin 可换用不同的 payload。默认 payload 是一个纯系统调用的 write(1, "PWNED by wasm!\n"); exit(0) 验证程序,无需符号解析(因此也能在裸 jsshell 中工作)。若需要经典的基于 libxul 的 system("gnome-calculator") payload,请参见 WasmBlazeFox ex6。
  • test.gdb — 断点和 ptype /o 辅助工具,用于在给定构建上推导对象模型偏移。

复现

  1. 获取一个存在漏洞的 shell:构建 gecko-dev @ afbdf6822c9e9f9b6d44b9ea6904cb10878126b1(Firefox ~124,124.0.1 之前),Linux x86-64——或者获取一个修复前的 nightly jsshell,例如 archive.mozilla.org/pub/firefox/nightly/2024/03/2024-03-20-21-16-35-mozilla-central/jsshell-linux-x86_64.zip。
  2. 运行:
    root@kitploit:~
    LD_LIBRARY_PATH=<jsshell dir> ./js --no-threads --ion-offthread-compile=off \
        --spectre-mitigations=off poc.js      # 仅触发(段错误)
    LD_LIBRARY_PATH=<jsshell dir> ./js --no-threads --ion-offthread-compile=off \
        --spectre-mitigations=off exploit.js  # 完整利用链("PWNED by wasm!")
    

--spectre-mitigations=off 是必需的,因为边界检查消除依赖于索引掩码被禁用(参见 Bugzilla 评论)。

备注

  • 在劫持之前,wasm 导出函数只被调用一次,使该函数保持在基线层,此时 f64.const 立即数会内联生成在代码段中。Ion 编译可能会将它们常量折叠。
  • 偏移量(WASM_INSTANCE_OFF_CODE = 0xa8、MetadataTier.funcExports + 448、FuncExport + 8 等)是从漏洞所在提交的头文件中推导出来的,并针对 2024-03-20 nightly jsshell 进行了确认;对于其他构建,请使用 test.gdb 重新推导。

参考资料

  • https://bugzilla.mozilla.org/show_bug.cgi?id=1886849
  • https://nvd.nist.gov/vuln/detail/CVE-2024-29943
  • https://www.mozilla.org/security/advisories/mfsa2024-15/
  • https://github.com/bjrjk/CVE-2024-29943
  • https://doar-e.github.io/blog/2018/11/19/introduction-to-spidermonkey-exploitation/
下载工具