CVE-2023-54090
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılmışdır: ixgbe: 64-dən çox CPU olan sistemlərdə XDP_TX zamanı baş verən panic xətasının düzəldilməsi 4fe815850bdc nömrəli commit ("ixgbe: let the xdpdrv work with more than 64 cpus"), XDP TX halqalarını kilidləyərək və onları cpu % 64 (IXGBE_MAX_XDP_QS) düsturu ilə indeksləyərək, XDP proqramlarının 64-dən çox CPU-lu sistemlərdə işləməsini təmin edən dəstəyi əlavə edir. Bu yamanın 64-dən çox nüvəli sistemdə sınaqdan keçirilməsi zamanı, ixgbe.h faylındakı ixgbe_determine_xdp_ring funksiyasının geri dönüşündə massiv indeksinin hüdudlarından kənara çıxması (array-index-out-of-bounds) səbəbindən kernel panic baş vermişdir. Bu o deməkdir ki, ixgbe_determine_xdp_q_idx funksiyası cpu % IXGBE_MAX_XDP_QS əvəzinə sadəcə cpu dəyərini qaytarırdı. Nümunə splat: ========================================================================== UBSAN: array-index-out-of-bounds in /var/lib/dkms/ixgbe/5.18.6+focal-1/build/src/ixgbe.h:1147:26 index 65 is out of range for type 'ixgbe_ring *[64]' ========================================================================== BUG: kernel NULL pointer dereference, address: 0000000000000058 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 0 P4D 0 Oops: 0000 [#1] SMP NOPTI CPU: 65 PID: 408 Comm: ksoftirqd/65 Tainted: G IOE 5.15.0-48-generic #54~20.04.1-Ubuntu Hardware name: Dell Inc. PowerEdge R640/0W23H8, BIOS 2.5.4 01/13/2020 RIP: 0010:ixgbe_xmit_xdp_ring+0x1b/0x1c0 [ixgbe] Code: 3b 52 d4 cf e9 42 f2 ff ff 66 0f 1f 44 00 00 0f 1f 44 00 00 55 b9 00 00 00 00 48 89 e5 41 57 41 56 41 55 41 54 53 48 83 ec 08 <44> 0f b7 47 58 0f b7 47 5a 0f b7 57 54 44 0f b7 76 08 66 41 39 c0 RSP: 0018:ffffbc3fcd88fcb0 EFLAGS: 00010282 RAX: ffff92a253260980 RBX: ffffbc3fe68b00a0 RCX: 0000000000000000 RDX: ffff928b5f659000 RSI: ffff928b5f659000 RDI: 0000000000000000 RBP: ffffbc3fcd88fce0 R08: ffff92b9dfc20580 R09: 0000000000000001 R10: 3d3d3d3d3d3d3d3d R11: 3d3d3d3d3d3d3d3d R12: 0000000000000000 R13: ffff928b2f0fa8c0 R14: ffff928b9be20050 R15: 000000000000003c FS: 0000000000000000(0000) GS:ffff92b9dfc00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000058 CR3: 000000011dd6a002 CR4: 00000000007706e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 PKRU: 55555554 Call Trace: <TASK> ixgbe_poll+0x103e/0x1280 [ixgbe] ? sched_clock_cpu+0x12/0xe0 __napi_poll+0x30/0x160 net_rx_action+0x11c/0x270 __do_softirq+0xda/0x2ee run_ksoftirqd+0x2f/0x50 smpboot_thread_fn+0xb7/0x150 ? sort_range+0x30/0x30 kthread+0x127/0x150 ? set_kthread_struct+0x50/0x50 ret_from_fork+0x1f/0x30 </TASK> Hadisənin belə baş verdiyi düşünülür: 64-dən çox CPU-lu sistemdə ilk XDP proqramı yükləndikdə, ixgbe_xdp_setup funksiyasında ixgbe_xdp_locking_key artırılır. Lakin bundan dərhal sonra halqalar ixgbe_setup_tc tərəfindən yenidən konfiqurasiya edilir. ixgbe_setup_tc funksiyası ixgbe_clear_interrupt_scheme-i çağırır, o isə ixgbe_free_q_vectors-u, o isə dövr daxilində ixgbe_free_q_vector-u çağırır. ixgbe_free_q_vector funksiyası sıfırdan fərqli olduqda, hər çağırışda ixgbe_xdp_locking_key dəyərini azaldır. ixgbe_free_q_vector-dakı azaltma əməliyyatı şərhə alındıqda sistemdəki panic xətası dayandı. Orijinal yamanın işləməsi üçün, ixgbe_setup_tc yalnız XDP və qeyri-XDP halqa konfiqurasiyaları arasında keçid zamanı çağırıldığı üçün, ixgbe_xdp_locking_key-i yenidən 0-dan yuxarı çatdırmaq məqsədilə bir XDP proqramını yükləmək və sonra onu əvəz etmək lazım gələcəkdi, halbuki ixgbe_xdp_locking_key hər dəfə ixgbe_xdp_setup çağırılanda artırılır. Həmçinin, ixgbe_setup_tc funksiyası ethtool --set-channels vasitəsilə çağırıla bilər, bu da 64-dən çox CPU-lu sistemlərdə ixgbe_xdp_locking_key-in 0-a endirilməsi üçün alternativ yol yaradır. ixgbe_xdp_locking_key yalnız XDP_TX yolunu qoruduğu və mövcud CPU sayına bağlı olduğu üçün, XDP proqramı yüklənmədikdə onu deaktiv etmək üçün heç bir səbəb yoxdur. Qarışıqlığın qarşısını almaq üçün ixgbe_xdp_locking_key-in aktivləşdirilməsi probe yolunun bir hissəsi olan ixgbe_sw_init funksiyasına köçürülmüşdür.
Necə düzəltmək olar
- Linux Linux1924450175349e64f8dfc3689efcb653dba0418e, 785b2b5b47b1aa4c31862948b312ea845401c5ec, 4cd43a19900d0b98c1ec4bb6984763369d2e19ec, c23ae5091a8b3e50fe755257df020907e7c029bb və ya daha yeni versiya
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| Linux Linux | 4fe815850bdc8d4cc94e06fe1de069424a895826 ≤ v < 1924450175349e64f8dfc3689efcb653dba0418e, 4fe815850bdc8d4cc94e06fe1de069424a895826 ≤ v < 785b2b5b47b1aa4c31862948b312ea845401c5ec, 4fe815850bdc8d4cc94e06fe1de069424a895826 ≤ v < 4cd43a19900d0b98c1ec4bb6984763369d2e19ec, 4fe815850bdc8d4cc94e06fe1de069424a895826 ≤ v < c23ae5091a8b3e50fe755257df020907e7c029bb, 5.16 | 1924450175349e64f8dfc3689efcb653dba0418e, 785b2b5b47b1aa4c31862948b312ea845401c5ec, 4cd43a19900d0b98c1ec4bb6984763369d2e19ec, c23ae5091a8b3e50fe755257df020907e7c029bb |
Versiyanızı yoxlayın
Məhsulu seçin və istifadə etdiyiniz versiyanı yazın; versiyanın təsirlənən aralıqda olub-olmadığını görün.
Attack Surface Management
Domenlərinizə bağlı aktivləri, onlarda işləyən texnologiyaları və məlum zəiflikləri bir siyahıda görün.