CVE-2022-49394
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: blk-iolatency: Çevrimdışı durumdaki inflight sayım dengesizlikleri ve IO donmaları düzeltildi iolatency, cgroup başına düşen inflight IO sayısını takip etmelidir. Bu takip maliyetli olabildiği için, hiçbir cgroup cihaz için iolatency yapılandırmasına sahip olmadığında devre dışı bırakılır. Inflight sayaçlarının dengeli kalmasını sağlamak amacıyla iolatency_set_limit(), etkinleştirilmiş sayacı manipüle ederken request_queue yapısını dondurur; bu da hiçbir IO'nun yolda olmadığını ve dolayısıyla tüm sayaçların sıfır olduğunu garanti eder. Maalesef, etkinleştirilmiş sayacın manipüle edildiği tek yer iolatency_set_limit() değildir. iolatency_pd_offline() fonksiyonu da sayacı azaltabilir ve devre dışı bırakmayı tetikleyebilir. Bu devre dışı bırakma işlemi kuyruğu dondurmadan gerçekleştiği için, bazı IO'lar inflight durumundayken kolayca meydana gelebilir ve böylece sayımların sızmasına neden olabilir. Bu durum, diğer cgroup'larda IO'lar inflight durumundayken boş bir cgroup üzerinde iolatency özelliğini açıp ardından cgroup'u kaldırarak kolayca gösterilebilir. Cgroup'un kaldırılmasının iolatency'yi tüm cihaz için devre dışı bıraktığından emin olmak için sistemin başka hiçbir yerinde iolatency'nin etkinleştirilmemiş olması gerekir. Aşağıdaki işlem sda üzerinde iolatency özelliğini sürekli olarak açıp kapatmaktadır: echo +io > /sys/fs/cgroup/cgroup.subtree_control while true; do mkdir -p /sys/fs/cgroup/test echo '8:0 target=100000' > /sys/fs/cgroup/test/io.latency sleep 1 rmdir /sys/fs/cgroup/test sleep 1 done ve aynı anda doğrudan rastgele okumalar gerçekleştiren bir fio çalışmaktadır: fio --name test --filename=/dev/sda --direct=1 --rw=randread \ --runtime=600 --time_based --iodepth=256 --numjobs=4 --bs=4k bu sırada şu drgn betiği ile izleme yapılmaktadır: while True: for css in css_for_each_descendant_pre(prog['blkcg_root'].css.address_of_()): for pos in hlist_for_each(container_of(css, 'struct blkcg', 'css').blkg_list): blkg = container_of(pos, 'struct blkcg_gq', 'blkcg_node') pd = blkg.pd[prog['blkcg_policy_iolatency'].plid] if pd.value_() == 0: continue iolat = container_of(pd, 'struct iolatency_grp', 'pd') inflight = iolat.rq_wait.inflight.counter.value_() if inflight: print(f'inflight={inflight} {disk_name(blkg.q.disk).decode("utf-8")} ' f'{cgroup_path(css.cgroup).decode("utf-8")}') time.sleep(1) İzleme çıktısı şu şekildedir: inflight=1 sda /user.slice inflight=1 sda /user.slice ... inflight=14 sda /user.slice inflight=13 sda /user.slice inflight=17 sda /user.slice inflight=15 sda /user.slice inflight=18 sda /user.slice inflight=17 sda /user.slice inflight=20 sda /user.slice inflight=19 sda /user.slice <- fio durduruldu, inflight 19'da takılı kaldı inflight=19 sda /user.slice inflight=19 sda /user.slice Takılmış inflight değerine sahip bir cgroup kısıtlamaya (throttle) maruz kalırsa, onu uyandıracak bir tamamlanma olayı olmayacağı için kısıtlanan IO'lar asla yayınlanmayacak ve bu da süresiz bir donmaya yol açacaktır. Bu yama, hem iolatency_set_limit() hem de iolatency_pd_offline() yollarından çağrılan iolatency_set_min_lat_nsec() tarafından otomatik olarak başlatılan bir iş öğesinde (work item) etkinleştirme yönetimini birleştirerek hatayı düzeltmektedir. iolatency_pd_offline() spinlock altında çağrıldığından ve bir request_queue'yu dondurmak uyutulabilir (sleepable) bir bağlam gerektirdiğinden, işlemin bir iş öğesine aktarılması gereklidir. Bu değişiklik ayrıca yorumlar hariç satır sayısını azaltarak kodu basitleştirir ve bir cgroup'un gecikme hedefi yeni ayarlandığında veya temizlendiğinde meydana gelen gereksiz dondurmaları önler.
Nasıl düzeltilir
- linux linux_kernel4.19.247, 5.0, 5.4.198, 5.10.121, 5.15.46, 5.17.14, 5.18.3 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| linux linux_kernel | 4.19.29 ≤ v < 4.19.247, 4.20.16 ≤ v < 5.0, 5.0.1 ≤ v < 5.4.198, 5.5 ≤ v < 5.10.121, 5.11 ≤ v < 5.15.46, 5.16 ≤ v < 5.17.14, 5.18 ≤ v < 5.18.3, 5.0 | 4.19.247, 5.0, 5.4.198, 5.10.121, 5.15.46, 5.17.14, 5.18.3 |
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.