CVE-2024-41003

Yüksek

Açıklama

Linux kernel'de aşağıdaki güvenlik açığı giderilmiştir: bpf: fake_reg üzerindeki reg_set_min_max bozulması düzeltildi Juan, buzzer [0]'da bazı değişiklikler yaptıktan ve kapsam odaklı yeni bir fuzzing stratejisi uyguladıktan sonra, problardan birinde şunları fark ettiğini bildirmiştir: [...] 13: (79) r6 = *(u64 *)(r0 +0) ; R0=map_value(ks=4,vs=8) R6_w=scalar() 14: (b7) r0 = 0 ; R0_w=0 15: (b4) w0 = -1 ; R0_w=0xffffffff 16: (74) w0 >>= 1 ; R0_w=0x7fffffff 17: (5c) w6 &= w0 ; R0_w=0x7fffffff R6_w=scalar(smin=smin32=0,smax=umax=umax32=0x7fffffff,var_off=(0x0; 0x7fffffff)) 18: (44) w6 |= 2 ; R6_w=scalar(smin=umin=smin32=umin32=2,smax=umax=umax32=0x7fffffff,var_off=(0x2; 0x7ffffffd)) 19: (56) if w6 != 0x7ffffffd goto pc+1 REG INVARIANTS VIOLATION (true_reg2): range bounds violation u64=[0x7fffffff, 0x7ffffffd] s64=[0x7fffffff, 0x7ffffffd] u32=[0x7fffffff, 0x7ffffffd] s32=[0x7fffffff, 0x7ffffffd] var_off=(0x7fffffff, 0x0) REG INVARIANTS VIOLATION (false_reg1): range bounds violation u64=[0x7fffffff, 0x7ffffffd] s64=[0x7fffffff, 0x7ffffffd] u32=[0x7fffffff, 0x7ffffffd] s32=[0x7fffffff, 0x7ffffffd] var_off=(0x7fffffff, 0x0) REG INVARIANTS VIOLATION (false_reg2): const tnum out of sync with range bounds u64=[0x0, 0xffffffffffffffff] s64=[0x8000000000000000, 0x7fffffffffffffff] u32=[0x0, 0xffffffff] s32=[0x80000000, 0x7fffffff] var_off=(0x7fffffff, 0x0) 19: R6_w=0x7fffffff 20: (95) exit from 19 to 21: R0=0x7fffffff R6=scalar(smin=umin=smin32=umin32=2,smax=umax=smax32=umax32=0x7ffffffe,var_off=(0x2; 0x7ffffffd)) R7=map_ptr(ks=4,vs=8) R9=ctx() R10=fp0 fp-24=map_ptr(ks=4,vs=8) fp-40=mmmmmmmm 21: R0=0x7fffffff R6=scalar(smin=umin=smin32=umin32=2,smax=umax=smax32=umax32=0x7ffffffe,var_off=(0x2; 0x7ffffffd)) R7=map_ptr(ks=4,vs=8) R9=ctx() R10=fp0 fp-24=map_ptr(ks=4,vs=8) fp-40=mmmmmmmm 21: (14) w6 -= 2147483632 ; R6_w=scalar(smin=umin=umin32=2,smax=umax=0xffffffff,smin32=0x80000012,smax32=14,var_off=(0x2; 0xfffffffd)) 22: (76) if w6 s>= 0xe goto pc+1 ; R6_w=scalar(smin=umin=umin32=2,smax=umax=0xffffffff,smin32=0x80000012,smax32=13,var_off=(0x2; 0xfffffffd)) 23: (95) exit from 22 to 24: R0=0x7fffffff R6_w=14 R7=map_ptr(ks=4,vs=8) R9=ctx() R10=fp0 fp-24=map_ptr(ks=4,vs=8) fp-40=mmmmmmmm 24: R0=0x7fffffff R6_w=14 R7=map_ptr(ks=4,vs=8) R9=ctx() R10=fp0 fp-24=map_ptr(ks=4,vs=8) fp-40=mmmmmmmm 24: (14) w6 -= 14 ; R6_w=0 [...] Burada görülen durum, 19. satırdaki bir yazmaç değişmez ihlalidir (register invariant violation). 18. satırdaki ikili veya (binary-or) işleminden sonra, doğrulayıcı (verifier) 2. bitin ayarlı olduğunu bilir ancak harita değerinden yüklenen içeriğin geri kalanı hakkında hiçbir bilgiye sahip değildir; yani aralık [2, 0x7fffffff] olup var_off=(0x2; 0x7ffffffd)'dir. Doğrulayıcı 19. satırda dalı analiz ederken, reg_set_min_max() içindeki yazmaç durumlarını doğru dalın yazmaçlarına (true_reg1, true_reg2) ve yanlış dalın yazmaçlarına (false_reg1, false_reg2) ayırır. Test w6 != 0x7ffffffd olduğu için src_reg bilinen bir sabittir. Dahili olarak doğrulayıcı, 0x7ffffffd değeriyle skaler olarak başlatılmış "sahte" (fake) bir yazmaç oluşturur ve ardından bunu reg_set_min_max()'e iletir. Şu anda, 19. satır için bu programın yanlış dalına girmek matematiksel olarak imkansızdır, ancak doğrulayıcı yine de bunu analiz eder. Bu imkansızdır çünkü önceki 'veya' işlemi nedeniyle r6'nın ikinci biti ayarlanmış olacaktır ve koşuldaki sabit bu bite sahip değildir (hex(fd) == binary(1111 1101)). Doğrulayıcı ilk olarak yanlış / geçiş (fall-through) dalını analiz ettiğinde, r6'nın var_off'u ile sabitin var_off'u arasında bir kesişim hesaplayacaktır. Bunun nedeni, doğrulayıcının sabitin değeriyle başlatılmış "sahte" bir yazmaç oluşturmasıdır. Kesişim sonucu daha sonra regs_refine_cond_op() içinde her iki yazmacı da rafine eder: [...] t = tnum_intersect(tnum_subreg(reg1->var_off), tnum_subreg(reg2->var_off)); reg1->var_o ---kesilmiş---

ÖnemYüksek
CVSS7.8
İstismar olasılığı—
ÜrünLinux Kernel
Yayın12 Tem 2024
İlk görülme12 Tem 2024

Nasıl düzeltilir

Güncelleyin
  • linux linux_kernel6.9.7 ya da sonraki bir sürüm

Etkilenen ürünler

ÜrünEtkilenen sürümlerDüzeltildiği sürüm
linux linux_kernel6.8 ≤ v < 6.9.7, 6.106.9.7

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.