CVE-2022-48902
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılıb: btrfs: PageError təyin edildikdə WARN_ON() etməyin Hər hansı bir extent buffer əməliyyatlarını yerinə yetirdikdə, uptodate olmayan səhifə üzərində işlədiyimiz halda xəbərdarlıq etmək üçün assert_eb_page_uptodate() funksiyasını çağırırıq. Həftənin əvvəlində gecə testlərimiz bu xəbərdarlığı aşkar etdi: WARNING: CPU: 1 PID: 553508 at fs/btrfs/extent_io.c:6849 assert_eb_page_uptodate+0x3f/0x50 CPU: 1 PID: 553508 Comm: kworker/u4:13 Tainted: G W 5.17.0-rc3+ #564 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.13.0-2.fc32 04/01/2014 Workqueue: btrfs-cache btrfs_work_helper RIP: 0010:assert_eb_page_uptodate+0x3f/0x50 RSP: 0018:ffffa961440a7c68 EFLAGS: 00010246 RAX: 0017ffffc0002112 RBX: ffffe6e74453f9c0 RCX: 0000000000001000 RDX: ffffe6e74467c887 RSI: ffffe6e74453f9c0 RDI: ffff8d4c5efc2fc0 RBP: 0000000000000d56 R08: ffff8d4d4a224000 R09: 0000000000000000 R10: 00015817fa9d1ef0 R11: 000000000000000c R12: 00000000000007b1 R13: ffff8d4c5efc2fc0 R14: 0000000001500000 R15: 0000000001cb1000 FS: 0000000000000000(0000) GS:ffff8d4dbbd00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007ff31d3448d8 CR3: 0000000118be8004 CR4: 0000000000370ee0 Call Trace: extent_buffer_test_bit+0x3f/0x70 free_space_test_bit+0xa6/0xc0 load_free_space_tree+0x1f6/0x470 caching_thread+0x454/0x630 ? rcu_read_lock_sched_held+0x12/0x60 ? rcu_read_lock_sched_held+0x12/0x60 ? rcu_read_lock_sched_held+0x12/0x60 ? lock_release+0x1f0/0x2d0 btrfs_work_helper+0xf2/0x3e0 ? lock_release+0x1f0/0x2d0 ? finish_task_switch.isra.0+0xf9/0x3a0 process_one_work+0x26d/0x580 ? process_one_work+0x580/0x580 worker_thread+0x55/0x3b0 ? process_one_work+0x580/0x580 kthread+0xf0/0x120 ? kthread_complete_and_exit+0x20/0x20 ret_from_fork+0x1f/0x30 Bu problem c2e39305299f01 ("btrfs: clear extent buffer uptodate when we fail to write it") ilə qismən həll edilmişdi, lakin həmin düzəliş yalnız uğursuz yazma əməliyyatından sonra extent buffer-lərin tapılmasının qarşısını alırdı. Artıq tapılmış buffer-in istifadəsinin davam etdirilməsinin qarşısını almırdı. Bu vəziyyətdə biz blok qrupunu keşləmək üçün commit root-u axtarırıq ki, tranzaksiyanın commit edilməsinə başlaya bilək, commit root-u dəyişək və sonra yazmağa başlayaq. Dəyişiklikdən sonra hələ yazılmamış extent buffer-i tapa və həmin blok qrupunun emalına başlaya bilərik. Daha sonra həmin bloku yazmaq uğursuz olur, səhifədəki Uptodate təmizlənir və nəticədə bu xətalar yaranır. Normalda burada müəyyən dərəcədə tree lock tərəfindən qorunuruq. Bir bloku oxuduqda, həmin blok read lock ilə bağlanır və biz onu yazma üçün göndərməzdən əvvəl yazıcının bloku kilidləməsinin qarşısını alırıq. Lakin bu mütləq şəkildə etibarlı deyil, çünki oxuma əməliyyatı submit_bio-dan əvvəl və extent buffer-i kilidləyib açdıqdan sonra baş verə bilər. Həmçinin, konkret bu halda path->skip_locking təyin edilib, buna görə də bu bizi xilas etməyəcək. Biz sadəcə oxuduğumuz zaman etibarlı olan, lakin istifadə etdiyimiz zaman etibarsızlaşan bir blok alacağıq. Bizim əslində istədiyimiz, bloku "oxuduğumuz", lakin onun Uptodate kimi qeyd edilmədiyi halı tutmaqdır. Oxuma zamanı ClearPageError() çağırılır, beləliklə, əgər !Uptodate və !Error şərtləri ödənirsə, bilirik ki, səhifəni oxumaq üçün düzgün addım atmamışıq. Bu problem !Uptodate && !Error şərtini yoxlamaqla həll edilir; beləliklə, istifadə etdiyimiz zaman buffer etibarsızlaşarsa, xəbərdarlıq edilməyəcək və yoxlamanın əsas məqsədi — blokla işləyərkən onun tamamilə keşdə olduğundan əmin olmaq — qorunacaq.
Necə düzəltmək olar
- linux linux_kernel5.15.27, 5.16.13 və ya daha yeni versiya
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| linux linux_kernel | v < 5.15.27, 5.16 ≤ v < 5.16.13, 5.17 | 5.15.27, 5.16.13 |
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.