CVE-2023-26489
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.
Necə düzəltmək olar
- 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əhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| bytecodealliance wasmtime | 0.37.0 ≤ v < 4.0.1, 5.0.0, 6.0.0 | 4.0.1 |
| bytecodealliance cranelift-codegen | 0.84.0 ≤ v < 0.91.1, 0.92.0, 0.93.0 | 0.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.
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.