CVE-2026-104795
Təsvir
insights-runtime-extractor, runtime barmaq izlərinin çıxarılması üçün konteyner proseslərini skan edən imtiyazlı bir DaemonSet (`hostPID: true`) kimi işləyir. Konteyneri skan edərkən koordinator aşağıdakıları yerinə yetirir: 1. Alt proses yaratmaq üçün **fork()** çağırır 2. Hədəf konteynerin PID və mount namespace-lərinə daxil olmaq üçün **setns()** istifadə edir 3. Extractor-un öz kök fayl sisteminə (burada `/crio.sock` hostPath vasitəsilə montaj edilib) yönəlmiş yetim FD-yə geri qayıtmaq üçün **fchdir()** çağırır 4. **Yalnız `seteuid(target_uid)`** funksiyasını çağırır — effektiv UID-ni dəyişir, lakin **real UID və yadda saxlanılan set-UID-ni 0 səviyyəsində saxlayır** və **icazə verilən capability dəstini qoruyub saxlayır** 5. `check_no_privileged_perms()` mühafizəçisi yalnız Effektiv capability dəstini yoxlayır (beləliklə, yoxlamadan keçir) və **hədəf uid 0 kimi işlədikdə bu mərhələ tamamilə ötürülür** 6. `VersionExecutable` barmaq izi, `/proc/<pid>/cmdline`-dan oxunan və **tamamilə iş yükü (workload) tərəfindən idarə edilən** hədəfin argv[0]-ı olan `process.command_line[0]` ilə `fpr_kind_executable` funksiyasını çağırır 7. `fpr_kind_executable` funksiyası `exec.Command(executable, "--version").Output()` çağırır — beləliklə, **host istifadəçi namespace-də ruid=0 olduğu halda**, iş yükünün mount namespace-i daxilində **iş yükünün öz binar faylını** icra edir İcra olunan proses `CAP_SYS_ADMIN` ilə tam root hüquqlarını bərpa etmək üçün `setuid(0)` çağıra bilər və host CRI-O soketini ehtiva edən extractor konteynerinin fayl sisteminə həll olunan yetim cwd-ni miras alır. ## Təsirə məruz qalan kod ### 1. Qeyri-kafi imtiyaz azaldılması (Rust — extractor koordinatoru) **Fayl:** `extractor/src/insights_runtime_extractor.rs` ```rust // Sətirlər 139-146 — yalnız seteuid ilə azaldma, root konteynerləri üçün mühafizə ötürülür join_process_namespaces(process.pid)?; change_dir(current_dir); switch_user(*process.uid)?; if *process.uid != 0 { perms::check_no_privileged_perms() .expect("Must not have privileged permissions to run fingerprints"); } fingerprint::run_fingerprints(&config, out_dir, &process); ``` ```rust // Sətirlər 182-185 — yalnız effektiv UID dəyişdirilir; ruid/suid 0 olaraq qalır fn switch_user(uid: u32) -> Result<(), ScannerError> { debug!("... Becoming user: {uid}"); seteuid(uid.into()).map_err(|e| ScannerError::Errno(e)) } ``` ### 2. Etibarsız binarın icrası (Go — fingerprint) **Fayl:** `fingerprints/pkg/utils/file.go` ```go // Sətirlər 75-80 — iş yükünün argv[0]-ından olduğu kimi götürülmüş yolu icra edir func GetExecutableVersionOutput(executable string) (string, error) { out, err := exec.Command(executable, "--version").Output() if err != nil { return "", err } return string(out), nil } ``` ### 3. İş yükü tərəfindən idarə olunan yolun ötürülməsi (Rust — version_executable) **Fayl:** `version_executable.rs` ```rust // Sətirlər 29-34 — iş yükü tərəfindən idarə olunan command_line[0] fingerprint-ə ötürülür return Some(vec![ fpr_kind_executable, out_dir.to_string(), String::from(&process.command_line[0]), String::from(&version_executable.runtime_kind_name), ]); ``` ## Hücum nümunəsi **Hücumçu:** Pod təyin edə bilən hər hansı bir kirayəçi (imtiyazsız, istənilən namespace) **Qurban:** insights-runtime-extractor DaemonSet-nin işlədiyi nod **Tətikləyici:** Avtomatik — DaemonSet noddakı bütün konteyner proseslərini skan edir **Hücum ardıcıllığı:** 1. Hücumçu, proses adı konfiqurasiya edilmiş versiyalı-icraedici şablonuna (`node`, `python`, `python3`, `MainThread` və ya `java` ehtiva edən) uyğun gələn bir pod yaradır 2. Pod-un əsas binari (argv[0]-a uyğun gələn yolda) root hüquqlarını bərpa etmək üçün `setuid(0)` çağıran zərərli bir icraedicidir 3. Insights operatoru skanı tətiklədikdə, DaemonSet fork edir, hücumçunun mount namespace-inə daxil olur və hücumçunun binarını ruid=0 ilə icra edir 4. Hücumçunun kodu host istifadəçi namespace-də `CAP_SYS_ADMIN` ilə tam root hüquqlarını yenidən əldə edir 5. Miras alınan cwd host CRI-O soketini ehtiva edir $\rightarrow$ nodun tam kompromisə uğraması
Necə düzəltmək olar
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| openshift 4.19 | Aralıq göstərilməyib | — |
| openshift 4.20 | Aralıq göstərilməyib | — |
| openshift 4.21 | Aralıq göstərilməyib | — |
| openshift 4.22 | Aralıq göstərilməyib | — |
| Red Hat Red Hat OpenShift Container Platform 5 | 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.