CVE-2021-47275

Orta

Açıklama

Linux çekirdeğinde aşağıdaki güvenlik açığı giderilmiştir: bcache: önbellek eksikliği (cache missing) kod yolunda aşırı boyutlu okuma isteğinin önlenmesi Önbelleğe alınmış cihazın önbellek eksikliği kod yolunda, dahili B+ ağacından bir önbellek eksikliği aralığı için uygun bir konum eşleşirse, aşağıdaki kod bloğundaki cache_lookup_fn() içinde cached_dev_cache_miss() fonksiyonu çağrılacaktır: [code block 1] 526 unsigned int sectors = KEY_INODE(k) == s->iop.inode 527 ? min_t(uint64_t, INT_MAX, 528 KEY_START(k) - bio->bi_iter.bi_sector) 529 : INT_MAX; 530 int ret = s->d->cache_miss(b, s, bio, sectors); Buradaki s->d->cache_miss(), cached_dev_cache_miss() olarak başlatılmış geri çağırma fonksiyon işaretçisidir; son parametre olan 'sectors', eksik önbellek verilerinin destekleyici cihazına yönelik okuma isteği boyutunu hesaplamak için önemli bir ipucudur. Yukarıdaki kod bloğundaki mevcut hesaplama, 'sectors' için aşırı boyutlu değerler üretebilir ve bu durum sonuç olarak aşağıda listelenen BUG() veya BUG_ON() aracılığıyla iki farklı potansiyel kernel panic tetikleyebilir: 1) bch_btree_insert_key() içindeki BUG_ON(), [code block 2] 886 BUG_ON(b->ops->is_extents && !KEY_SIZE(k)); 2) biovec_slab() içindeki BUG(), [code block 3] 51 default: 52 BUG(); 53 return NULL; Yukarıdaki tüm panikler, aşırı boyutlu 'sectors' parametresi nedeniyle cached_dev_cache_miss() kaynaklıdır. cached_dev_cache_miss() içinde 'sectors' parametresi, önbellek eksikliği için destekleyici cihazdan okunan veri boyutunu hesaplamak amacıyla kullanılır. Bu boyut, aşağıdaki kod satırları ile s->insert_bio_sectors içine kaydedilir: [code block 4] 909 s->insert_bio_sectors = min(sectors, bio_sectors(bio) + reada); Ardından, dahili B+ ağacına eklenecek gerçek anahtar oluşturulur ve aşağıdaki kod satırları ile s->iop.replace_key içine kaydedilir: [code block 5] 911 s->iop.replace_key = KEY(s->iop.inode, 912 bio->bi_iter.bi_sector + s->insert_bio_sectors, 913 s->insert_bio_sectors); Aşırı boyutlu 'sectors' parametresi, yukarıdaki kod bloğundan gelen BUG_ON() ile panic 1)'i tetikleyebilir. Ve eksik veriler için destekleyici cihaza gönderilen bio, aşağıdaki kod satırları ile s->insert_bio_sectors ipucu kullanılarak tahsis edilir: [code block 6] 926 cache_bio = bio_alloc_bioset(GFP_NOWAIT, 927 DIV_ROUND_UP(s->insert_bio_sectors, PAGE_SECTORS), 928 &dc->disk.bio_split); Aşırı boyutlu 'sectors' parametresi, yukarıdaki kod bloğundan gelen BUG() ile panic 2)'yi tetikleyebilir. Şimdi aşırı boyutlu 'sectors' ile paniklerin nasıl gerçekleştiğini açıklayayım. Kod bloğu 5'te, replace_key KEY() makrosu ile oluşturulur. KEY() makrosunun tanımına göre: [code block 7] 71 #define KEY(inode, offset, size) \ 72 ((struct bkey) { \ 73 .high = (1ULL << 63) | ((__u64) (size) << 20) | (inode), \ 74 .low = (offset) \ 75 }) Burada 'size', struct bkey'in 64 bitlik 'high' üyesine gömülmüş 16 bit genişliğindedir. Ancak kod bloğu 1'de, "KEY_START(k) - bio->bi_iter.bi_sector" ifadesinin (1<<16) - 1'den büyük olma olasılığı yüksektir, bu da kod bloğu 5'teki bkey boyut hesaplamasının taşmasına neden olur. Bir hata raporunda 'sectors' parametresinin değeri 131072 (= 1 << 17) olup, taşan 'sectors' değeri kod bloğu 4'te s->insert_bio_sectors'un taşmasına, ardından kod bloğu 5'te s->iop.replace_key'in boyut alanının 0 olmasına yol açmıştır. Daha sonra 0 boyutlu s->iop.replace_key, normal yazma isteği ile önbellek eksikliği okuma isteği arasındaki yarışı tespit etmek ve önlemek için özel bir anahtar olan önbellek eksikliği kontrol anahtarı olarak dahili B+ ağacına şu şekilde eklenir: [code block 8] 915 ret = bch_btree_insert_check_key(b, &s->op, &s->iop.replace_key); Ardından, 3. parametre olan 0 boyutlu s->iop.replace_key, kod bloğu 2'deki bkey boyut kontrolü BUG_ON()'ını tetikler ve kernel panic 1)'e neden olur.

ÖnemOrta
CVSS5.5
İstismar olasılığı—
ÜrünLinux Kernel
Yayın21 May 2024
İlk görülme21 May 2024

Nasıl düzeltilir

Güncelleyin
  • linux linux_kernel5.12.11 ya da sonraki bir sürüm

Etkilenen ürünler

ÜrünEtkilenen sürümlerDüzeltildiği sürüm
linux linux_kernelv < 5.12.11, 5.135.12.11

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.

Intelligence 360 paketinde

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.