CVE-2026-89762
Təsvir
Linux nüvəsində aşağıdakı zəiflik aradan qaldırılıb: apparmor: begin_current_label_crit_section() tərəfindən törədilən cred UAF xətası düzəldildi AppArmor-un begin_current_label_crit_section() funksiyası bir çox LSM hook-larından (xüsusilə VFS/socket ilə əlaqəli olanlardan) çağırılan və cari creds tərəfindən istinad edilən etiketinin FLAG_STALE olub-olmadığını yoxlayan kritik bir funksiyadır; əgər belədirsə, aa_replace_current_label() vasitəsilə creds-i yeni etiketdən istifadə edən yenilənmiş versiya ilə əvəz etməyə çalışır. Bununla bağlı birinci problem budur ki, əgər nüvədə hər hansı bir element cari creds üçün göstəricini götürərsə və creds-i əvəzləyən təhlükəsizlik hook-u çağırışından sonra ona müraciət edərsə, bu, birbaşa `struct cred` obyektinin UAF (use-after-free) xətasına səbəb olar, məsələn: ``` const struct cred *cred = current_cred(); alloc_file_pseudo(...); uid_t uid = cred->euid; ``` Nüvədə bunu həqiqətən edən bir şeyin olub-olmadığını bilmirəm, lakin bu modelin UAF-a səbəb ola bilməsi çox təəccüblüdür. İkinci problem isə aa_replace_current_label() funksiyasının override edilmiş etibarnamələrlə işlədiyi zaman baş verir. Əgər `current_cred() != current_real_cred()` olarsa (proc_pid_attr_write()-dəki yoxlamanı təkrarlayaraq), aa_replace_current_label() prosesi dayandırır, lakin bu yoxlama override edilmiş etibarnamələri etibarlı şəkildə aşkar edə bilmir, çünki override edilmiş creds obyekti hədəf creds obyekti ilə eyni ola bilər. Beləliklə, təxminən aşağıdakı ssenaridə problemlər yaranır: 1. Tapşırıq <creds A> ilə başlayır (həm hədəf, həm də subyektiv creds kimi), refcount=2 olur. 2. Tapşırıq override üçün <creds A>-ya əlavə istinad götürür. 3. Tapşırıq override_creds(<creds A>) funksiyasını çağırır və bu, köhnə subyektiv creds-ə (<creds A>) göstərici qaytarır. 4. Tapşırıq AppArmor LSM hook-una daxil olur. 5. AppArmor hədəf/subyektiv creds-lərin bərabər olduğunu yoxlayır. 6. AppArmor hər iki cred göstəricisini <creds B> ilə əvəz edir və <creds A>-dan 2 istinadı silir. 7. Tapşırıq AppArmor LSM hook-undan çıxır. 8. Tapşırıq revert_creds(<creds A>) funksiyasını çağırır. 9. İndi task->cred <creds A>, task->real_cred isə <creds B> olur, lakin task_struct məntiqi olaraq <creds B>-yə iki istinad saxlayır. 10. Başqa bir tapşırıq override üçün istifadə olunan <creds A>-ya aid əlavə istinadı silir, refcount 0-a düşür. 11. İndi task->real_cred azad edilmiş (freed) creds-ə işarə edir. Bu nöqtədə current_cred()-ə hər hansı müraciət UAF xətasına səbəb olacaqdır. Məndə belə bir test keysi var: profil istifadə edən bir proses FUSE passthrough faylından tam boruya (pipe) splice() əməliyyatı zamanı bloklandığı halda, həmin profil üzərində aa-disable işə salıram; profil yeniləndikdən sonra boru boşalır, splice() davam edir, etibarnamələr sinxronizasiyadan çıxır və növbəti getuid() sistem çağırışı KASAN UAF xətası ilə nəticələnir. Bunu düzəltmək üçün creds-i birbaşa əvəz etmək əvəzinə, bunu cari sistem çağırışının sonunda icra olunacaq task_work vasitəsilə edin. (Cred əvəzetməsinin baş verdiyi vaxtın düzgünlüyə heç bir təsiri olmamalıdır; bu, sadəcə yeni etiketinin refcount-na lazımsız toxunmamaq üçün performans optimallaşdırmasıdır.) Qeyd edək ki, bu dəyişiklikdən sonra AppArmor hələ də sb_pivotroot LSM hook-unda birbaşa cred əvəzetmələri həyata keçirir və VFS ->write() callback-ləri vasitəsilə proc_pid_attr_write() daxilində birbaşa cred əvəzetmələri hələ də baş verə bilər. aa_dup_task_ctx() ilə bağlı iki seçim var idi: ya bütün aa_task_ctx kopyalandıqdan sonra explicit olaraq new->label_replacement_pending sıfırlansın, ya da üzvlərin manual kopyalanmasına keçilsin. Mən üzvləri manual kopyalamağa keçdim, çünki bu, xətaların daha aşkar görünməsini təmin etməlidir.
Necə düzəltmək olar
Mənbələrdə bu zəiflik üçün düzəldilmiş versiya və ya yamaq keçidi yoxdur.
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| microsoft azl3_kernel_6.6.150.1-1 | Aralıq göstərilməyib | — |
| microsoft azl3_kernel_6.6.152.1-1 | Aralıq göstərilməyib | — |
| microsoft azl3_kernel_6.6.157.1-1 | Aralıq göstərilməyib | — |
| microsoft azl3_kernel_6.6.159.1-1 | Aralıq göstərilməyib | — |
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.