ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠ°Ρ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Π² Wasmtime, runtime для WebAssembly-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π’ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… обновлСниях Wasmtime 6.0.1, 5.0.1 ΠΈ 4.0.1 устранСна ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ (CVE-2023-26489), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ присвоСн критичСский ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ опасности. Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ позволяСт ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ запись Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти Π²Π½Π΅ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹, допустимой для ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ WebAssembly-ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использовано Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΌ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ выполнСния своСго ΠΊΠΎΠ΄Π° Π²Π½Π΅ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ окруТСния WASI.

Wasmtime прСдставляСт собой runtime для выполнСния WebAssembly-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ WASI (WebAssembly System Interface) ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… обособлСнных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ написан Π½Π° языкС Rust, Π° ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° логичСской ошибкой ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΡ€Π°Π²ΠΈΠ» Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ адрСсации памяти Π² Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ ΠΊΠΎΠ΄Π° Cranelift, Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ нСзависимоС ΠΎΡ‚ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ прСдставлСниС Π² исполняСмый ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ x86_64.

Π’ частности, для WebAssembly-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Π»ΠΈΡΡŒ 35-разрядныС эффСктивныС адрСса вмСсто Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½Π½Ρ‹Ρ… Π² WebAssembly 33-разрядных адрСсов, Ρ‡Ρ‚ΠΎ сдвигало Π³Ρ€Π°Π½ΠΈΡ†Ρƒ допустимой для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ чтСния ΠΈ записи Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ памяти Π΄ΠΎ 34 Π“Π‘, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ настройки sandbox-окруТСния ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π·Π°Ρ‰ΠΈΡ‚Ρƒ для 6 Π“Π‘ ΠΎΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ адрСса. Π’ ΠΈΡ‚ΠΎΠ³Π΅, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ памяти ΠΎΡ‚ 6 Π΄ΠΎ 34 Π“Π‘ ΠΎΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ адрСса оказывался доступСн для чтСния ΠΈ записи ΠΈΠ· WebAssembly-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π’ Π΄Π°Π½Π½ΠΎΠΉ памяти ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ окруТСния WebAssembly ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ WebAssembly runtime.

ΠŸΡ€ΠΈ нСвозмоТности ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ Wasmtime Π² качСствС ΠΎΠ±Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΡƒΡ‚Π΅ΠΉ для блокирования ошибки упоминаСтся ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ «Config::static_memory_maximum_size(0)» для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π³Ρ€Π°Π½ΠΈΡ† ΠΏΡ€ΠΈ любом доступС ΠΊ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ памяти (ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ сущСствСнному сниТСнию ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ). Π”Ρ€ΡƒΠ³ΠΈΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ являСтся использованиС настройки «Config::static_memory_guard_size(1 < 36)» для увСличСния числа с стороТСвых страниц памяти (Guard Page, ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ гСнСрируСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅), Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π² ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ памяти (ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ большого ΠΎΠ±ΡŠΡ‘ΠΌΠ° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ памяти ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡŽ числа ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ выполняСмых WebAssembly-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ).

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