CVE-2023-26489

Kritik

Təsvir

wasmtime WebAssembly üçün sürətli və təhlükəsiz işləmə mühitidir. Təsirə məruz qalmış versiyalarda wasmtime-ın kod generatoru Cranelift x86_64 hədəflərində səhvə malikdir: ünvan rejiminin hesablanması WebAssembly-nin müəyyən etdiyi 33 bitlik effektiv ünvan əvəzinə səhvən 35 bitlik effektiv ünvan hesablayır. Bu səhv o deməkdir ki, standart kodgen parametrləri ilə wasm tərəfindən idarə olunan yükləmə/saxlama əməliyyatı xətti yaddaşın bazasından 35 bitə qədər uzaqda olan ünvanları oxuya/yaza bilər. Lakin bu səhv nəticəsində qonaq kodu üçün xətti yaddaşın bazasından `0xffffffff * 8 + 0x7ffffffc = 36507222004 = ~34G` bayta qədər uzaqda olan ünvanlar mümkündür. Bu o deməkdir ki, xətti yaddaşın bazasından 6G uzaqdan ~34G uzağa qədər olan virtual yaddaş zərərli modul tərəfindən oxuna/yazıla bilər. Qonaq modul embedder-in xəbəri olmadan bu regiondakı yaddaşı oxuya/yaza bilər. Məsələn, pooling allocator istifadə edildikdə yaddaş digər WebAssembly nüsxələrinə aid ola bilər. Təsirə məruz qalmış embedder-lərə tövsiyə olunur ki, mövcud wasm modullarını təhlil edərək onların səhv kodgen qaydalarından təsirlənib-təsirlənmədiyini müəyyən etsinlər və mümkünsə bunu keçmiş icra zamanı çoxlu sayda trap hadisələri ilə əlaqələndirərək şübhəli modulları müəyyən etsinlər. Cranelift-in x86_64 backend-indəki konkret səhv ondan ibarətdir ki, WebAssembly ünvanı 1-dən 3-ə qədər sabit miqdarda sola sürüşdürüldükdə x86_64-ün sürüşdürmə yerinə yetirən ünvanlama rejimlərinə bükülür. Məsələn, `(i32.load (i32.shl (local.get 0) (i32.const 3)))` WebAssembly ünvanından `$local0 << 3` yükləyir. Cranelift-ə tərcümə edildikdə `$local0 << 3` hesablaması, 32 bitlik dəyər, 64 bitlik dəyərə sıfırla genişləndirilir və sonra xətti yaddaşın baza ünvanına əlavə olunur. Cranelift `%base + %local0 << 3` hesablayan `movl (%base, %local0, 8), %dst` formasında təlimat yaradardı. Lakin buradakı səhv ondan ibarətdir ki, ünvan hesablaması 64 bitlik dəyərlərlə baş verir, halbuki `$local0 << 3` hesablaması 32 bitlik dəyərə kəsilməli idi. Bu o deməkdir ki, ünvan üçün 32 bitə qədər istifadə edə bilən `%local0` bu `movl` təlimatı vasitəsilə əlçatan olmaq üçün 3 əlavə bit ünvan sahəsi əldə edir. Cranelift-də düzəliş backend-də bu sıfırla genişləndirilmiş ifadələri idarə edən səhv lowering qaydalarını silməkdir. Yuxarıdakı nümunə sonra `movl %local0, %temp; shl $3, %temp; movl (%base, %temp), %dst` kimi tərcümə olunur ki, bu da `%local0 << 3` aralıq hesablamasını `%temp` registrində düzgün şəkildə 32 bitə kəsir və sonra `%base` dəyərinə əlavə olunur. Wasmtime 4.0.1, 5.0.1 və 6.0.1 versiyaları buraxılmışdır və hamısı artıq səhv lowering qaydalarını ehtiva etməmək üçün yamaqlanmışdır. Wasmtime-ı yeniləmək tövsiyə olunsa da, yeniləmə mümkün olmadıqda embedder-lərin bu problemi yumşaltmaq üçün istifadə edə biləcəyi bir sıra mümkün iş ətrafı həlləri mövcuddur. Qeyd edək ki, bu iş ətrafı həllərinin heç biri standart olaraq aktiv deyil və açıq konfiqurasiya tələb edir: 1. `Config::static_memory_maximum_size(0)` seçimi xətti yaddaşa bütün girişləri açıq şəkildə sərhəd yoxlamasına məcbur etmək üçün istifadə edilə bilər. Bu, yükləmə/saxlama əməliyyatının effektiv ünvanını düzgün hesablayan ünvan rejimi hesablamasından ayrı olaraq sərhəd yoxlaması yerinə yetirəcək. Qeyd edək ki, bu WebAssembly modullarının icra performansına böyük təsir göstərə bilər. 2. `Config::static_memory_guard_size(1 << 36)` seçimi xətti yaddaşdan sonra yerləşdirilən qoruyucu səhifələri əhəmiyyətli dərəcədə artırmaq üçün istifadə edilə bilər. Bu, nüsxə üçün xəritələnməmiş yaddaş ayırmaqla 34G-ə qədər uzaqda olan yaddaş girişlərinin semantik cəhətdən düzgün olmasını təmin edəcək. Qeyd edək ki, bu hər nüsxə üçün çox böyük həcmdə virtual yaddaş ayırır və eyni vaxtda işləyən nüsxələrin maksimum sayını əhəmiyyətli dərəcədə azalda bilər. 3. Əgər x86_64 olmayan host istifadə etmək mümkündürsə, bu da bu səhvin qarşısını alacaq. Məsələn, bu səhv Wasmtime-ın və ya Cranelift-in AArch64 backend-inə təsir etmir.

CiddilikKritik
CVSS9.9
İstismar ehtimalı—
MəhsulBytecodealliance Wasmtime
Dərc8 mar 2023
İlk görülmə8 mar 2023

Necə düzəltmək olar

Yeniləyin
  • bytecodealliance wasmtime4.0.1 və ya daha yeni versiya
  • bytecodealliance cranelift-codegen0.91.1 və ya daha yeni versiya

Təsirlənən məhsullar

MəhsulTəsirlənən versiyalarDüzəldildiyi versiya
bytecodealliance wasmtime0.37.0 ≤ v < 4.0.1, 5.0.0, 6.0.04.0.1
bytecodealliance cranelift-codegen0.84.0 ≤ v < 0.91.1, 0.92.0, 0.93.00.91.1

Versiyanızı yoxlayın

Məhsulu seçin və istifadə etdiyiniz versiyanı yazın; versiyanın təsirlənən aralıqda olub-olmadığını görün.

Intelligence 360 paketində

Attack Surface Management

Domenlərinizə bağlı aktivləri, onlarda işləyən texnologiyaları və məlum zəiflikləri bir siyahıda görün.

CVE-2023-26489 · Bytecodealliance Wasmtime · Dark Radar