CVE-2025-38166
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılmışdır: bpf: sockmap ilə ktls panic probleminin həlli [ 2172.936997] ------------[ cut here ]------------ [ 2172.936999] kernel BUG at lib/iov_iter.c:629! ...... [ 2172.944996] PKRU: 55555554 [ 2172.945155] Call Trace: [ 2172.945299] <TASK> [ 2172.945428] ? die+0x36/0x90 [ 2172.945601] ? do_trap+0xdd/0x100 [ 2172.945795] ? iov_iter_revert+0x178/0x180 [ 2172.946031] ? iov_iter_revert+0x178/0x180 [ 2172.946267] ? do_error_trap+0x7d/0x110 [ 2172.946499] ? iov_iter_revert+0x178/0x180 [ 2172.946736] ? exc_invalid_op+0x50/0x70 [ 2172.946961] ? iov_iter_revert+0x178/0x180 [ 2172.947197] ? asm_exc_invalid_op+0x1a/0x20 [ 2172.947446] ? iov_iter_revert+0x178/0x180 [ 2172.947683] ? iov_iter_revert+0x5c/0x180 [ 2172.947913] tls_sw_sendmsg_locked.isra.0+0x794/0x840 [ 2172.948206] tls_sw_sendmsg+0x52/0x80 [ 2172.948420] ? inet_sendmsg+0x1f/0x70 [ 2172.948634] __sys_sendto+0x1cd/0x200 [ 2172.948848] ? find_held_lock+0x2b/0x80 [ 2172.949072] ? syscall_trace_enter+0x140/0x270 [ 2172.949330] ? __lock_release.isra.0+0x5e/0x170 [ 2172.949595] ? find_held_lock+0x2b/0x80 [ 2172.949817] ? syscall_trace_enter+0x140/0x270 [ 2172.950211] ? lockdep_hardirqs_on_prepare+0xda/0x190 [ 2172.950632] ? ktime_get_coarse_real_ts64+0xc2/0xd0 [ 2172.951036] __x64_sys_sendto+0x24/0x30 [ 2172.951382] do_syscall_64+0x90/0x170 ...... bpf_exec_tx_verdict() çağırıldıqdan sonra, məsələn, BPF proqramı bpf_msg_push_data() funksiyasını icra etdikdə, msg_pl->sg ölçüsü arta bilər. Əgər BPF proqramı cork_bytes təyin edirsə və sg.size cork_bytes-dan kiçikdirsə, o, -ENOSPC qaytaracaq və sıfırdan fərqli kopya (non-zero copy) məntiqinə geri qayıtmağa çalışacaq. Lakin geri qaytarılma zamanı msg->msg_iter sıfırlanır, lakin msg_pl->sg.size artdığı üçün sonrakı icralar msg_iter-in faktiki ölçüsünü aşacaqdır. ''' iov_iter_revert(&msg->msg_iter, msg_pl->sg.size - orig_size); ''' Bu commit-dəki dəyişikliklər aşağıdakı mülahizələrə əsaslanır: 1. cork_bytes təyin edildikdə, sıfırdan fərqli kopya məntiqinə geri qayıtmaq mənasızdır və birbaşa sıfır-kopya (zero-copy) məntiqinə keçmək olar. 2. msg_iter-i geri qaytarmaq üçün düzgün bayt sayını hesablamaq mümkün deyil. Fərz edin ki, orijinal məlumat "abcdefgh" (8 bayt)-dır və BPF proqramı tərəfindən 3 push əməliyyatından sonra o, 11 baytlıq məlumata çevrilir: "abc?de?fgh?". Sonra biz cork_bytes-ı 6 olaraq təyin edirik, bu o deməkdir ki, ilk 6 bayt emal edilmişdir və qalan 5 bayt "?fgh?" uzunluq cork_bytes tələbinə cavab verənə qədər keşlənəcək. Lakin, "?fgh?" daxilindəki bəzi məlumatlar 'sg->msg_iter' daxilində deyil (əvəzində msg_pl-dədir), xüsusilə bizim push etdiyimiz "?" məlumatları. Beləliklə, bunu sadəcə msg_iter-in ofseti vasitəsilə geri qaytarmaq kifayət etmir. 3. tcp_bpf_sendmsg-də TLS olmayan soketlər üçün "cork" vəziyyəti baş verdikdə, istifadəçi sahəsindəki send() xəta qaytarmır və qaytarılan uzunluq, bəzi məlumatlar keşlənmiş olsa belə, giriş uzunluq parametri ilə eyni olur. Əlavə olaraq gördüm ki, corking-in idarə edilməsi üçün mövcud sıfırdan fərqli kopya məntiqi belə yazılıb: ''' line 1177 else if (ret != -EAGAIN) { if (ret == -ENOSPC) ret = 0; goto send_end; ''' Beləliklə, "cork" vəziyyəti baş verdikdə xəta olmadan sadəcə 'copied' dəyərini qaytarmaq mümkündür.
Necə düzəltmək olar
- linux linux_kernel6.1.142, 6.6.94, 6.12.34, 6.15.3 və ya daha yeni versiya
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| linux linux_kernel | 4.20 ≤ v < 6.1.142, 6.2 ≤ v < 6.6.94, 6.7 ≤ v < 6.12.34, 6.13 ≤ v < 6.15.3 | 6.1.142, 6.6.94, 6.12.34, 6.15.3 |
| debian debian_linux | 11.0 | — |
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.