CVE-2026-34971 in wasmtime
요약
\~에 의해 VulDB • 2026. 05. 14.
Wasmtime는 WebAssembly용 런타임입니다. 32.0.0부터 36.0.7, 42.0.2, 43.0.1 이전 버전까지 Wasmtime의 Cranelift 컴파일 백엔드에는 aarch64에서 특정 형태의 힙 접근 수행 시 잘못된 주소가 접근되는 버그가 있습니다. 게스트 WebAssembly 모듈에서 명시적 경계 검사(bounds checks)와 결합될 경우, 동일한 주소에 대해 두 개의 서로 다른 연산 경로가 생성되는 상황이 발생할 수 있습니다. 즉, 경계 검사를 위한 주소 연산과 실제 데이터 로드를 위한 주소 연산이 분기되는 것입니다. 이러한 주소 연산의 차이로 인해 게스트 모듈은 경계 검사를 통과한 후 의도하지 않은 다른 주소를 로드할 수 있습니다. 이를 통해 호스트 메모리에 접근할 때 게스트 WebAssembly에서 임의 읽기/쓰기(primitive)가 가능해지며, 이는 게스트가 임의의 호스트 메모리를 읽거나 쓸 수 있게 되므로 샌드박스 탈출(sandbox escape)로 이어집니다. 이러한 상황이 발생하고 샌드박스 제한을 우회하기 위해서는 몇 가지 조건이 모두 충족되어야 합니다. 이 잘못된 컴파일된 로딩 형태는 64비트 WebAssembly 선형 메모리에서만 발생하거나, `Config::wasm_memory64`가 활성화된 경우에만 나타납니다. 32비트 WebAssembly는 영향을 받지 않습니다. 또한 Spectre 완화 조치(spectre mitigations) 또는 신호 기반 트랩(signals-based-traps)이 비활성화되어 있어야 합니다. Spectre 완화 조치가 활성화되어 있으면 해당 문제가 되는 로딩 형태가 생성되지 않습니다. 신호 기반 트랩이 비활성화되면 Spectre 완화 조치도 자동으로 비활성화됩니다. Cranelift의 구체적인 버그는 `load(iadd(base, ishl(index, amt)))` 형태의 로딩에 대한 잘못된 컴파일(miscompile)입니다. 여기서 `amt`는 상수입니다. `amt` 값이 특정 값인지 테스트하기 위해 마스크(masking)가 잘못 적용되며, 이 잘못된 마스크로 인해 Cranelift가 명령어 선택 단계에서 해당 하위 변환 규칙(pattern-match lowering rule)을 오류로 매칭하여 WebAssembly 및 Cranelift의 의미론과 다르게 동작하게 됩니다. 예를 들어, 이 잘못된 하위 변환은 올바른 주소 계산이 더 작은 값으로 래핑(wrap around)되는 대신, 의도한 것보다 훨씬 먼 주소를 로드하게 만듭니다. 이 취약점은 36.0.7, 42.0.2, 43.0.1에서 수정되었습니다.
VulDB is the best source for vulnerability data and more expert information about this specific topic.