CVE-2026-89762
Açıklama
Linux çekirdeğinde aşağıdaki güvenlik açığı giderilmiştir: apparmor: begin_current_label_crit_section() kaynaklı cred serbest bırakıldıktan sonra kullanım (UAF) hatası düzeltildi AppArmor'un birçok LSM kancasından (özellikle VFS/socket ile ilgili olanlardan) çağrılan begin_current_label_crit_section() fonksiyonu, mevcut creds tarafından referans verilen etiketin FLAG_STALE olarak işaretlenip işaretlenmediğini kontrol eder ve eğer öyleyse, creds yapısını yeni bir etiket kullanan güncellenmiş bir sürümle değiştirmek için aa_replace_current_label() fonksiyonunu kullanmaya çalışır. Bununla ilgili ilk sorun, çekirdek içindeki herhangi bir bileşenin mevcut creds için bir işaretçi alması ve bu işaretçiye, creds yapısını değiştiren bir güvenlik kancası çağrısından sonra erişmesi durumunda doğrudan `struct cred` üzerinde UAF oluşacak olmasıdır: ``` const struct cred *cred = current_cred(); alloc_file_pseudo(...); uid_t uid = cred->euid; ``` Çekirdekte bunu yapan bir yapı olup olmadığını bilmiyorum ancak bu desenin UAF'ye yol açabilmesinin şaşırtıcı olduğunu düşünüyorum. İkinci sorun ise aa_replace_current_label() fonksiyonunun geçersiz kılınmış (overridden) kimlik bilgileriyle çalışırken hataların meydana gelmesidir. aa_replace_current_label(), `current_cred() != current_real_cred()` durumunda işlemi durdurur (proc_pid_attr_write() içerisindeki kontrolü yansıtır), ancak bu kontrol geçersiz kılınmış kimlik bilgilerini güvenilir bir şekilde tespit edemez çünkü geçersiz kılınan creds, hedef creds ile aynı olabilir. Yaklaşık olarak şu senaryoda işler ters gitmektedir: 1. Görev, hem hedef hem de öznel creds olarak refcount=2 ile <creds A> ile başlar. 2. Görev, geçersiz kılma işlemi için <creds A> üzerinde ek bir referans alır. 3. Görev, eski öznel creds'e (<creds A>) bir işaretçi döndüren override_creds(<creds A>) fonksiyonunu çağırır. 4. Görev AppArmor LSM kancasına girer. 5. AppArmor, hedef/öznel creds değerlerinin eşit olduğunu kontrol eder. 6. AppArmor her iki cred işaretçisini de <creds B> ile değiştirir ve <creds A> üzerindeki 2 referansı düşürür. 7. Görev AppArmor LSM kancasından çıkar. 8. Görev revert_creds(<creds A>) fonksiyonunu çağırır. 9. Artık task->cred değeri <creds A> iken task->real_cred değeri <creds B>'dir, ancak task_struct mantıksal olarak <creds B> için iki referans tutmaktadır. 10. Başka bir görev, geçersiz kılma için kullanılan <creds A> üzerindeki ek referansı düşürür, refcount 0'a iner. 11. Artık task->real_cred serbest bırakılmış creds yapısına işaret etmektedir. Bu noktada, current_cred()'e yapılan herhangi bir erişim UAF olacaktır. Bir profil kullanan işlemin, bir FUSE passthrough dosyasından tam bir boruya (pipe) splice() işlemi sırasında engellendiği sırada, o profil üzerinde aa-disable komutunu çalıştırdığım bir test durumum var; profil güncellemesinden sonra boru boşalır, splice() devam eder, kimlik bilgileri senkronizasyon dışı kalır ve ardından gelen bir getuid() sistem çağrısı KASAN UAF hatasıyla sonuçlanır. Bunu düzeltmek için, creds yapısını doğrudan değiştirmek yerine, bunu mevcut sistem çağrısının sonunda çalışacak olan task_work aracılığıyla gerçekleştirin. (Cred değişiminin gerçekleştiği zaman noktasının doğruluk üzerinde hiçbir etkisi olmamalıdır; bu sadece yeni etiketin refcount değerine gereksiz yere dokunmaktan kaçınmak için yapılan bir performans optimizasyonudur.) Bu değişiklikten sonra AppArmor'un sb_pivotroot LSM kancasında hala doğrudan cred değişimleri gerçekleştirdiğine ve VFS ->write() geri çağırmalarında proc_pid_attr_write() aracılığıyla hala doğrudan cred değişimlerinin gerçekleşebileceğine dikkat edin. aa_dup_task_ctx() ile ne yapılacağı konusunda iki seçenek vardır: Ya tüm aa_task_ctx kopyalandıktan sonra new->label_replacement_pending açıkça sıfırlanmalı ya da üyelerin manuel olarak kopyalanmasına geçilmelidir. Hataları daha belirgin hale getireceği için üyeleri manuel olarak kopyalamaya geçiyorum.
Nasıl düzeltilir
Kaynaklarda bu zafiyet için düzeltilmiş sürüm ya da yama bağlantısı yok.
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| microsoft azl3_kernel_6.6.150.1-1 | Aralık belirtilmemiş | — |
| microsoft azl3_kernel_6.6.152.1-1 | Aralık belirtilmemiş | — |
| microsoft azl3_kernel_6.6.157.1-1 | Aralık belirtilmemiş | — |
| microsoft azl3_kernel_6.6.159.1-1 | Aralık belirtilmemiş | — |
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.
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.