CVE-2024-39488

Orta

Açıklama

Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: arm64: asm-bug: __BUG_ENTRY sonuna .align 2 ekle CONFIG_DEBUG_BUGVERBOSE=n olduğunda, bug_table girişlerine gerekli dolgu baytları (padding bytes) eklenememekte ve sonuç olarak bir hata tablosundaki son giriş görmezden gelinmektedir; bu durum potansiyel olarak beklenmedik bir panic() durumuna yol açabilmektedir. Tablodaki önceki tüm girişler doğru şekilde işlenmektedir. arm64 ABI, 8 bayta kadar olan struct alanlarının doğal olarak hizalanmasını (naturally-aligned) ve diziler içinde uygun şekilde hizalanmaları için struct içine dolgu eklenmesini gerektirir. CONFIG_DEBUG_BUGVERBOSE=y olduğunda, bir bug_entry düzeni şöyledir: struct bug_entry { signed int bug_addr_disp; // 4 bayt signed int file_disp; // 4 bayt unsigned short line; // 2 bayt unsigned short flags; // 2 bayt } ... toplamda 12 bayt olup 4 baytlık hizalama gerektirir. CONFIG_DEBUG_BUGVERBOSE=n olduğunda, bir bug_entry düzeni şöyledir: struct bug_entry { signed int bug_addr_disp; // 4 bayt unsigned short flags; // 2 bayt < örtük dolgu > // 2 bayt } ... toplamda 8 bayt olup, 6 bayt veri ve 2 bayt sondan eklenen dolgu ile 4 baytlık hizalama gerektirir. Assembly dilinde bir bug_entry oluşturduğumuzda, girişin başlangıcını 4 bayta hizalarız; bu işlem önceki girişlerin dolgusunu örtük olarak halleder. Ancak, girişin sonunu hizalamayız ve bu nedenle CONFIG_DEBUG_BUGVERBOSE=n olduğunda, son giriş sondaki dolgu baytlarından yoksun kalır. Ana çekirdek imajı için bu bir sorun değildir çünkü find_bug(), girişleri ararken sondaki dolgu baytlarına bağımlı değildir: for (bug = __start___bug_table; bug < __stop___bug_table; ++bug) if (bugaddr == bug_addr(bug)) return bug; Ancak modüller için module_bug_finalize(), giriş sayısını hesaplarken sondaki baytlara bağımlıdır: mod->num_bugs = sechdrs[i].sh_size / sizeof(struct bug_entry); ...ve son bug_entry gerekli dolgu baytlarından yoksun olduğu için, örneğin tek bir giriş olması durumunda bu giriş sayılmayacaktır: sechdrs[i].sh_size == 6 sizeof(struct bug_entry) == 8; sechdrs[i].sh_size / sizeof(struct bug_entry) == 0; Sonuç olarak module_find_bug(), şu işlemi gerçekleştirdiğinde son bug_entry girişini kaçıracaktır: for (i = 0; i < mod->num_bugs; ++i, ++bug) if (bugaddr == bug_addr(bug)) goto out; ...bu durum, işlenmemiş bir hata nedeniyle kernel panic oluşmasına yol açabilir. Bu durum aşağıdaki modül ile gösterilebilir: static int __init buginit(void) { WARN(1, "hello\n"); return 0; } static void __exit bugexit(void) { } module_init(buginit); module_exit(bugexit); MODULE_LICENSE("GPL"); ...bu modül yüklendiğinde bir kernel panic tetikleyecektir: ------------[ cut here ]------------ hello Unexpected kernel BRK exception at EL1 Internal error: BRK handler: 00000000f2000800 [#1] PREEMPT SMP Modules linked in: hello(O+) CPU: 0 PID: 50 Comm: insmod Tainted: G O 6.9.1 #8 Hardware name: linux,dummy-virt (DT) pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : buginit+0x18/0x1000 [hello] lr : buginit+0x18/0x1000 [hello] sp : ffff800080533ae0 x29: ffff800080533ae0 x28: 0000000000000000 x27: 0000000000000000 x26: ffffaba8c4e70510 x25: ffff800080533c30 x24: ffffaba8c4a28a58 x23: 0000000000000000 x22: 0000000000000000 x21: ffff3947c0eab3c0 x20: ffffaba8c4e3f000 x19: ffffaba846464000 x18: 0000000000000006 x17: 0000000000000000 x16: ffffaba8c2492834 x15: 0720072007200720 x14: 0720072007200720 x13: ffffaba8c49b27c8 x12: 0000000000000312 x11: 0000000000000106 x10: ffffaba8c4a0a7c8 x9 : ffffaba8c49b27c8 x8 : 00000000ffffefff x7 : ffffaba8c4a0a7c8 x6 : 80000000fffff000 x5 : 0000000000000107 x4 : 0000000000000000 x3 : 0000000000000000 x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff3947c0eab3c0 Call trace: buginit+0x18/0x1000 [hello] do_one_initcall+0x80/0x1c8 do_init_module+0x60/0x218 load_module+0x1ba4/0x1d70 __do_sys_init_module+0x198/0x1d0 __arm64_sys_init_module+0x1c/0x28 invoke_syscall+0x48/0x114 el0_svc ---kesildi---

ÖnemOrta
CVSS5.5
İstismar olasılığı—
ÜrünLinux Kernel
Yayın10 Tem 2024
İlk görülme10 Tem 2024

Nasıl düzeltilir

Güncelleyin
  • linux linux_kernel4.19.316, 5.4.278, 5.10.219, 5.15.161, 6.1.93, 6.6.33, 6.9.4 ya da sonraki bir sürüm

Etkilenen ürünler

ÜrünEtkilenen sürümlerDüzeltildiği sürüm
linux linux_kernel4.3 ≤ v < 4.19.316, 4.20 ≤ v < 5.4.278, 5.5 ≤ v < 5.10.219, 5.11 ≤ v < 5.15.161, 5.16 ≤ v < 6.1.93, 6.2 ≤ v < 6.6.33, 6.7 ≤ v < 6.9.44.19.316, 5.4.278, 5.10.219, 5.15.161, 6.1.93, 6.6.33, 6.9.4

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-2024-39488 · Linux Kernel · Dark Radar