Skip to content

fix: harden sources.list validation, temp file handling and group script - #24

Open
jankesec wants to merge 4 commits into
pardus:masterfrom
jankesec:fix/safe-sources-and-secure-tempfile
Open

fix: harden sources.list validation, temp file handling and group script#24
jankesec wants to merge 4 commits into
pardus:masterfrom
jankesec:fix/safe-sources-and-secure-tempfile

Conversation

@jankesec

@jankesec jankesec commented Sep 4, 2026

Copy link
Copy Markdown

Özet

Bu geliştirme, pardus-update bileşeni içerisindeki üç ayrı güvenlik ve kararlılık riskini (kaynak listesi doğrulaması kara liste atlatması, öngörülebilir geçici dosya yolu üzerinden hizmet reddi ve grup betiği girdi güvenliği) gidermektedir:

  1. is_safe_sources() Güvenli Liste (Whitelist) Doğrulaması (CWE-184 / CWE-20):

    • SysActions.py ve AptSourceActions.py betiklerindeki is_safe_sources() kontrolü önceki uygulamada kara liste (blacklist) yaklaşımı kullanmakta ve yalnızca trusted=yes, trusted=true ile file:// dizelerini filtrelemekteydi.
    • Ancak APT paket yöneticisi trusted=1, trusted=on, trusted=with, trusted=enable gibi StringToBool truthy değerlerini de imzasız depoları güvenilir kabul etmek için geçerli saymaktadır. Ayrıca file:/ (tek eğik çizgi) biçimindeki yerel depolar da bu filtreden kaçabilmekteydi.
    • Düzeltme ile girdi doğrulaması güvenli liste (whitelist) yaklaşımına dönüştürülmüştür: Yalnızca http:// ve https:// protokollerine izin verilmiş, file:, copy:, cdrom: gibi yerel/güvensiz şemalar koşulsuz engellenmiş ve seçenekler ([...]) içerisinde trusted, allow-insecure, allow-downgrade, signed-by gibi güvenliği zayıflatan tüm parametreler kesin olarak reddedilmiştir.
  2. Öngörülebilir /tmp/tmp-sources.list Yolu ve Hizmet Reddi Önlemesi (CWE-377 / CWE-379):

    • controldistupgrade() ve downupgrade() fonksiyonları geçici kaynak listesini /tmp/tmp-sources.list adlı sabit ve tahmin edilebilir bir yola yazmaktaydı. Yetkisiz bir yerel kullanıcının bu dosyayı önceden oluşturması durumunda kök kullanıcı (root) dosyaya yazamamakta ve yükseltme denetimi kalıcı olarak kilitlenmekteydi (Hizmet Reddi / DoS).
    • Düzeltme ile geçici kaynak listesi öncelikle yalnızca root erişimine açık olan /run/pardus-update/ dizini altında güvenle oluşturulmakta, dizinin bulunmaması durumunda ise tempfile.mkstemp ile tahmin edilemez adlı ve 0600 izinli güvenli geçici dosya açılmaktadır. İşlem tamamlandığında finally bloğu ile geçici dosya sistemden güvenle temizlenmektedir.
  3. Group.py Argüman ve Kullanıcı Doğrulaması (CWE-250 / CWE-20):

    • Betik 2 argümandan az çağrıldığında oluşan IndexError çökmesi giderilmiş, kullanıcı adı POSIX standardına (^[a-zA-Z0-9_.][a-zA-Z0-9_.-]*\$?$) ve pwd.getpwnam() sistem kullanıcı veritabanı kontrolüne tabi tutulmuştur.

📊 Önerilen CVSS 3.1

Bulgu CWE Skor Şiddet Vektör
is_safe_sources kara liste atlatması + grup delegasyonu (PU-14 + UG-12) CWE-184, CWE-20, CWE-250 7.0 Yüksek CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H
Öngörülebilir /tmp/tmp-sources.list (PU-19) CWE-377, CWE-379 3.3 Düşük CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:L
Group.py argüman / kullanıcı doğrulaması CWE-20, CWE-250 Sertleştirme UG-12 zincirinin yardımcı betik yüzeyi

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

  • 7.0 (Yüksek): pardus-update grubu üyesi (yönetici olmayan, sevkiyattaki parolasız-güncelleme özelliğiyle eklenen kullanıcı) pardus-update-sysaction eylemini parolasız çağırabilir. 0.7.0'daki is_safe_sources() kara listesi trusted=1 / trusted=on / file:/ gibi APT StringToBool doğruluk değerleriyle atlatılır; imzasız depo + çevrimdışı yükseltme zinciri kök yetkisine götürür. AC:H, kötü niyetli depo ve yükseltme/reboot akışı gerektiği içindir. Bu, CVE-2026-16287 düzeltmesinin eksik kalan parçasıdır.
  • 3.3 (Düşük): Yetkisiz yerel kullanıcı sabit /tmp/tmp-sources.list yolunu önceden oluşturarak yükseltme denetimini kilitleyebilir (hizmet reddi). Gizlilik/bütünlük etkisi yoktur.
  • Group.py doğrulaması tek başına LPE değildir (auth_admin gerekir); zincirin yardımcı yüzeyini kapatır.

