CVE-2022-48644

Orta

Açıklama

Linux çekirdeğinde aşağıdaki güvenlik açığı giderilmiştir: net/sched: taprio: hiç etkinleştirilmemişken offload'u devre dışı bırakmaktan kaçının Son derece tuhaf bir API tasarım kararıyla, qdisc->destroy() fonksiyonu qdisc->init() hiç başarılı olmamış olsa bile çağrılır; bu yalnızca 87b60cfacf9f ("net_sched: fix error recovery at qdisc creation") commit'inden beri değil, görünüşe göre daha öncesinde de (qdisc_create_dflt() durumunda) böyledir. taprio qdisc, tam offload denediğinde bunu tam olarak kabul etmez; çünkü taprio_init() içinde q->flags = TAPRIO_FLAGS_INVALID ile başlar, ardından q->flags değerini netlink'ten ayrıştırılan TCA_TAPRIO_ATTR_FLAGS ile değiştirir (taprio_init() tarafından tail çağrısıyla çağrılan taprio_change() içinde). Ancak taprio_destroy() içinde taprio_disable_offload() çağrılır ve bu fonksiyon FULL_OFFLOAD_IS_ENABLED(q->flags) temelinde ne yapacağını belirler. Ancak FULL_OFFLOAD_IS_ENABLED() uygulamasına bakıldığında (q->flags içindeki 1. bitin bit düzeyinde kontrolü), q->flags TAPRIO_FLAGS_INVALID içerdiğinde bu makronun çağrılması geçersizdir; çünkü bu değer U32_MAX olarak ayarlanmıştır ve bu nedenle FULL_OFFLOAD_IS_ENABLED() geçersiz bir bayrak kümesinde true döndürür. Sonuç olarak, kullanıcı alanı q->flags = TAPRIO_FLAGS_INVALID ayarlanması ile taprio_enable_offload() çağrılması arasında bir hata zorlarsa çekirdeği çökertmek mümkündür. Bunun nedeni, sürücülerin hiç etkinleştirilmemiş offload'un devre dışı bırakılmasını beklememesidir. Burada zorladığımız hata, taprio'yu kök olmayan bir qdisc olarak, bunun yerine bir mqprio kök qdisc'inin alt öğesi olarak eklemektir: $ tc qdisc add dev swp0 root handle 1: \ mqprio num_tc 8 map 0 1 2 3 4 5 6 7 \ queues 1@0 1@1 1@2 1@3 1@4 1@5 1@6 1@7 hw 0 $ tc qdisc replace dev swp0 parent 1:1 \ taprio num_tc 8 map 0 1 2 3 4 5 6 7 \ queues 1@0 1@1 1@2 1@3 1@4 1@5 1@6 1@7 base-time 0 \ sched-entry S 0x7f 990000 sched-entry S 0x80 100000 \ flags 0x0 clockid CLOCK_TAI Unable to handle kernel paging request at virtual address fffffffffffffff8 [fffffffffffffff8] pgd=0000000000000000, p4d=0000000000000000 Internal error: Oops: 96000004 [#1] PREEMPT SMP Call trace: taprio_dump+0x27c/0x310 vsc9959_port_setup_tc+0x1f4/0x460 felix_port_setup_tc+0x24/0x3c dsa_slave_setup_tc+0x54/0x27c taprio_disable_offload.isra.0+0x58/0xe0 taprio_destroy+0x80/0x104 qdisc_create+0x240/0x470 tc_modify_qdisc+0x1fc/0x6b0 rtnetlink_rcv_msg+0x12c/0x390 netlink_rcv_skb+0x5c/0x130 rtnetlink_rcv+0x1c/0x2c Bunu, gerçekleştirdiğimiz işlemleri takip ederek ve offload'u yalnızca gerçekten yaptıysak geri alarak düzeltin. "int clockid" ile "atomic64_t picos_per_byte" arasındaki 4 baytlık boşluğa "bool offloaded" ekledim. Artık ilk önbellek satırı aşağıdaki gibi görünüyor: $ pahole -C taprio_sched net/sched/sch_taprio.o struct taprio_sched { struct Qdisc * * qdiscs; /* 0 8 */ struct Qdisc * root; /* 8 8 */ u32 flags; /* 16 4 */ enum tk_offsets tk_offset; /* 20 4 */ int clockid; /* 24 4 */ bool offloaded; /* 28 1 */ /* XXX 3 bytes hole, try to pack */ atomic64_t picos_per_byte; /* 32 0 */ /* XXX 8 bytes hole, try to pack */ spinlock_t current_entry_lock; /* 40 0 */ /* XXX 8 bytes hole, try to pack */ struct sched_entry * current_entry; /* 48 8 */ struct sched_gate_list * oper_sched; /* 56 8 */ /* --- cacheline 1 boundary (64 bytes) --- */

ÖnemOrta
CVSS5.5
İstismar olasılığı—
ÜrünLinux Kernel
Yayın28 Nis 2024
İlk görülme28 Nis 2024

Nasıl düzeltilir

Güncelleyin
  • linux linux_kernel5.4.215, 5.10.146, 5.15.71, 5.19.12 ya da sonraki bir sürüm

Etkilenen ürünler

ÜrünEtkilenen sürümlerDüzeltildiği sürüm
linux linux_kernel5.4 ≤ v < 5.4.215, 5.5 ≤ v < 5.10.146, 5.11 ≤ v < 5.15.71, 5.16 ≤ v < 5.19.12, 6.05.4.215, 5.10.146, 5.15.71, 5.19.12

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.

CVE-2022-48644 · Linux Kernel · Dark Radar