CVE-2026-104795
Açıklama
insights-runtime-extractor, çalışma zamanı parmak izi alma amacıyla konteyner süreçlerini tarayan ayrıcalıklı bir DaemonSet (`hostPID: true`) olarak çalışır. Bir konteyneri tararken koordinatör şunları yapar: 1. Bir alt süreç için **fork()** işlemini gerçekleştirir. 2. Hedef konteynerin PID ve mount namespace alanlarına **setns()** ile girer. 3. Extractor'ın kendi kök dosya sistemini (burada `/crio.sock` hostPath olarak bağlanmıştır) işaret eden yetim bir FD'ye **fchdir()** ile geri döner. 4. **Yalnızca `seteuid(target_uid)` çağrısını yapar** — etkili UID'yi değiştirir ancak **gerçek UID ve kaydedilmiş-set-UID değerlerini 0'da bırakır** ve **izin verilen yetenek kümesini korur**. 5. `check_no_privileged_perms()` koruması yalnızca Etkili yetenek kümesini denetler (bu nedenle geçer) ve **hedef uid 0 olarak çalıştığında tamamen atlanır**. 6. `VersionExecutable` parmak izi, `/proc/<pid>/cmdline` üzerinden okunan ve **tamamen iş yükü tarafından kontrol edilen** hedefin argv[0] değeri olan `process.command_line[0]` ile `fpr_kind_executable` fonksiyonunu çağırır. 7. `fpr_kind_executable`, `exec.Command(executable, "--version").Output()` çağrısı yaparak, **ana bilgisayar kullanıcı namespace alanında ruid=0 iken**, iş yükünün mount namespace alanı içinde **iş yükünün kendi ikili dosyasını (binary)** çalıştırır. Çalıştırılan süreç, `CAP_SYS_ADMIN` ile tam root yetkisini geri kazanmak için `setuid(0)` çağırabilir ve ana bilgisayar CRI-O soketini içeren extractor konteynerinin dosya sistemine çözümlenen yetim cwd'yi devralır. ## Etkilenen Kod ### 1. Yetersiz ayrıcalık düşürme (Rust — extractor coordinator) **Dosya:** `extractor/src/insights_runtime_extractor.rs` ```rust // Satırlar 139-146 — yalnızca seteuid ile düşürme, root konteynerler için koruma atlanıyor 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 // Satırlar 182-185 — yalnızca etkili UID değiştirildi; ruid/suid 0 kalıyor fn switch_user(uid: u32) -> Result<(), ScannerError> { debug!("... Becoming user: {uid}"); seteuid(uid.into()).map_err(|e| ScannerError::Errno(e)) } ``` ### 2. Güvenilmeyen ikili dosyanın çalıştırılması (Go — fingerprint) **Dosya:** `fingerprints/pkg/utils/file.go` ```go // Satırlar 75-80 — iş yükünün argv[0] değerinden aynen alınan yolu çalıştırır 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ü tarafından kontrol edilen yolun iletilmesi (Rust — version_executable) **Dosya:** `version_executable.rs` ```rust // Satırlar 29-34 — iş yükü tarafından kontrol edilen command_line[0] parmak izine iletiliyor return Some(vec![ fpr_kind_executable, out_dir.to_string(), String::from(&process.command_line[0]), String::from(&version_executable.runtime_kind_name), ]); ``` ## Saldırı Deseni **Saldırgan:** Pod zamanlayabilen herhangi bir kiracı (ayrıcalıksız, herhangi bir namespace) **Kurban:** insights-runtime-extractor DaemonSet'ini çalıştıran düğüm (node) **Tetikleyici:** Otomatik — DaemonSet, düğümdeki tüm konteyner süreçlerini tarar **Saldırı dizisi:** 1. Saldırgan, süreç adı yapılandırılmış bir versiyonlu-ikili desene (`node`, `python`, `python3`, `MainThread` veya `java` içeriyor) uyan bir pod oluşturur. 2. Pod'un ana ikili dosyası (argv[0] ile eşleşen yoldaki), root yetkisini geri kazanmak için `setuid(0)` çağıran kötü amaçlı bir yürütülebilir dosyadır. 3. Insights operatörü bir taramayı tetiklediğinde, DaemonSet fork yapar, saldırganın mount namespace alanına girer ve saldırganın ikili dosyasını ruid=0 ile çalıştırır. 4. Saldırganın kodu, ana bilgisayar kullanıcı namespace alanında `CAP_SYS_ADMIN` ile tam root yetkisini yeniden kazanır. 5. Devralınan cwd, ana bilgisayar CRI-O soketini içerir $\rightarrow$ tam düğüm ele geçirme sağlanır.
Nasıl düzeltilir
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| openshift 4.19 | Aralık belirtilmemiş | — |
| openshift 4.20 | Aralık belirtilmemiş | — |
| openshift 4.21 | Aralık belirtilmemiş | — |
| openshift 4.22 | Aralık belirtilmemiş | — |
| Red Hat Red Hat OpenShift Container Platform 5 | 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.