CVE-2022-49961
Açıklama
Linux çekirdeğinde aşağıdaki güvenlik açığı giderilmiştir: bpf: ARG_CONST_ALLOC_SIZE_OR_ZERO için mark_chain_precision çağrısını yap ARG_CONST_* tarzı bir argüman olduğunda hassasiyet işaretçilerinin yayılması gerekir; çünkü doğrulayıcı, bu tür argümanlar dönüş değerini (bu durumda PTR_TO_MEM için mem_size'ı) daralttığında, hassas olmayan skalerleri states_equal kontrolü amacıyla eşdeğer kabul edemez. R0 için elde edilen mem_size sabit değerden türetilir ve eğer doğrulayıcı, bu tür argümanların bulunduğu durumları eşdeğer sayarak (regsafe içinde her iki kaydın da reg->precise değerinin false olduğunu görerek) yanlış şekilde budarsa, o keşfedilen durumda doğru mem_size olması gerekenden daha fazla erişim yapabilen geçersiz programların doğrulayıcıdan geçmesine yol açabiliriz. Sorunun somut bir örneğini göstermek için: 0000000000000000 <prog>: 0: r2 = *(u32 *)(r1 + 80) 1: r1 = *(u32 *)(r1 + 76) 2: r3 = r1 3: r3 += 4 4: if r3 > r2 goto +18 <LBB5_5> 5: w2 = 0 6: *(u32 *)(r1 + 0) = r2 7: r1 = *(u32 *)(r1 + 0) 8: r2 = 1 9: if w1 == 0 goto +1 <LBB5_3> 10: r2 = -1 0000000000000058 <LBB5_3>: 11: r1 = 0 ll 13: r3 = 0 14: call bpf_ringbuf_reserve 15: if r0 == 0 goto +7 <LBB5_5> 16: r1 = r0 17: r1 += 16777215 18: w2 = 0 19: *(u8 *)(r1 + 0) = r2 20: r1 = r0 21: r2 = 0 22: call bpf_ringbuf_submit 00000000000000b8 <LBB5_5>: 23: w0 = 0 24: exit İlk durumda, tek satırlık yürütmenin keşfi, 9. dallanma komutunun ikinci kolu için 14. komutta aramayı budayacaktır; çünkü bu, r2 = -1 (UINT_MAX) kullanılarak önce doğrulanacaktır, oysa 9. komuttaki w1 her zaman 0 olacağından çalışma zamanında bpf_ringbuf_reserve'den UINT_MAX/4'ten büyük olma hatası almayız. Doğrulayıcı regsafe sırasında her iki durumdaki her iki r2 kaydı için de reg->precise değerinin false olduğunu görür, dolayısıyla states_equal amacıyla bunları eşit kabul eder. Geri izleme desteğini kullanarak hassas işaretçileri yaymış olsaydık, hassas işaretlemeyi kullanarak eski r2'nin (UINT_MAX) yeni r2 (1) içinde olduğundan emin olurduk ve bu asla doğru olmazdı, böylece doğrulama haklı olarak başarısız olurdu. Sonuç olarak, bu düzeltme olmadan 19. komuttaki sınır dışı erişime izin verilirdi. reg->precise değerinin, kullanıcının CAP_BPF yetkisi olmadığında (veya alt program sayısı 1'den büyük olduğunda, yani herhangi bir statik veya global fonksiyon kullanıldığında) her zaman true olarak ayarlandığını unutmayın; dolayısıyla bu yalnızca hassasiyet işaretlerinin açıkça yayılması gerektiğinde (yani CAP_BPF yetkisine sahip ayrıcalıklı kullanıcılar için) bir sorundur. Gelecekteki gerilemeleri önlemek için bir sonraki yamaya basitleştirilmiş bir test durumu eklenmiştir.
Nasıl düzeltilir
- linux linux_kernel5.19.8 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 | 5.8 ≤ v < 5.19.8, 6.0 | 5.19.8 |
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.