Linux Netfilter çekirdek alt sistemindeki güvenlik açığı

Ağ paketlerini filtrelemek ve değiştirmek için kullanılan Linux çekirdeğinin bir alt sistemi olan Netfilter'da, yerel bir kullanıcının yalıtılmış bir kaptayken de dahil olmak üzere sistemde kök ayrıcalıkları kazanmasına olanak tanıyan bir güvenlik açığı (CVE-2021-22555) belirlendi. KASLR, SMAP ve SMEP koruma mekanizmalarını atlayan bir istismarın çalışan bir prototipi test için hazırlandı. Güvenlik açığını keşfeden araştırmacı, bir kCTF kümesindeki Kubernetes konteynerlerinin izolasyonunu atlayacak bir yöntem belirlediği için Google'dan 20 ABD doları ödül aldı.

Sorun, 2.6.19 yıl önce yayımlanan çekirdek 15'dan bu yana mevcut ve IPT_SO_SET_REPLACE ve IP6T_SO_SET_REPLACE işleyicilerindeki, uyumluluk modunda biretsockopt çağrısı yoluyla özel olarak biçimlendirilmiş parametreler gönderilirken arabellek taşmasına neden olan bir hatadan kaynaklanıyor. Normal koşullar altında, yalnızca kök kullanıcı compat_setsockopt()'a çağrı yapabilir, ancak saldırıyı gerçekleştirmek için gereken ayrıcalıklar, kullanıcı ad alanları desteğinin etkin olduğu sistemlerde ayrıcalığı olmayan bir kullanıcı tarafından da elde edilebilir.

Bir kullanıcı, ayrı bir kök kullanıcıya sahip bir kapsayıcı oluşturabilir ve güvenlik açığından buradan yararlanabilir. Örneğin, "kullanıcı ad alanları" Ubuntu ve Fedora'da varsayılan olarak etkindir ancak Debian ve RHEL'de etkin değildir. Güvenlik açığını gideren yama 13 Nisan'da Linux çekirdeğine uyarlandı. Paket güncellemeleri zaten Debian, Arch Linux ve Fedora projeleri tarafından oluşturuldu. Ubuntu, RHEL ve SUSE'de güncellemeler hazırlık aşamasındadır.

Sorun, xt_compat_target_from_user() işlevinde, 32 bit gösterimden 64 bit gösterime dönüştürme sonrasında çekirdek yapılarını kaydederken bellek boyutunun yanlış hesaplanması nedeniyle ortaya çıkıyor. Hata, dört boş baytın, 0x4C uzaklığıyla sınırlanan tahsis edilmiş arabelleğin ötesindeki herhangi bir konuma yazılmasına izin veriyor. Bu özelliğin, kişinin kök hakları kazanmasına izin veren bir istismar oluşturmak için yeterli olduğu ortaya çıktı - msg_msg yapısındaki m_list->sonraki işaretçiyi temizleyerek, hafızayı boşalttıktan sonra verilere erişim için koşullar yaratıldı (boşluktan sonra kullan); daha sonra msgsnd() sistem çağrısının manipülasyonu yoluyla adresler ve diğer yapılardaki değişiklikler hakkında bilgi elde etmek için kullanıldı.

Kaynak: opennet.ru

Yorum ekle