Skip to content

fix: prevent command injection in LocaleManager - #2

Open
jankesec wants to merge 1 commit into
pardus:masterfrom
jankesec:fix/secure-locale-command-injection
Open

jankesec wants to merge 1 commit into
pardus:masterfrom
jankesec:fix/secure-locale-command-injection

Conversation

@jankesec

@jankesec jankesec commented Sep 4, 2026

Copy link
Copy Markdown

Özet

Bu geliştirme, sistem yerel ayarları (locale) yapılandırılırken LocaleManager.py üzerinde ortaya çıkabilecek işletim sistemi komut enjeksiyonu (OS Command Injection - CWE-78) riskini giderir ve girdi doğrulamasını güçlendirir.

📊 Önerilen CVSS 3.1

Bulgu CWE Skor Şiddet Vektör
LocaleManager shell=True komut enjeksiyonu (XT-03) CWE-78, CWE-88 6.7 Orta CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H

Skorlar CVSS v3.1 ile bağımsız hesaplanmıştır (NVD / resmi CVE skoru değildir). Yerel pkexec → root zincirlerinde kapsam S:U alınmıştır (PwnKit emsali). Şiddet bantları: 0.1–3.9 Düşük, 4.0–6.9 Orta, 7.0–8.9 Yüksek.

Gerekçe

  • PR:H: pkexec /usr/share/pardus/pardus-xfce-tweaks/src/xfce/locale_changer.py auth_admin ister.
  • C/I/A Yüksek: subprocess.run(f"localectl set-locale LANG={lc}", shell=True) doğrulanmamış yerel ayar dizesini kabuğa gömer; ;, |, $() ile kök komut yürütülür.
  • Skor Orta bandındadır çünkü yönetici onayı gerekir; nitelik olarak tam kök RCE'dir. shell=True kaldırılıp argüman listesi + beyaz liste ile kapatılır.

Karşılaşılan Güvenlik Problemi (CWE-78, CWE-88)

Yerel ayarlar uygulanırken, LocaleManager._set_default_locale fonksiyonu doğrulanmamış yerel ayar dizesi ile birlikte doğrudan shell=True parametresini kullanmaktaydı:

subprocess.run(f"localectl set-locale LANG={lc}", shell=True)

Bu fonksiyon Polkit üzerinden root yetkileriyle (pkexec /usr/share/pardus/pardus-xfce-tweaks/src/xfce/locale_changer.py) çalıştırıldığından; kabuk özel karakterleri (;, |, &, $, ters tırnak vb.) içeren manipüle edilmiş bir girdi, sistem üzerinde doğrudan root yetkisiyle istenmeyen komut çalıştırılmasına zemin hazırlamaktaydı.

Yapılan Değişiklikler

  1. shell=True Kullanımının Kaldırılması:
    • Alt süreç çalıştırmaları doğrudan argüman listesi (execve yapısı) kullanımına dönüştürüldü. Böylece kabuk (shell) yorumlayıcısı tamamen devre dışı bırakılarak meta karakterlerin komut olarak yürütülmesi engellendi.
  2. Güvenli Liste (Whitelist) ile Girdi Doğrulaması:
    • Yerel ayar tanımlayıcısının ^[a-zA-Z0-9][a-zA-Z0-9_@.-]*$ kalıbına uygunluğu kontrol edilerek hem kabuk sözdizimi hem de tire (-) ile başlayan parametre/bayrak enjeksiyonları (argument injection) engellendi.
    • Karakter kodlaması (encoding) parametresi mevcutsa ^[a-zA-Z0-9][a-zA-Z0-9_-]*$ desenine göre doğrulandı.
    • Beklenmeyen fazladan argümanlar (len(parts) > 2) ValueError ile anında reddedildi.
  3. Pardus / Debian Standartlarıyla Uyumluluk:
    • Sistemde mevcut olduğunda standart Debian/Pardus aracı olan update-locale --no-checks tercih edildi; alternatif olarak localectl set-locale mekanizması korundu.
    • Varsayılan yerel atanmadan önce _generate_locale() çağrısı yapılarak sistemde eksik yerel tanımlarından kaynaklanabilecek hataların önüne geçildi.

Laboratuvar Doğrulaması ve Regresyon Testleri

Bu çalışma, izole bir Pardus 25 (yirmibes - Debian 13 tabanlı) laboratuvar ortamında hem zafiyetin engellenmesi hem de uygulamanın normal işlevleri açısından kapsamlı olarak test edilmiştir:

  • Güvenlik Doğrulaması: 14 farklı komut ve parametre manipülasyon denemesi (;, |, $, ters tırnaklar, satır sonları, yönlendirmeler ve tire ile başlayan bayraklar) test edilmiş; tüm girdilerin hiçbir komut yürütülmeden ValueError ile güvenle engellendiği doğrulanmıştır.
  • İşlevsel Doğrulama ve Uyumluluk: Geçerli yerel ayar biçimleri (tr_TR.UTF-8 UTF-8, en_US.UTF-8 UTF-8, sr_RS@latin UTF-8, az_AZ) başarıyla test edilmiş, /etc/default/locale dosyasına doğru şekilde yazıldığı teyit edilmiştir.
  • Regresyon Testi: save_locale_settings() akışı hem Türkçe hem de İngilizce dil seçimlerinde uçtan uca çalıştırılmış; arayüz geçişlerinde veya sistem dili yapılandırmasında herhangi bir sorun, yan etki veya regresyon oluşmadığı doğrulanmıştır.

Pardus ekibine özverili çalışmaları ve emekleri için teşekkür eder, incelemenize sunarız.

@jankesec jankesec changed the title fix(security): prevent OS command injection in LocaleManager (CWE-78) fix: LocaleManager içinde işletim sistemi komut enjeksiyonunun önlenmesi (CWE-78) Sep 4, 2026
@jankesec jankesec changed the title fix: LocaleManager içinde işletim sistemi komut enjeksiyonunun önlenmesi (CWE-78) fix: prevent command injection in LocaleManager Sep 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant