CVE-2026-31415
Təsvir
Linux nüvəsində aşağıdakı zəiflik aradan qaldırılmışdır: ipv6: ip6_datagram_send_ctl() funksiyasında daşmaların qarşısının alınması Yiming Qian bildirmişdir ki: IPv6 sendmsg ancillary-data yolunda lokal olaraq tetiklene bilən və `skb_under_panic()` vasitəsilə nüvəni panikaya salan (lokal DoS) bir nüvə xətası tapmışdır. Əsas problem çox sayda `IPV6_DSTOPTS` idarəetmə mesajları (cmsgs) təqdim edildikdə aşağıdakılar arasındakı uyğunsuzluqdur: - 16 bitlik uzunluq akkumulyatoru (`struct ipv6_txoptions::opt_flen`, tipi `__u16`) və - Təqdim edilmiş sonuncu təyinat seçimləri başlığına göstərici (`opt->dst1opt`) - `include/net/ipv6.h`: - `struct ipv6_txoptions::opt_flen` dəyişəni `__u16` tipindədir (daşma mümkündür). (sətirlər 291-307, xüsusilə 298) - `net/ipv6/datagram.c:ip6_datagram_send_ctl()`: - Təkrarlanan `IPV6_DSTOPTS` mesajlarını qəbul edir və dublikatları rədd etmədən `opt_flen`-ə əlavə edir. (sətirlər 909-933) - `net/ipv6/ip6_output.c:__ip6_append_data()`: - Başlıq ölçülərini və boş sahə (headroom) qərarlarını hesablamaq üçün `opt->opt_flen + opt->opt_nflen` ifadəsindən istifadə edir. (sətirlər 1448-1466, xüsusilə 1463-1465) - `net/ipv6/ip6_output.c:__ip6_make_skb()`: - Əgər `opt->opt_flen` sıfırdan fərqlidirsə, `ipv6_push_frag_opts()` funksiyasını çağırır. (sətirlər 1930-1934) - `net/ipv6/exthdrs.c:ipv6_push_frag_opts()` / `ipv6_push_exthdr()`: - İtələmə ölçüsü (push size) göstərilən başlıq əsasında `ipv6_optlen(opt->dst1opt)` funksiyasından gəlir. (sətirlər 1179-1185 və 1206-1211) 1. `opt_flen` 16 bitlik akkumulyatordur: - `include/net/ipv6.h:298` sətirində `__u16 opt_flen; /* after fragment hdr */` kimi təyin edilmişdir. 2. `ip6_datagram_send_ctl()` təkrar `IPV6_DSTOPTS` cmsg-lərini qəbul edir və hər dəfə `opt_flen`-i artırır: - `net/ipv6/datagram.c:909-933` hissəsində `IPV6_DSTOPTS` üçün: - O, `len = ((hdr->hdrlen + 1) << 3);` hesablayır. - `ns_capable(net->user_ns, CAP_NET_RAW)` vasitəsilə `CAP_NET_RAW` imtiyazını yoxlayır. (sətir 922) - Sonra bunları yerinə yetirir: - `opt->opt_flen += len;` (sətir 927) - `opt->dst1opt = hdr;` (sətir 928) Burada dublikatların rədd edilməsi mexanizmi yoxdur (köhnə `IPV6_2292DSTOPTS` yolu ilə müqayisədə, hansı ki `net/ipv6/datagram.c:901-904` sətirlərində dublikatları rədd edirdi). Kifayət qədər böyük `IPV6_DSTOPTS` cmsg-ləri təqdim edildikdə, `dst1opt` hələ də böyük (2048 bayt) təyinat seçimləri başlığına işarə etdiyi halda, `opt_flen` daşır (wrap). Təqdim olunan PoC faylında (`poc.c`): - `hdrlen=255` olan 32 cmsg => `len = (255+1)*8 = 2048` - `hdrlen=0` olan 1 cmsg => `len = 8` - Ümumi artım: `32*2048 + 8 = 65544`, beləliklə `(__u16)opt_flen == 8` olur. - Sonuncu cmsg 2048 baytdır, buna görə də `dst1opt` 2048 baytlıq başlığa işarə edir. 3. Ötürmə yolu daşan `opt_flen` istifadə edərək başlıq ölçülərini təyin edir: - `net/ipv6/ip6_output.c:1463-1465` hissəsində: - `headersize = sizeof(struct ipv6hdr) + (opt ? opt->opt_flen + opt->opt_nflen : 0) + ...;` Daşan `opt_flen` ilə `headersize`/boş sahə qərarları daha sonra itələyəcək məlumatın həcmini olduğundan az qiymətləndirir. 4. Yekun skb qurulduqda, faktiki itələmə uzunluğu `dst1opt`-dən gəlir və daşan `opt_flen` ilə məhdudlaşdırılmır: - `net/ipv6/ip6_output.c:1930-1934` hissəsində: - `if (opt->opt_flen) proto = ipv6_push_frag_opts(skb, opt, proto);` - `net/ipv6/exthdrs.c:1206-1211` hissəsində `ipv6_push_frag_opts()` funksiyası `ipv6_push_exthdr()` vasitəsilə `dst1opt`-ni itələyir. - `net/ipv6/exthdrs.c:1179-1184` hissəsində `ipv6_push_exthdr()` bunu edir: - `skb_push(skb, ipv6_optlen(opt));` - `memcpy(h, opt, ipv6_optlen(opt));` Boş sahənin kifayət etmədiyi hallarda `skb_push()` alt axına (underflow) səbəb olur və `skb_under_panic()` -> `BUG()` funksiyasını tetiklir: - `net/core/skbuff.c:2669-2675` (`skb_push()` funksiyası `skb_under_panic()`-i çağırır) - `net/core/skbuff.c:207-214` (`skb_panic()` funksiyası `BUG()` ilə bitir) - `IPV6_DSTOPTS` cmsg yolu hədəf netns istifadəçi ad sahəsində `CAP_NET_RAW` imtiyazı tələb edir (`ns_capable(net->user_ns, CAP_NET_RAW)`). - Root (və ya `CAP_NET_RAW` imtiyazına malik hər hansı tapşırıq) istifadəçi ad sahələri olmadan bunu tetikleyə bilər. - İmtiyazsız `uid=1000` istifadəçisi, əgər imtiyazsız istifadəçi ad sahələri aktivdirsə və o, adlandırılmış `CAP_NET_RAW` imtiyazını əldə etmək üçün userns+netns yarada bilirsə, bunu tetikleyə bilər (təqdim olunan PoC bunu edir). - Lokal xidmətdən imtina: nüvə BUG/panika (sistemin çökməsi).
Necə düzəltmək olar
- linux linux_kernel5.10.253, 5.15.203, 6.1.168, 6.6.134, 6.12.81, 6.18.22, 6.19.12 və ya daha yeni versiya
- git.kernel.org/stable/c/0bdaf54d3aaddfe8df29371260fa8d4939b4fd6f
- git.kernel.org/stable/c/2dbfb003bbf3fc0e94f07efefab0ebcf83029a2a
- git.kernel.org/stable/c/4082f9984a694829153115d28c956a3534f52f29
- git.kernel.org/stable/c/4e453375561fc60820e6b9d8ebeb6b3ee177d42e
- git.kernel.org/stable/c/5e4ee5dbea134e9257f205e31a96040bed71e83f
- git.kernel.org/stable/c/63fda74885555e6bd1623b5d811feec998740ba4
- git.kernel.org/stable/c/872b74900d5daa37067ac676d9001bb929fc6a2a
- git.kernel.org/stable/c/9ed81d692758dfb9471d7799b24bfa7a08224c31
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| linux linux_kernel | 2.6.14 ≤ v < 5.10.253, 5.11 ≤ v < 5.15.203, 5.16 ≤ v < 6.1.168, 6.2 ≤ v < 6.6.134, 6.7 ≤ v < 6.12.81, 6.13 ≤ v < 6.18.22, 6.19 ≤ v < 6.19.12, 7.0 | 5.10.253, 5.15.203, 6.1.168, 6.6.134, 6.12.81, 6.18.22, 6.19.12 |
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.