CVE-2021-47303

Yüksək

Təsvir

Linux kernel-də aşağıdakı zəiflik həll edilmişdir: bpf: Altproqram poke deskriptorlarını düzgün izləyin və istifadədən sonra azad etmə xətasını düzəldin Altproqramlar map_poke_track() funksiyasını çağırır, lakin proqram buraxıldıqda map_poke_untrack() funksiyasını çağırmaq üçün heç bir qarmaq yoxdur. Bununla belə, proqram buraxıldıqda aux yaddaşı (və poke deskriptor cədvəli) azad edilir, baxmayaraq ki, bizim hələ də map aux məlumatlarının element siyahısında ona istinadımız var. map_poke_run() işə salındıqda, biz azad edilmiş yaddaşa müraciət edirik və prog_array_map_poke_run() funksiyasında KASAN tetiklənir: [...] [ 402.824689] BUG: KASAN: use-after-free in prog_array_map_poke_run+0xc2/0x34e [ 402.824698] Read of size 4 at addr ffff8881905a7940 by task hubble-fgs/4337 [ 402.824705] CPU: 1 PID: 4337 Comm: hubble-fgs Tainted: G I 5.12.0+ #399 [ 402.824715] Call Trace: [ 402.824719] dump_stack+0x93/0xc2 [ 402.824727] print_address_description.constprop.0+0x1a/0x140 [ 402.824736] ? prog_array_map_poke_run+0xc2/0x34e [ 402.824740] ? prog_array_map_poke_run+0xc2/0x34e [ 402.824744] kasan_report.cold+0x7c/0xd8 [ 402.824752] ? prog_array_map_poke_run+0xc2/0x34e [ 402.824757] prog_array_map_poke_run+0xc2/0x34e [ 402.824765] bpf_fd_array_map_update_elem+0x124/0x1a0 [...] Sözügedən elementlər aşağıdakı kimi gəzilir: for (i = 0; i < elem->aux->size_poke_tab; i++) { poke = &elem->aux->poke_tab[i]; [...] size_poke_tab sahəsinə müraciət 4 baytlıq oxumadır və KASAN çıxışındakı ofsetləri yoxlamaqla təsdiqlənir: [ 402.825004] The buggy address belongs to the object at ffff8881905a7800 which belongs to the cache kmalloc-1k of size 1024 [ 402.825008] The buggy address is located 320 bytes inside of 1024-byte region [ffff8881905a7800, ffff8881905a7c00) bpf_prog_aux strukturunun pahole çıxışı: struct bpf_prog_aux { [...] /* --- cacheline 5 boundary (320 bytes) --- */ u32 size_poke_tab; /* 320 4 */ [...] Ümumiyyətlə, altproqramlar mütləq öz məlumat strukturlarını idarə etmirlər. Məsələn, BTF func_info və linfo sadəcə əsas proqram strukturuna göstəricilərdir. Bu, istinadların sayılması və təmizlənməsinin sonuncu üzərində aparılmasına imkan verir ki, bu da onların idarə edilməsini bir qədər sadələşdirir. Lakin aux->poke_tab strukturu bu məntiqə əməl etməmişdir. Bu istifadədən sonra azad etmə xətası üçün ilkin təklif edilən düzəliş poke məlumatlarının izlənməsini düzgün istinad sayılması ilə altproqrama daha da daxil etmişdi. Bununla belə, Daniel və Alexei bu obyektlərə niyə xüsusi yanaşdığımızı soruşdular; mən razıyam, bu lazımsızdır. Buradakı düzəliş hər altproqram üçün poke cədvəlinin ayrılmasını və map izlənməsini aradan qaldırır və əvəzində sadəcə aux->poke_tab göstəricisini əsas proqramın poke cədvəlinə yönəldir. Bu yolla map izlənməsi əsas proqram üçün sadələşdirilir və biz onları hər altproqram üçün idarə etməyə ehtiyac duymuruq. Bu həmçinin o deməkdir ki, proqram istinadlarının sayılmasını geri qaytaran və obyektləri kfree ilə azad edən bpf_prog_free_deferred() altproqram strukturlarını azad edərkən poke_tab-ın iki dəfə azad edilməsinə cəhd etmədiyimizə əmin olmalıdır. Bu, poke_tab göstəricisini NULL-a bərabər etməklə asanlıqla həll olunur. İkinci detal, hər altproqram üçün JIT məntiqinin yalnız ona məxsus poke_tab[] elementləri üzərində düzəlişlər etdiyinə əmin olmaqdır. Bunun üçün biz poke strukturuna altproqram dəyərinə işarə edən göstərici əlavə edirik ki, JIT-lər poke_tab strukturunu gəzərkən cari elementin cari proqrama aid olub-olmadığını asanlıqla yoxlaya bilsinlər. aux göstəricisi sabitdir və buna görə də belə müqayisə üçün uyğundur. jit_subprogs() xəta yolunda biz poke->aux sahəsinin təmizlənməsini buraxırıq, çünki bunlara yalnız JIT tərəfindən istinad edilir, lakin xəta halında biz heç vaxt JIT-ə çatmayacağıq, ona görə də onları asılı vəziyyətdə buraxmaq qaydasızdır. Bu göstəricilərin silinməsi xəta yolunu heç bir səbəb olmadan mürəkkəbləşdirərdi. Bununla belə, biz bütün poke deskriptorlarını əsas proqramdan izləmədən çıxarmalıyıq, əks halda onlar altproqramların JIT yaddaşının azad edilməsi ilə yarışa bilər. Nəhayət, a748c6975dea3 ("bpf: propagate poke des ---kəsilmiş---

CiddilikYüksək
CVSS7.8
İstismar ehtimalı—
MəhsulLinux Kernel
Dərc21 may 2024
İlk görülmə21 may 2024

Necə düzəltmək olar

Yeniləyin
  • linux linux_kernel5.10.53, 5.13.5 və ya daha yeni versiya

Təsirlənən məhsullar

MəhsulTəsirlənən versiyalarDüzəldildiyi versiya
linux linux_kernel5.10 ≤ v < 5.10.53, 5.11 ≤ v < 5.13.5, 5.145.10.53, 5.13.5

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-2021-47303 · Linux Kernel · Dark Radar