Linux nüvəsində kök zəifliyi və systemd-də xidmətdən imtina

Qualys-dən olan təhlükəsizlik tədqiqatçıları Linux nüvəsinə və sistem menecerinə təsir edən iki zəifliyin təfərrüatlarını açıqlayıblar. Nüvədəki boşluq (CVE-2021-33909) yerli istifadəçiyə yüksək yuvalanmış kataloqların manipulyasiyası yolu ilə kök hüquqları ilə kodun icrasına nail olmağa imkan verir.

Zəifliyin təhlükəsi tədqiqatçıların defolt konfiqurasiyada Ubuntu 20.04/20.10/21.04, Debian 11 və Fedora 34-də işləyən işçi ekspluatasiyaları hazırlaya bilməsi ilə daha da artır. Qeyd edilir ki, digər paylanmalar sınaqdan keçirilməyib, lakin nəzəri cəhətdən də problemə həssasdır və hücuma məruz qala bilər. İstismarların tam kodunun problem hər yerdə aradan qaldırıldıqdan sonra dərc ediləcəyi vəd edilir, lakin hələlik sistemin sıradan çıxmasına səbəb olan məhdud funksionallıq prototipi mövcuddur. Problem 2014-cü ilin iyul ayından bəri mövcuddur və 3.16-dan başlayaraq nüvə buraxılışlarına təsir göstərir. Zəifliyin aradan qaldırılması icma ilə razılaşdırıldı və iyulun 19-da nüvəyə qəbul edildi. Əsas paylamalar artıq öz nüvə paketlərinə (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch) yeniləmələr yaradıb.

Zəiflik, qeydlər ardıcıllığından fayllar yaradan seq_file kodunda əməliyyatları yerinə yetirməzdən əvvəl size_t-dən int-ə çevrilmənin nəticəsinin yoxlanılmaması ilə əlaqədardır. Yoxlamamaq çox daxili qovluq strukturunu (yol ölçüsü 1 GB-dən çox) yaratarkən, quraşdırarkən və silərkən buferə hüdudlardan kənar yazılarla nəticələnə bilər. Nəticədə, təcavüzkar ayrılmış buferdən dərhal əvvəlki sahəyə işarə edən "-10 GB - 2 bayt" ofsetində yazılmış 10 baytlıq "//deleted" sətrinə nail ola bilər.

Hazırlanmış istismarın işləməsi üçün 5 GB yaddaş və 1 milyon pulsuz inod tələb olunur. İstismar 1 GB-dan çox fayl yolunun ölçüsünə nail olmaq üçün təxminən bir milyon alt kataloqdan ibarət iyerarxiya yaratmaq üçün mkdir() funksiyasına zəng etməklə işləyir. Bu kataloq bind-mount vasitəsilə ayrıca istifadəçi ad məkanında quraşdırılır, bundan sonra onu silmək üçün rmdir() funksiyası işə salınır. Paralel olaraq, eBPF psevdokodu yoxlanıldıqdan sonra, lakin JIT tərtibindən əvvəl bloklanan kiçik bir eBPF proqramını yükləyən bir ip yaradılır.

İmtiyazsız istifadəçi ad məkanında /proc/self/mountinfo faylı açılır və bağlamaya quraşdırılmış kataloqun uzun yol adı oxunur, nəticədə bufer başlamazdan əvvəlki sahəyə “//deleted” sətri yazılır. Xəttin yazılması mövqeyi elə seçilmişdir ki, o, artıq sınaqdan keçirilmiş, lakin hələ tərtib edilməmiş eBPF proqramında təlimatın üzərinə yazır.

Bundan sonra, eBPF proqram səviyyəsində, nəzarətsiz buferdən kənar yazı, btf və map_push_elem strukturlarının manipulyasiyası ilə digər nüvə strukturlarına oxumaq və yazmaq üçün idarə olunan qabiliyyətə çevrilir. Nəticədə, eksploit modprobe_path[] buferinin nüvə yaddaşındakı yerini müəyyənləşdirir və oradakı “/sbin/modprobe” yolunun üzərinə yazır ki, bu da sizə kök hüququ olan istənilən icra edilə bilən faylın işə salınmasına başlamaq imkanı verir. request_module() çağırışı, məsələn, netlink yuvası yaratarkən yerinə yetirilir.

Tədqiqatçılar yalnız müəyyən bir istismar üçün təsirli olan, lakin problemin özünü aradan qaldırmayan bir neçə həll yolu təqdim edirlər. Ayrı bir istifadəçi ID ad məkanında qovluqların quraşdırılmasını deaktiv etmək üçün "/proc/sys/kernel/unprivileged_userns_clone" parametrini 0-a, eBPF proqramlarının nüvəyə yüklənməsini söndürmək üçün isə "/proc/sys/kernel/unprivileged_bpf_disabled"-i 1-ə təyin etmək tövsiyə olunur.

Maraqlıdır ki, böyük bir kataloqu quraşdırmaq üçün bağlamaq əvəzinə FUSE mexanizminin istifadəsini əhatə edən alternativ hücumu təhlil edərkən, tədqiqatçılar systemd sistem menecerinə təsir edən başqa bir zəifliyə (CVE-2021-33910) rast gəldilər. Məlum oldu ki, FUSE vasitəsilə yolun ölçüsü 8 MB-dan çox olan qovluğu quraşdırmaq istəyərkən, idarəetmənin işə salınması prosesi (PID1) stek yaddaşı tükənir və sistemi “çaxnaşma” vəziyyətinə gətirir.

Problem ondadır ki, systemd /proc/self/mountinfo məzmununu izləyir və təhlil edir və datanı dinamik olaraq ayrılmış yaddaşda deyil, yığına yerləşdirən strdupa() əməliyyatını yerinə yetirən unit_name_path_escape() funksiyasında hər bir quraşdırma nöqtəsini emal edir. . Maksimum yığın ölçüsü RLIMIT_STACK vasitəsilə məhdud olduğundan, quraşdırma nöqtəsinə çox böyük bir yolun işlənməsi PID1 prosesinin çökməsinə və sistemin dayandırılmasına səbəb olur. Hücum üçün, yolun ölçüsü 8 MB-dan çox olan yüksək yuvalanmış kataloqdan istifadə etməklə birlikdə ən sadə FUSE modulundan istifadə edə bilərsiniz.

Problem systemd 220-dən (2015-ci ilin aprel ayından) bəri ortaya çıxır, artıq əsas sistem deposunda düzəldilir və paylamalarda (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch) düzəldilir. Qeyd edək ki, systemd buraxılış 248-də istismar /proc/self/mountinfo-nun işlənməsinin uğursuzluğuna səbəb olan systemd kodundakı səhvə görə işləmir. Həm də maraqlıdır ki, 2018-ci ildə oxşar vəziyyət yaranıb və Linux nüvəsində CVE-2018-14634 zəifliyi üçün eksploit yazmaq istəyərkən Qualys tədqiqatçıları systemd-də üç kritik boşluqla rastlaşıblar.

Mənbə: opennet.ru

Добавить комментарий