CVE-2023-54271
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: blk-cgroup: blkg_policy_data'nın başlatılmadan önce yüklenmesinden kaynaklanan NULL deref hatası düzeltildi blk-iocost bazen şu çökmeye neden olmaktadır: BUG: kernel NULL pointer dereference, address: 00000000000000e0 ... RIP: 0010:_raw_spin_lock+0x17/0x30 Code: be 01 02 00 00 e8 79 38 39 ff 31 d2 89 d0 5d c3 0f 1f 00 0f 1f 44 00 00 55 48 89 e5 65 ff 05 48 d0 34 7e b9 01 00 00 00 31 c0 <f0> 0f b1 0f 75 02 5d c3 89 c6 e8 ea 04 00 00 5d c3 0f 1f 84 00 00 RSP: 0018:ffffc900023b3d40 EFLAGS: 00010046 RAX: 0000000000000000 RBX: 00000000000000e0 RCX: 0000000000000001 RDX: ffffc900023b3d20 RSI: ffffc900023b3cf0 RDI: 00000000000000e0 RBP: ffffc900023b3d40 R08: ffffc900023b3c10 R09: 0000000000000003 R10: 0000000000000064 R11: 000000000000000a R12: ffff888102337000 R13: fffffffffffffff2 R14: ffff88810af408c8 R15: ffff8881070c3600 FS: 00007faaaf364fc0(0000) GS:ffff88842fdc0000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00000000000000e0 CR3: 00000001097b1000 CR4: 0000000000350ea0 Call Trace: <TASK> ioc_weight_write+0x13d/0x410 cgroup_file_write+0x7a/0x130 kernfs_fop_write_iter+0xf5/0x170 vfs_write+0x298/0x370 ksys_write+0x5f/0xb0 __x64_sys_write+0x1b/0x20 do_syscall_64+0x3d/0x80 entry_SYSCALL_64_after_hwframe+0x46/0xb0 Bu durum, iocg->ioc değerinin NULL olması nedeniyle gerçekleşmektedir. Bu alan ioc_pd_init() tarafından başlatılır ve asla temizlenmez. NULL deref hatası, blkcg_activate_policy() fonksiyonunun blkg_policy_data'yı başlatmadan önce yüklemesinden kaynaklanmaktadır. blkcg_activate_policy() şunları yapmaktaydı: 1. Mevcut tüm blkg'ler için pd tahsis etmek ve bunları blkg->pd[] içine yüklemek. 2. Tüm pd'leri başlatmak. 3. Tüm pd'leri çevrimiçi (online) hale getirmek. blkcg_activate_policy() yalnızca queue_lock kilidini tutar ve tahsis işlemi uyku moduna geçmeyi gerektirebileceği için kilidi serbest bırakıp tekrar edinebilir. ioc_weight_write() ise blkcg->lock kilidini tutar ve tüm blkg'lerini gezer. İkisi arasında bir yarış durumu (race condition) oluşabilir ve eğer ioc_weight_write(), 1. adım sırasında veya 1. ile 2. adımlar arasında çalışırsa, henüz başlatılmamış bir pd ile karşılaşabilir ve bu da çökmeye yol açar. Çökme, aşağıdaki yamanın uygulandığı durumda şu betikle yeniden üretilebilir: #!/bin/bash echo +io > /sys/fs/cgroup/cgroup.subtree_control systemd-run --unit touch-sda --scope dd if=/dev/sda of=/dev/null bs=1M count=1 iflag=direct echo 100 > /sys/fs/cgroup/system.slice/io.weight bash -c "echo '8:0 enable=1' > /sys/fs/cgroup/io.cost.qos" & sleep .2 echo 100 > /sys/fs/cgroup/system.slice/io.weight ile birlikte: > diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c > index fc49be622e05..38d671d5e10c 100644 > --- a/block/blk-cgroup.c > +++ b/block/blk-cgroup.c > @@ -1553,6 +1553,12 @@ int blkcg_activate_policy(struct gendisk *disk, const struct blkcg_policy *pol) > pd->online = false; > } > > + if (system_state == SYSTEM_RUNNING) { > + spin_unlock_irq(&q->queue_lock); > + ssleep(1); > + spin_lock_irq(&q->queue_lock); > + } > + > /* all allocated, init in the same order */ > if (pol->pd_init_fn) > list_for_each_entry_reverse(blkg, &q->blkg_list, q_node) Tüm pd'lerin birlikte tahsis edilmesi, başlatılması ve çevrimiçi hale getirilmesi için bir neden görülmemektedir. Tek sıralama gereksinimi, üst blkg'lerin alt blkg'lerden önce başlatılması ve çevrimiçi hale getirilmesidir ki bu durum gezilme sırası ile garanti altına alınmıştır. Hata; her blkg için pd'nin ayrı ayrı tahsis edilip başlatılarak çevrimiçi hale getirilmesi ve başlatma ile çevrimiçi hale getirme işlemleri boyunca blkcg->lock kilidinin tutulmasıyla düzeltilmiştir. Bu sayede yüklü bir blkg'nin her zaman tamamen başlatılmış ve çevrimiçi olduğu garanti edilerek yarış penceresi ortadan kaldırılmıştır.
Nasıl düzeltilir
- Linux Linuxda6cc648c1f570290af1ddbe6b7ca3d91b1d6db9, 33f0370bb7ce15a59d72a4d8a05421d334a04add, e39ef7880d1057b2ebcdb013405f4d84a257db23, 7d63c6f9765339dcfc34b7365ced7c518012e4fe, ec14a87ee1999b19d8b7ed0fa95fea80644624ae ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| Linux Linux | 9d179b865449b351ad5cb76dbea480c9170d4a27 ≤ v < da6cc648c1f570290af1ddbe6b7ca3d91b1d6db9, 9d179b865449b351ad5cb76dbea480c9170d4a27 ≤ v < 33f0370bb7ce15a59d72a4d8a05421d334a04add, 9d179b865449b351ad5cb76dbea480c9170d4a27 ≤ v < e39ef7880d1057b2ebcdb013405f4d84a257db23, 9d179b865449b351ad5cb76dbea480c9170d4a27 ≤ v < 7d63c6f9765339dcfc34b7365ced7c518012e4fe, 9d179b865449b351ad5cb76dbea480c9170d4a27 ≤ v < ec14a87ee1999b19d8b7ed0fa95fea80644624ae, 5.4 | da6cc648c1f570290af1ddbe6b7ca3d91b1d6db9, 33f0370bb7ce15a59d72a4d8a05421d334a04add, e39ef7880d1057b2ebcdb013405f4d84a257db23, 7d63c6f9765339dcfc34b7365ced7c518012e4fe, ec14a87ee1999b19d8b7ed0fa95fea80644624ae |
Sürümünüzü kontrol edin
Ürünü seçin ve kullandığınız sürümü yazın; sürümün etkilenen aralıkta olup olmadığını görün.
Attack Surface Management
Alan adlarınıza bağlı varlıkları, bu varlıklarda çalışan teknolojileri ve bilinen zafiyetleri tek listede görün.