Yapılan Değişiklikler

  • src/SysActions.py & src/AptSourceActions.py:

    • is_safe_sources() fonksiyonu güvenli liste mantığıyla yeniden yapılandırıldı; re.match ile URI ve seçenek blokları ayrıştırıldı.
    • write_temp_sources_list() ve cleanup_temp_sources_list() yardımcı fonksiyonları eklenerek /run/pardus-update/ ve tempfile güvenli dosya yönetimine geçildi.
    • controldistupgrade ve downupgrade fonksiyonları try ... finally bloklarıyla sarılarak geçici dosyaların ve APT yapılandırmasının her durumda temizlenmesi güvenceye alındı.
  • src/Group.py:

    • Argüman sayısı denetimi (len(sys.argv) < 3) eklendi.
    • POSIX kullanıcı adı doğrulama regex'i ve pwd.getpwnam() kontrolü eklendi.
    • Komut varlık kontrolü ve dönüş kodu iletimi sağlandı.

Laboratuvar Doğrulaması ve Regresyon Testleri

Bu çalışma, izole laboratuvar ortamında kapsamlı birim testleri ve senaryolarla test edilmiş ve doğrulanmıştır:

  • Kara Liste Atlatma Denemeleri: trusted=1, trusted=01, trusted=on, trusted=with, trusted=enable, trusted=yes, trusted=true gibi tüm varyantların is_safe_sources() tarafından başarıyla yakalanıp reddedildiği doğrulandı.
  • Yerel ve Güvensiz Depo Denemeleri: file:/, file:///, copy:/, cdrom:/, ftp:// protokollerinin ve signed-by=/... manipülasyonlarının engellendiği teyit edildi.
  • Öngörülebilir Dosya Koruması: /tmp/tmp-sources.list dosyasının yetkisiz kullanıcı tarafından önceden oluşturulması durumunda dahi yükseltme simülasyonunun /run/pardus-update/ üzerinden güvenle çalıştığı ve hizmet reddinin (DoS) engellendiği doğrulandı.
  • Grup Yönetimi: Eksik argümanlı çağrıların kontrollü kullanım mesajıyla sonlandığı (IndexError giderildi), geçersiz kullanıcıların engellendiği teyit edildi.
  • İşlevsel Doğrulama (Regresyon Testi): Resmi Pardus ve Debian depoları (http://depo.pardus.org.tr/pardus yirmibes main, [arch=amd64], güvenlik depoları) test edilmiş; meşru kaynak listelerinin sorunsuz kabul edildiği, paket listeleme ve güncelleme denetimi işlevlerinde herhangi bir aksama veya gerileme yaşanmadığı doğrulanmıştır.

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

…d harden group management (CWE-184, CWE-377, CWE-250)
@jankesec jankesec changed the title fix: katı kaynak listesi doğrulaması, güvenli geçici dosya yönetimi ve grup betiği sertleştirmesi (CWE-184, CWE-377, CWE-250) fix: harden sources.list validation, temp file handling and group script Sep 4, 2026
The outer try around APT cache init was closed before the existing
cache.upgrade try, which is a SyntaxError. Nest the upgrade/report
body inside the same try so the finally always cleans the temp
sources list.
Reject only security-weakening options (trusted=*, allow-insecure,
check-valid-until=false, attacker-controlled signed-by paths). Keep
http/https URIs, [arch=...], and signed-by under /usr/share/keyrings
or /etc/apt/keyrings so dist-upgrade of stock Pardus/Debian lines
is unchanged.
@jankesec

jankesec commented Sep 4, 2026

Copy link
Copy Markdown
Author

İş akışı notu (lab, Pardus 25.2):

Resmi sources.list satırları http://depo.pardus.org.tr/... ve isteğe bağlı [arch=amd64] — bunları whitelist kabul ediyor.

signed-by= artık toptan reddedilmiyor. Yalnızca /usr/share/keyrings/ ve /etc/apt/keyrings/ altındaki anahtarlara izin var; /tmp/evil.gpg ve trusted=* / file: / check-valid-until=false reddediliyor. Dist-upgrade / resmi depo akışı kırılmaz.

@jankesec

jankesec commented Sep 4, 2026

Copy link
Copy Markdown
Author

Önceki iş akışı notunu sadeleştireyim — bu bulgu false positive değil.

Sorun (gerçek): 0.7.0’daki kara liste yalnızca trusted=yes / trusted=true bakıyor. APT ise trusted=1 ve trusted=on değerlerini de “güvenilir, imza alma” sayıyor. Lab’de is_safe_sources("deb [trusted=1] http://...") True döndü. İmzasız depo kabulü bu.

Yama ne yapıyor: Kötü seçenekleri (trusted=*, file:, rastgele signed-by=/tmp/...) reddediyor. Resmi Pardus satırı (deb http://depo.pardus.org.tr/pardus yirmibes main) aynı kalıyor; güncelleme düğmesi bozulmaz.

Yani: zafiyet duruyor, düzeltme kullanıcı güncellemesini kırmıyor.

Comma-splitting options treated extra signed-by paths as unknown
tokens and allowed them. Parse option boundaries so each signed-by
path must stay under /usr/share/keyrings or /etc/apt/keyrings.
Unknown keys such as trusted and inrelease-path are denied.
@jankesec

jankesec commented Sep 4, 2026

Copy link
Copy Markdown
Author

is_safe_sources sıkılaştırıldı: signed-by birden fazla yol içeriyorsa her yol /usr/share/keyrings/ veya /etc/apt/keyrings/ altında olmak zorunda. trusted, inrelease-path ve diğer bilinmeyen seçenekler reddediliyor.

Resmi Pardus satırları (deb http://depo.pardus.org.tr/..., arch=amd64, resmi signed-by) aynı kalır. Grup kuralındaki YES (parolasız güncelleme) bu PR’da duruyor; kaynak listesi artık imzasız/yerel depoya açılmıyor.

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