Linux nüvəsində yalnız oxuna bilən fayllara müdaxilə edə bilən boşluq

Linux nüvəsində səhifə keşinin məzmununun yalnız oxu rejimində olanlar, O_RDONLY bayrağı ilə açılanlar və ya yalnız oxu rejimində quraşdırılmış fayl sistemlərində yerləşənlər də daxil olmaqla istənilən fayl üçün üzərində yazılmasına imkan verən bir zəiflik (CVE-2022-0847) aşkar edilmişdir. Praktik baxımdan, bu zəiflikdən ixtiyari proseslərə kod yeritmək və ya açılmış fayllardakı məlumatları korlamaq üçün istifadə etmək olar. Məsələn, sshd prosesi üçün authorized_keys faylının məzmunu dəyişdirilə bilər. Test üçün prototip istismarı mövcuddur.

Problem, 2016-cı ildə aşkar edilmiş kritik Dirty COW boşluğuna istinad edən Dirty Pipe kod adı ilə adlandırılıb. Dirty Pipe-in ​​ciddilik baxımından Dirty COW ilə eyni səviyyədə olduğu, lakin istismarının xeyli asan olduğu qeyd olunur. Boşluq, şəbəkə üzərindən yüklənmiş faylların aralıq korlanması şikayətlərini araşdırarkən aşkar edilib. Bu korlanmalar log serverindən sıxılmış arxivləri yükləyən sistemdə (məşğul sistemdə üç ay ərzində 37 korlanma) splice() əməliyyatı və adsız borular istifadə edilərək hazırlanıb.

Zəiflik özünü 2020-ci ilin avqust ayında buraxılan Linux nüvəsi 5.8-dən başlayaraq göstərir. Debian 11-də mövcuddur, lakin Ubuntu 20.04 LTS-də baza nüvəsinə təsir göstərmir. RHEL 8.x və openSUSE/SUSE 15 nüvələri əvvəlcə köhnə budaqlara əsaslanır, lakin problemə səbəb olan dəyişikliyin orada geri göndərilməsi mümkündür (hələlik dəqiq məlumat yoxdur). Bu distributivlər üçün paket yeniləmələrinin buraxılışını aşağıdakı səhifələrdə izləyə bilərsiniz: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Zəiflik üçün düzəliş 5.16.11, 5.15.25 və 5.10.102 buraxılışlarında təklif olunur. Düzəliş həmçinin Android platformasında istifadə olunan nüvəyə də daxildir.

Bu zəiflik, copy_page_to_iter_pipe() və push_pipe() funksiyalarında "buf->flags" dəyərinin başlanğıcının olmamasından qaynaqlanır. Bir struktur təyin edilərkən yaddaş təmizlənmir və adsız borularla müəyyən manipulyasiyalar "buf->flags"-ın başqa bir əməliyyatdan bir dəyər ehtiva etməsinə səbəb ola bilər. Bu qüsurdan istifadə edərək, imtiyazsız yerli istifadəçi bayrağın PIPE_BUF_FLAG_CAN_MERGE dəyərinə təyin edilməsinə səbəb ola bilər ki, bu da sadəcə xüsusi hazırlanmış adsız boruya yeni məlumatlar yazmaqla səhifə keşindəki məlumatların üzərinə yazılmasına imkan verir.

Hücum həyata keçirmək üçün hədəf faylı oxunaqlı olmalıdır. Boruya yazarkən giriş hüquqları yoxlanılmadığı üçün səhifə keşinin dəyişdirilməsi hətta yalnız oxunan bölmələrdə yerləşən fayllarda (məsələn, CD-ROM-dan olan fayllar) da həyata keçirilə bilər. Səhifə keşindəki məlumatı dəyişdirdikdən sonra, fayldan məlumatları oxuyarkən, proses faktiki deyil, əvəz olunmuş məlumatları alacaq.

İstismar, adsız bir boru yaratmaqdan və onu ixtiyari məlumatlarla doldurmaqdan ibarətdir ki, bütün əlaqəli halqa strukturlarında PIPE_BUF_FLAG_CAN_MERGE bayrağını təyin etsin. Daha sonra məlumatlar borudan oxunur, lakin bayraq pipe_inode_info halqa strukturlarındakı pipe_buffer strukturunun bütün nümunələrində təyin olunmuş olaraq qalır. Daha sonra, hədəf faylından adsız boruya istənilən ofsetdən başlayaraq məlumatları oxumaq üçün splice() çağırışı edilir. Bu adsız boruya məlumat yazarkən, PIPE_BUF_FLAG_CAN_MERGE bayrağı, pipe_buffer strukturunun yeni bir nümunəsi yaratmaq əvəzinə, səhifə keş məlumatlarını onun üzərində yazmaq üçün təyin edir.

Mənbə: opennet.ru