ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

WASM内存安全原语入门:Exploitarium浏览器PoC的wasm payload怎么写

WASM内存安全原语入门:Exploitarium浏览器PoC的wasm payload怎么写 WASM内存安全原语入门Exploitarium浏览器PoC的wasm payload怎么写【免费下载链接】exploitariumA single archive of public exploit PoCs and vulnerability research writeups. At the time I post these, none have been reported. Feel free to report them yourself and take credit for the CVE if handed out lulz. Please do not abuse these. I do this so to allure people into the field, and Ive always found this is the most efficient way.项目地址: https://gitcode.com/GitHub_Trending/ex/exploitariumExploitarium 是一个公开的漏洞研究与 PoC 归档仓库其中多个浏览器 RCE 样本正是以WASM 内存安全原语为起点。本文以仓库里的真实案例为教材带你读懂wasm payload 长什么样、有哪些常见写法、以及如何从一个内存原语一步步走向可控执行——零前置代码基础也能跟上。 先搞懂什么是 WASM 内存安全原语WebAssemblyWASM运行在沙箱里默认碰不到任何原生内存。但沙箱和原生之间总存在交接面——JIT 编译器、Wasm GC 引用类型、ESM 导入、线性内存与 JS 类型数组的边界。浏览器厂商在这些边界上的疏漏就能被转化为四类基础原语primitive原语类型通俗解释仓库中的典型来源任意读Read读出任意原生地址的 8 字节数据Firefox 152.0.6 的堆邻接校准、Ladybird 的 WebGL readPixels任意写Write向任意原生地址写入受控值Ladybird 的array.set写入、152.0.6 的伪造对象槽位类型混淆Type Confusion让引擎把 A 类型对象当成 B 类型处理Discord 样本用 Wasm 引用回调改写优化后的值表示悬垂引用Dangling Ref引用已失效的寄存器/类型信息Ladybird 的宿主函数FunctionType悬垂引用理解原语之后再看 PoC你会发现所有浏览器样本其实都是同一套三段式链路读泄露库/堆指针绕过 ASLR写把指针改成可控值伪造对象、改 vtable、改函数体字节;落地触发一次调用执行原生 payload多数样本的payload就是弹出计算器用来证明链路打通。 wasm payload 就是承担第 1、2 步的主力载体——它既是最容易被引擎高信任执行的一等公民又恰好踩在沙箱边界上。 仓库里有哪些可参考的浏览器 WASM PoCExploitarium 按一个漏洞一个文件夹组织与 wasm 直接相关的有四个难度递增文件夹目标wasm 的角色ladybird-wasm-esm-host-function-rce-poc/Ladybird 浏览器ESM 宿主函数生命周期缺陷 →array.set写原语全仓库最简仅 2 个文件firefox-152.0.6-stock-page-native-calc-poc/签名版 Firefox 152.0.6页面内联 wasm 字节码 Wasm GC 堆邻接 → 裸值读写原语firefox-152.0.5-backup-nss-rce-poc/签名版 Firefox 152.0.5两个手工 .wasm 二进制跨进程接力 → NSS DLL 加载discord-activity-stock-client-rce-poc/签名版 Discord 客户端JS 动态构建 wasm 字节码触发类型混淆仓库还维护了 cves.md记录了这些研究已获得的 CVE 编号清单可以印证公开 PoC 归档的价值。如需获取完整代码研究git clone https://gitcode.com/GitHub_Trending/ex/exploitarium⚠️ 作者明确声明这些材料仅供授权复现、浏览器加固与回归测试禁止恶意使用。✍️ wasm payload 的两种写法通读上述样本后可以总结仓库里的 wasm payload 只有两种形态。写法一预编译 .wasm 二进制 薄 JS 驱动以 firefox-152.0.5-backup-nss-rce-poc/ 为样板。该 PoC 直接附带两个手工构造的 wasm 二进制child_id_probe.wasm获取内容进程内的原生控制权遍历子窗口上下文把目标BrowsingContext标识写回线性内存native_browserbridge.wasm构造特权nsDocShellLoadState并携带 system principal 发起 BrowserBridge 加载。配套的 exploit.html 只是一层薄驱动。核心调用逻辑见 exploit.htmlfetch拉取 .wasm 字节 →WebAssembly.instantiate实例化依次调用导出函数init()、spray()、trigger(...)——分别对应准备 / 堆喷射 / 触发原语从leak7.value这个Wasm 全局变量读取泄露的 JIT 返回地址再用固定偏移推出 payload 入口-0x1152与栈修复点-0x17af最后调hijack(repair, payload, 0n, 0n)接管控制流。新手读这类文件的路线先看 JS 驱动里的exports列表init/spray/trigger/leak/hijack再回头看 .wasm 里每个导出函数对应哪一步。驱动文件通常只有两三百行是最快的入口。该 PoC 还展示了 wasm 与原生 payload 的交接calc_payload.c 是证明用的 DLL 源码wasm 负责打穿到原生payload 文件负责到了原生之后干什么。写法二用 JS 动态生成 wasm 字节码不想携带二进制资产时可以直接在 JS 里拼 wasm。仓库有两个现成范例内联字节数组wasm_gc_rw_stock.html 把一段 130 字节左右的 wasm 直接写成Uint8Arraynew WebAssembly.Module(...)即可实例化。这个小模块导出了make/set/get/capture/release等函数专门用来精确控制Wasm GC i64 数组的分配大小与生命周期——因为堆邻接攻击需要按字节对齐地摆放相邻对象见 wasm_gc_rw_stock.html 的按 2 的幂分桶分配逻辑。完整字节码构建器Discord 样本的 wasm-module-builder.js 是一个 2800 行的构建库从魔数\0asm、节长度编码到各 sectionType / Import / Function / Memory / Global / Export / Code 等节码定义见 wasm-module-builder.js全部手工拼装。这样生成的 wasm 可以在运行时按需改变参数与导出避免把敏感布局明牌放在仓库里。对比维度预编译 .wasmJS 动态生成可读性需 wasm 反编译工具辅助源码即文档部署需 HTTP 分发二进制纯 HTML/JS 单文件适用场景需要精细布局的堆操作触发条件简单、想减少资产暴露 从原语到弹计算器一条完整链路怎么读以 firefox-152.0.6-stock-page-native-calc-poc/README.md 为蓝本一条标准链路是训练触发点for-in迭代器关闭后引擎仍复用失效的迭代器索引把索引数组前一个 8 字节当成未校验的动态槽位索引即 stale iterator index见 wasm_gc_rw_stock.html堆邻接校准普通 JS 对象后面紧跟一个同尺寸的 Wasm GC i64 数组失效索引恰好落到数组元素上 → 暴露JS::Value裸值 → 拿到任意读用受控值0x13371337做自检伪造对象实现任意写克隆一个真实普通对象布局、重定向其动态槽就能往任意原生 8 字节位置写有限数值写进已注册 Wasm 函数体把 547 字节的 broker_calculator_stage.bin 拷进broker-stage.wasm的函数体里再调用它——函数体可执行这就拿到了原生执行收尾跨父进程消息派发calculator:URI 弹出计算器随后把所有被改字节恢复并比对PoC 的自我清洁是专业度的一部分。Ladybird 样本则是同一套模板的极简版ESM 导入 JS 函数时FunctionType悬垂引用 → 宿主回调动态返回 0 个值 → 目的寄存器残留攻击者形状的抽象引用 →array.set写穿伪造ArrayInstance配合 ImageData/WebGL readPixels 泄露 libc 基址最终setcontext改虚调用目标执行touch /tmp/ladybird_wasm_esm_rce。全部逻辑就装在 poc.html 一个文件里——建议作为第一个精读对象。️ 新手上手路线图按这个顺序读每一步都有明确验收标准Ladybird 样本2 个文件目标只有一个 marker 文件先理解悬垂引用 → OOB 写这条最短路径Firefox 152.0.6 样本学会看校准calibration代码——所有堆利用的读原语都靠它把碰运气变成可复现Firefox 152.0.5 样本理解 wasm 原语之后如何跨进程BrowserBridge → 特权页 → 备份恢复 → NSS 模块加载Discord 样本进阶看 JS 动态构建 wasm、补丁生成代码指令这类硬骨头。每个文件夹的 README 都遵循同一套结构可以直接当检查清单用Tested Target目标版本可执行文件哈希→Files文件职责表→Reproduction复现步骤→Technical Analysis原语与链路分析→Fix Direction修复方向。最后提醒两点实战常识偏移绑定版本所有原生偏移只对 README 里列出的特定构建有效如 152.0.5 的xul.dll哈希换版本必须重新定位先跑读、再跑写任何写操作前PoC 都会用 canary 读 / 受控值自检这是防止半程崩溃的标准做法。 掌握读原语 → 写原语 → 原生落地这条主线再对照 Exploitarium 里的四个浏览器样本反复验证你就拥有了读懂乃至自己写wasm 类浏览器 payload 的完整框架。【免费下载链接】exploitariumA single archive of public exploit PoCs and vulnerability research writeups. At the time I post these, none have been reported. Feel free to report them yourself and take credit for the CVE if handed out lulz. Please do not abuse these. I do this so to allure people into the field, and Ive always found this is the most efficient way.项目地址: https://gitcode.com/GitHub_Trending/ex/exploitarium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表