Linux Masaüstünde Yetkilendirme ve Kimlik Doğrulama Arayüzlerinin Güvenlik Mimarisi
Parola ve onay pencerelerinin güvenlik sınırları, Wayland, polkit, PAM ve xdg-desktop-portal mimarisinin yetkilendirme ve kimlik doğrulama süreçlerini nasıl yalıttığının 2026 standartlarındaki derin teknik analizi.
Linux Masaüstünde Yetkilendirme ve Kimlik Doğrulama Arayüzlerinin Güvenlik Mimarisi#
Bir Linux masaüstünde son kullanıcıya gösterilen iki pencere görsel olarak birbirine çok benzeyebilir: biri "Bu uygulama ekranınızı kaydetmek istiyor, izin veriyor musunuz?" sorusunu sorarken, diğeri "Yönetici yetkisi gerektiren bir işlem için parolanızı girin" talebinde bulunur.
İlk etkileşim bir yetkilendirme (authorisation) kararıdır; bir sürecin belirli bir ayrıcalığa erişip erişemeyeceğini belirler. İkinci etkileşim ise bir kimlik doğrulama (authentication) sürecidir; kullanıcının iddia ettiği kimliğin gerçek sahibi olduğunu kanıtlamasını ister.
Masaüstü güvenlik modellerinde bu iki kavram sıklıkla birbirine karıştırılır veya aynı kullanıcı deneyimi havuzuna atılır. Oysa korunan varlıklar, tehdit modelleri ve başarısız bir savunmanın getireceği sistemik maliyetler tamamen farklıdır. X11 mimarisinde bu diyaloglar onlarca yıl boyunca dinleme (eavesdropping), sahte girdi enjeksiyonu (synthetic input injection) ve arayüz taklidi (spoofing) saldırılarına açık kalmıştır.
Modern Linux mimarisinde ise görüntü sunucusu (Wayland kompozitörü), ayrıcalık otoritesi (polkit), modüler kimlik doğrulama katmanı (PAM) ve uygulama soyutlama arayüzleri (xdg-desktop-portal) koordineli bir güvenlik çiti oluşturur.
Bu dokümanda, Linux masaüstünde yetkilendirme ve kimlik doğrulama arayüzlerinin uçtan uca mimarisini, çekirdek girdi katmanından D-Bus IPC mesajlaşmasına, kompozitör yüzey yalıtımından pratik denetim mekanizmalarına kadar en derin teknik ayrıntılarıyla inceliyoruz.
1. Temel Ayrım: Yetkilendirme ve Kimlik Doğrulama#
Masaüstü güvenliğinde yetkilendirme ile kimlik doğrulama arasındaki farkı anlamak, doğru tehdit modelini kurmanın ilk adımıdır.
+--------------------------------------------------------------------------+ | KULLANICI İSTEMİ | +-------------------------------------+------------------------------------+ | +----------------------------+----------------------------+ | | v v +---------------------------------+ +---------------------------------+ | YETKİLENDİRME | | KİMLİK DOĞRULAMA | | (Authorisation) | | (Authentication) | +---------------------------------+ +---------------------------------+ | Soru: "Bu süreç X yapabilir mi?"| | Soru: "Sen iddia ettiğin kişi | | Hedef: İzin / Yetenek | | misin?" | | Varlık: Geçici izin belirteci | | Hedef: Kimlik Kanıtı | | Çıktı: Evet / Hayır kararı | | Varlık: Parola / FIDO2 / Biyometrik| | Risk: Fazla yetki verilmesi | | Çıktı: Kriptografik oturum/bilet| +---------------------------------+ | Risk: Parola hırsızlığı / Tam | | hesap ele geçirme | +---------------------------------+
Detaylı Karşılaştırma Matrisi#
| Kriter | Yetkilendirme (Authorisation) | Kimlik Doğrulama (Authentication) |
|---|---|---|
| Sorulan Soru | Bu süreç (PID / App ID) hedef kaynağa erişebilir mi? | Klavyenin başındaki insan, sistemdeki bu kullanıcı mı? |
| İşlenen Hassas Veri | Karar bit'i (Allow/Deny), yetki kapsamı (Scope) | Parola dizgisi, FIDO2 assertion, PAM auth token |
| Risk Altındaki Varlık | Çalışma zamanı yeteneği (ekran kaydı, kamera, ham girdi) | Kalıcı kimlik bilgisi, anahtarlık sırları (Master Keyring) |
| Sahte Arayüzün Maliyeti | Düşük-Orta: Kullanıcı sahte "İzin Ver"e bassa da arka planda gerçek izin oluşmaz | Kritik: Kullanıcı parolasını saldırgana teslim eder; kalıcı ve zincirleme yetki yükseltme gerçekleşir |
| Tetiklenme Mekanizması | Portal D-Bus çağrıları (xdg-desktop-portal), Polkit kuralları | PAM konuşması (pam_authenticate), polkitd ajan çağrısı |
| Kullanıcı Etkileşimi | Tek tıklama onay diyaloğu, kapsam seçimi | Parola girişi, donanım anahtarına dokunma, PIN |
Bu asimetri kritiktir: Sahte bir yetkilendirme penceresi çizen saldırgan kullanıcıyı kandırıp "Evet" dedirtse bile, kompozitör veya çekirdek düzeyindeki korumalar baypas edilmediği sürece işletim sistemi saldırganın sürecine o yetkiyi atamaz.
Ancak sahte bir kimlik doğrulama penceresi çizen saldırgan, kullanıcının girdiği parolayı doğrudan bellek alanına okuyabilir ve bu parolayı kullanarak arka planda meşru sudo, pkexec veya polkit çağrıları yapabilir.
2. Uçtan Uca Sistem Güvenlik Mimarisi#
Modern bir Linux sisteminde yetkilendirilmiş veya doğrulanmış bir işlemin gerçekleşmesi, donanım katmanından masaüstü kabuğuna kadar uzanan çok katmanlı bir hiyerarşiyi gerektirir.
+-----------------------------------------------------------------------------+ | GÜVENİLMEYEN İSTEMCİ | | (Sandbox İçi Flatpak / Host Süreci / Kötü Niyetli Uygulama) | +--------------------------------------+--------------------------------------+ | 1. D-Bus İsteği | (org.freedesktop.portal.* veya | org.freedesktop.PolicyKit1) v +-----------------------------------------------------------------------------+ | AYRICALIK OTORİTESİ | | | | +---------------------------+ +----------------------------------+ | | | xdg-desktop-portal | | polkitd | | | | (Kullanıcı Oturumu) | | (Sistem D-Bus / Root) | | | +-------------+-------------+ +-----------------+----------------+ | +----------------|----------------------------------------|-------------------+ | 2. Arayüz İsteği | 2. Ajan Çağrısı v v +-----------------------------------------------------------------------------+ | GÜVENİLİR ARAYÜZ VE KABUK KATMANI | | (GNOME Shell / KDE Plasma / wlroots) | | | | +---------------------------+ +----------------------------------+ | | | Portal Arayüz Arka Ucu | | polkit AuthenticationAgent | | | | (gnome/kde/wlr portal) | | (Gömülü Kabuk / Ayrı Ajan) | | | +-------------+-------------+ +-----------------+----------------+ | | | | | | +-------------------+--------------------+ | | | | | v | | +--------------------------------------+ | | | Wayland Kompozitörü | | | | (Yüzey Yalıtımı, Özel Girdi Odağı) | | | +------------------+-------------------+ | +------------------------------------|----------------------------------------+ | 3. Doğrulama IPC v +-----------------------------------------------------------------------------+ | ÇEKİRDEK VE SİSTEM GÜVENLİK SINIRI | | | | +-----------------------+ +----------------------+ +------------------+ | | | polkit- | | PAM Yığını | | Linux Kernel | | | | agent-helper-1 |->| (pam_unix, pam_fido2,|->| (evdev, DRM, | | | | (setuid root) | | pam_systemd_home) | | cgroups, bwrap) | | | +-----------------------+ +----------------------+ +------------------+ | +-----------------------------------------------------------------------------+
Güvenlik Sınırlarının Bileşen Analizi#
-
İstemci İzolasyonu (Sandbox Boundary): Uygulama unprivileged bir Bubblewrap veya Flatpak sandbox'ı içinde çalışıyorsa, dosya sistemi ve D-Bus erişimi kısıtlıdır. İstemci doğrudan
/dev/inputveya/dev/drmaygıtlarına erişemez; sistem kaynaklarına yalnızcaxdg-desktop-portalüzerinden D-Bus oturum veri yolu (Session Bus) ile erişebilir. -
Otorite ve Karar Katmanı (Authority Layer):
- polkitd: Sistem veri yolunda (
org.freedesktop.PolicyKit1) çalışan yetkilendirme motorudur. Yetki kuralları/usr/share/polkit-1/rules.d/ve/etc/polkit-1/rules.d/altındaki JavaScript betikleri ile değerlendirilir. - xdg-desktop-portal: Oturum seviyesinde izin durumlarını tutan (
PermissionStore) ve kullanıcı onay pencerelerini tetikleyen aracıdır.
- polkitd: Sistem veri yolunda (
-
Güvenilir Arayüz Katmanı (Trusted UI / Shell): Kimlik doğrulama diyaloğu, çağıran uygulamanın penceresinde DEĞİL, doğrudan masaüstü kabuğunun (örneğin GNOME Shell veya KWin) kendi kompozisyon döngüsünde çizilir. Bu arayüz, istemcilerin erişemeyeceği ayrıcalıklı bir Wayland yüzeyidir (
ext-session-lock-v1veya özel kabuk yüzeyi). -
Doğrulama İcracısı (Authentication Execution): Kabuk ajanına yazılan parola asla istemciye veya
polkitdye düz metin olarak iletilmez. Ajan,polkit-agent-helper-1adlı setuid binary sürecini çatallar (fork). Bu yardımcı süreç PAM (/etc/pam.d/polkit-1) yığınını çalıştırır ve sonucu D-Bus üzerindenpolkitdye döndürür.
3. Tehdit Modeli ve Klasik Saldırı Vektörleri#
Masaüstü arayüz güvenliğine yönelik saldırılar dört temel kategoride toplanır. Wayland ve modern D-Bus mimarisi bu saldırıların çoğunu yapısal olarak engellerken, bazıları insan faktörü ve mantıksal uygulama hataları nedeniyle risk olmaya devam eder.
+---------------------+-------------------------------------------------------+ | Saldırı Vektörü | X11 Durumu | Modern Wayland & Portal | +---------------------+-------------------------+-----------------------------+ | 1. Dinleme | Tamamen savunmasız. | Protokol düzeyinde çözüldü. | | (Eavesdropping) | Her istemci tüm girdi | Girdi yalnızca odaktaki | | | akışını okuyabilir. | istemci yüzeyine yönlendirilir.| +---------------------+-------------------------+-----------------------------+ | 2. Girdi Enjeksiyonu| XTest ile serbestçe | Sentetik girdi yasaklandı. | | (Input Injection)| sahte tuş basımı ve | Yalnızca yetkili libei/EIS | | | tıklama gönderilebilir. | kanalları üzerinden mümkündür.| +---------------------+-------------------------+-----------------------------+ | 3. Karışan Vekil | Ayrıcalıklı süreçler | Sandbox kimlik doğrulama ve | | (Confused Deputy)| manipüle edilebilir. | SO_PEERCRED denetimi ile | | | | asgariye indirildi. | +---------------------+-------------------------+-----------------------------+ | 4. Arayüz Taklidi | İstemci tam ekran sahte | Kompozitör yüzey hiyerarşisi| | (UI Spoofing / | diyalog çizerek parola | ve güvenilir durum bildirim | | Clickjacking) | toplayabilir. | göstergeleri zorunludur. | +---------------------+-------------------------+-----------------------------+
1. Dinleme (Snooping / Keystroke Logging)#
- Mekanizma: X11'de global olay dinleme modeli geçerliydi. Arka planda çalışan herhangi bir unprivileged işlem,
XSelectInputveyaXRecorduzantısını kullanarak kullanıcının terminalde yazdığısudoparolasını ya da grafiksel diyalogdaki tuş basımlarını yakalayabiliyordu. - Wayland Çözümü: Wayland protokol mimarisinde global girdi dinleme arayüzü yoktur. Klavye olayları (
wl_keyboard.key) sadece ve sadece o anda klavye odağına sahip olanwl_surfacenesnesine teslim edilir. Bir kimlik doğrulama diyaloğu açıldığında kompozitör girdi odağını bu güvenilir yüzeye kilitler; arka plandaki hiçbir istemci bu baytları göremez.
2. Sentetik Girdi Enjeksiyonu (Input Injection)#
- Mekanizma: X11'de
XTestFakeKeyEventAPI'si ile bir istemci rastgele pencerelere klavye ve fare olayları gönderebiliyordu. Örneğin saldırgan kullanıcıpkexecpenceresiyle karşılaştığında arkadan zamanlama saldırısıyla "Enter" veya parola dizgileri enjekte edebilmekteydi. - Wayland Çözümü: İstemci protokolünde girdi enjeksiyon fonksiyonu bulunmaz. Giriş emülasyonu gerektiren yasal araçlar (uzaktan masaüstü, erişilebilirlik yazılımları) doğrudan kompozitör ile konuşamaz;
xdg-desktop-portalüzerindenlibei(Emulated Input) arayüzünü kullanmak ve kullanıcıdan açık onay almak zorundadır.
3. Karışan Vekil (Confused Deputy)#
- Mekanizma: Kötü niyetli bir uygulama, sistemde çalışan yetkili bir servisi (örneğin PackageKit veya systemd) manipüle ederek kendi adına ayrıcalıklı bir işlem yaptırabilir.
- Modern Çözüm: polkit ve D-Bus çekirdek düzeyinde soket denetimi yapar. Bir istemci sistem veri yoluna istek attığında, D-Bus arka plan programı çekirdeğin
SO_PEERCREDsoket seçeneğini kullanarak arayan sürecin gerçek PID'sini, UID'sini ve cgroup kimliğini alır. Yetkilendirme kararı istemcinin beyanına göre değil, çekirdeğin raporladığı kimliğe göre verilir.
4. Arayüz Taklidi ve Oltalama (UI Spoofing & Phishing)#
- Mekanizma: Hiçbir protokol, kötü amaçlı bir yazılımın masaüstünün sistem temasına ve fontlarına birebir uyan gri bir dikdörtgen çizip içine "Sistem güncellemesi için parolanızı girin" yazmasını engelleyemez.
- Savunma Stratejisi: Bu bir protokol sorunu değil, insan-makine arayüzü (HMI) sorunudur. Kompozitör seviyesinde aşağıdaki karşı önlemler uygulanır:
- Ekran Karartma ve Özel Katman: Sistem diyalogları kompozitör tarafından sahne grafiğinin en üst katmanına (
overlayveyalock) yerleştirilir ve arka plan bulanıklaştırılarak diğer tüm pencerelerin etkileşimi dondurulur. - Sistem Güvenlik Göstergeleri: Parola diyaloğu açıkken panelde veya donanım LED'inde (örneğin klavye ScrollLock veya özel ekran rozeti) manipüle edilemez bir sistem durumu simgesi gösterilir.
- Ekran Karartma ve Özel Katman: Sistem diyalogları kompozitör tarafından sahne grafiğinin en üst katmanına (
4. polkit Yetkilendirme ve Kimlik Doğrulama Akışı#
polkit, Linux sistemlerinde unprivileged süreçlerin ayrıcalıklı işlemler yürütmesini denetleyen ana çerçevedir. Aşağıdaki sıralı akış diyagramı (sequence diagram), bir istemcinin sistem saatini değiştirmek veya paket kurmak istediğinde arka planda çalışan D-Bus IPC protokol akışını göstermektedir:
İstemci (App) polkitd AuthAgent (Kabuk) Helper (PAM) Hedef Servis | | | | | | 1. İşlem İsteği | | | | +---------------------------------------------------------------------------->| | | | | | | | 2. CheckAuthorization(subject, action) | | |<---------------------------------------------------------+ | | | | | | | 3. Kuralları Oku (/usr/share & /etc/polkit-1/rules.d) | | | Sonuç: AUTH_ADMIN gereklidir | | | | | | | | 4. BeginAuthentication() | | | |+------------------>| | | | | | 5. fork/exec | | | | |+----------------->| | | | | | | | | | 6. Diyalog Çiz | | | | | (Wayland Grab) | | | | | | | | | | 7. Parola Girişi | | | | +------------------>| | | | | | 8. PAM Doğrula | | | | | (/etc/pam.d) | | | | 9. Başarılı (0) | | | | |<------------------+ | | | 10. AuthenticationComplete() | | | |<-------------------+ | | | | | | 11. Yetki Onayı: {is_authorized: true} | | +--------------------------------------------------------->| | | | | 12. İşlem Sonucu | | |<----------------------------------------------------------------------------+
D-Bus Mesajlaşma Detayları#
- Hedef Servis Kontrolü: Hedef servis (örneğin
org.freedesktop.timedate1), gelen çağrıyı yapan sürecin yetkisini test etmek için sistem veri yolundakiorg.freedesktop.PolicyKit1.AuthorityarayüzüneCheckAuthorizationmetodu gönderir. - Kural Değerlendirme:
polkitd, JavaScript motoru (Duktape veya Spidermonkey) aracılığıyla kayıtlı kuralları çalıştırır. Örnek kural yapısı:polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.timedate1.set-time" && subject.isInGroup("wheel")) { return polkit.Result.AUTH_ADMIN; } }); - Ajan Seçimi:
polkitd, istek yapan kullanıcının oturumunda kayıtlı olanorg.freedesktop.PolicyKit1.AuthenticationAgentD-Bus arayüzünü bulur. GNOME oturumunda bu ajan doğrudangnome-shellsürecidir; KDE oturumundapolkit-kde-authentication-agent-1dir. - PAM Yalıtımı: Ajan, parolanın doğrulanması için
/usr/lib/polkit-1/polkit-agent-helper-1sürecini çalıştırır. Bu süreçsetuid rootbayrağına sahiptir, PAM konuşmasını yönetir ve yalnızca başarı/başarısızlık durum kodunu ajana döner. Kullanıcı parolası hiçbir D-Bus veri yoluna asla iletilmez.
Derin Kaynak Kod Analizi: polkit-agent-helper-1 ve PAM Konuşması#
polkit mimarisinin en hassas parçası, parolanın doğrulanmasından sorumlu olan polkit-agent-helper-1 bileşenidir. Grafiksel masaüstü kabuğu (örneğin GNOME Shell) kullanıcı kimliğinde (UID 1000) çalışır ve /etc/shadow dosyasına doğrudan erişemez. Shell'in kendisini root olarak çalıştırmak ise devasa bir saldırı yüzeyi açar.
Bu nedenle polkit, ayrıcalık ayrımını (privilege separation) polkit-agent-helper-1 C ikilisi üzerinden yürütür. Aşağıda bu mekanizmanın kaynak kod düzeyindeki çekirdek mantığı analiz edilmektedir:
/* polkit-agent-helper-1.c kaynak kodundan basitleştirilmiş mimari yapı */ #include <security/pam_appl.h> #include <string.h> #include <unistd.h> #include <stdio.h> static int conversation_function (int n, const struct pam_message **msg, struct pam_response **resp, void *data) { struct pam_response *aresp; aresp = calloc (n, sizeof (struct pam_response)); if (aresp == NULL) return PAM_BUF_ERR; for (int i = 0; i < n; i++) { if (msg[i]->msg_style == PAM_PROMPT_ECHO_OFF || msg[i]->msg_style == PAM_PROMPT_ECHO_ON) { /* Parola unprivileged kabuk ajanından standart girdi (stdin) veya anonim bir boru hattı (pipe) üzerinden güvenle okunur */ char password_buf[512]; if (fgets (password_buf, sizeof (password_buf), stdin) != NULL) { /* Satır sonu karakterini temizle */ password_buf[strcspn(password_buf, "\n")] = 0; aresp[i].resp = strdup (password_buf); aresp[i].resp_retcode = 0; /* Güvenlik: Parola tamponu bellekte kalmaması için derleyici optimizasyonundan etkilenmeyen explicit_bzero ile silinir */ explicit_bzero (password_buf, sizeof (password_buf)); } } } *resp = aresp; return PAM_SUCCESS; } int main (int argc, char *argv[]) { pam_handle_t *pamh = NULL; struct pam_conv pam_conversation = { conversation_function, NULL }; const char *user_to_auth = argv[1]; int rc; /* 1. polkit-1 PAM hizmeti ile konuşmayı başlat */ rc = pam_start ("polkit-1", user_to_auth, &pam_conversation, &pamh); if (rc != PAM_SUCCESS) return 1; /* 2. Kimlik doğrulama çağrısını yürüt */ rc = pam_authenticate (pamh, 0); if (rc == PAM_SUCCESS) { /* 3. Hesap geçerliliğini (hesap süresi, kilit vb.) doğrula */ rc = pam_acct_mgmt (pamh, 0); } /* 4. PAM oturumunu kapat ve yalnızca çıkış kodunu döndür */ pam_end (pamh, rc); /* Çıktı protokolü: Başarı durumunda çıkış kodu 0, başarısızlıkta 1. Parola metni asla sistem günlüğüne veya D-Bus veri yoluna yazılmaz. */ return (rc == PAM_SUCCESS) ? 0 : 1; }
Kaynak Kod Düzeyindeki Güvenlik Çıkarımları:#
- Derleyici Optimizasyonuna Karşı Koruma (
explicit_bzero): Standartmemset()çağrıları, tamponun hemen sonrasında fonksiyonun sonlandığı durumlarda derleyicinin "Dead Store Elimination" optimizasyonu nedeniyle derleme aşamasında silinebilir. polkit kaynak kodu, parolanın RAM'de kalmasını engellemek içinexplicit_bzero()kullanır. - Asgari İletişim Sınırı (Minimal IPC Surface): Unprivileged ajan ile setuid helper arasındaki iletişim yalnızca
stdinboru hattı veexit codedurumundan ibarettir. Helper süreç, karmaşık D-Bus kütüphanelerini veya grafik kütüphanelerini bağlamaz; böylece setuid ikili içinde bellek bozulması (memory corruption) riski asgariye indirilir.
Derin Kaynak Kod Analizi: polkitbackendjsauthority ve SO_PEERCRED#
polkitd servisinin karar motoru olan polkitbackendjsauthority.c, gelen istekleri değerlendirirken çağıran sürecin kendi beyanına asla güvenmez. Süreç kimliği doğrudan Linux çekirdeğinin sağladığı soket kimlik doğrulama mekanizmasıyla (SO_PEERCRED) doğrulanır.
/* polkitbackendjsauthority.c - Süreç kimlik tespit akışı */ static PolkitSubject * get_subject_from_dbus_invocation (GDBusMethodInvocation *invocation) { GDBusConnection *connection; GCredentials *credentials; pid_t pid; uid_t uid; connection = g_dbus_method_invocation_get_connection (invocation); /* Çekirdek düzeyinde Unix soket kimlik bilgilerini sorgula */ credentials = g_dbus_connection_get_peer_credentials (connection); if (credentials == NULL) return NULL; /* SO_PEERCRED üzerinden çekirdeğin doğruladığı gerçek PID ve UID */ pid = g_credentials_get_unix_pid (credentials, NULL); uid = g_credentials_get_unix_user (credentials, NULL); /* polkitd JavaScript motoru için Subject nesnesini oluştur */ return polkit_unix_process_new_for_owner (pid, 0, uid); }
Bu yapı sayesinde, bir saldırgan D-Bus mesajında sahte bir sender_pid veya user_name başlığı gönderse dahi, polkitd çekirdeğin struct ucred yapısından aldığı gerçek kimliği kullanır. Karışan vekil (confused deputy) saldırıları bu katmanda çekirdek düzeyinde engellenir.
5. xdg-desktop-portal ve Sandboxed Uygulama Güvenliği#
Flatpak ve Snap gibi sandbox teknolojilerinin yükselişiyle birlikte, klasik polkit modeli yetersiz kalmıştır. Bir uygulamanın kameraya erişmesi, mikrofonu açması veya ekranı paylaşması için root parolası sorulamaz; burada gereken mekanizma kullanıcı rızası (consent) ve çalışma zamanı yetki delegasyonudur.
+-----------------------+ | Sandboxed Uygulama | | (com.example.app) | +-----------+-----------+ | D-Bus Session Bus (org.freedesktop.portal.ScreenCast) v +-----------------------+ | xdg-desktop-portal | <--- /proc/[PID]/root ve cgroup kontrolü ile | (Ön Uç Dağıtıcı) | uygulamanın App-ID'sini doğrular +-----------+-----------+ | Dahili D-Bus Protokolü (org.freedesktop.impl.portal.*) v +-----------------------+ | xdg-desktop-portal- | | gnome / kde / wlr | <--- Güvenilir masaüstü arayüzü diyalog açar: +-----------+-----------+ "com.example.app ekranınızı kaydetmek istiyor" | | Kullanıcı "İzin Ver" der ve monitör seçer v +-----------------------+ | Wayland Kompozitörü | | & PipeWire Sunucusu | <--- Kompozitör, PipeWire için bir DMA-BUF akışı açar +-----------+-----------+ ve dosya tanıtıcısını (FD) portala verir | v +-----------------------+ | Sandboxed Uygulama | <--- Uygulama sadece seçilen PipeWire FD'sine | (Görüntüyü Alır) | bağlanır; ekranın tamamına erişemez +-----------------------+
Güvenlik Context Protokolü (wp_security_context_manager_v1)#
2026 yılı itibarıyla Wayland ekosisteminde sandbox yalıtımının en kritik bileşeni wp_security_context_manager_v1 protokolüdür.
Eski modellerde Flatpak sandbox'ı, kompozitörün Wayland soketine (/run/user/1000/wayland-0) doğrudan bağlanıyordu. Bu durum, sandboxed bir uygulamanın kompozitör üzerindeki tüm global arayüzleri görmesine yol açıyordu.
Modern mimaride:
- Sandbox yöneticisi (Bubblewrap / Flatpak), kompozitörün
wp_security_context_manager_v1arayüzünü kullanarak yeni bir dinleme soketi (listen_fd) kaydeder. - Bu sokete metaveriler eklenir:
app_id: com.example.app,sandbox_engine: flatpak. - Sandbox içindeki uygulama bu özel soket üzerinden kompozitöre bağlandığında, kompozitör istemcinin kısıtlı olduğunu peşinen bilir.
- Kompozitör, kısıtlı istemciye
ext-session-lock-v1,wlr-screencopyveyalayer-shellgibi hassas protokolleri göstermez (wl_registry.globalolaylarında ilan etmez).
Protokol XML Tanımı ve Kompozitör C Entegrasyonu:#
wp_security_context_manager_v1 protokolü, wayland-protocols içinde şu XML arayüzü ile tanımlanır:
<interface name="wp_security_context_manager_v1" version="1"> <description summary="sandbox motorları için istemci dinleyici yöneticisi"> Bu global arayüz, sandbox yöneticilerinin (Flatpak, Bubblewrap vb.) kompozitöre özel bir dinleme soketi kaydetmesini ve bağlanan istemcilere güvenlik etiketleri iliştirmesini sağlar. </description> <request name="destroy" type="destructor"/> <request name="create_listener"> <arg name="id" type="new_id" interface="wp_security_context_v1"/> <arg name="listen_fd" type="fd" summary="bağlantıları kabul edecek soket FD"/> <arg name="close_fd" type="fd" summary="kapatma sinyali FD"/> </request> </interface> <interface name="wp_security_context_v1" version="1"> <request name="set_sandbox_engine"> <arg name="name" type="string"/> </request> <request name="set_app_id"> <arg name="app_id" type="string"/> </request> <request name="commit"/> </interface>
Kompozitör tarafında (örneğin wlroots veya GNOME Mutter) bu istek işlenirken, dinleme soketi bir wl_event_source olarak olay döngüsüne (event loop) eklenir. Yeni bir istemci bağlandığında:
/* Kompozitör içindeki bağlantı kabul fonksiyonu */ static int security_context_handle_connection (int fd, uint32_t mask, void *data) { struct security_context_listener *listener = data; int client_fd = accept4 (fd, NULL, NULL, SOCK_CLOEXEC); /* Kompozitör yeni Wayland istemcisini oluşturur */ struct wl_client *client = wl_client_create (compositor->display, client_fd); /* İstemciye güvenlik bağlamını iliştir */ client->security_context = listener->context; // app_id, sandbox_engine return 0; } /* wl_registry.bind isteği geldiğinde yapılan filtreleme */ static void registry_bind (struct wl_client *client, struct wl_resource *resource, uint32_t name, const char *interface, uint32_t version, uint32_t id) { /* Eğer istemci kısıtlanmış bir güvenlik bağlamına sahipse */ if (client->security_context != NULL) { if (strcmp (interface, "ext_session_lock_manager_v1") == 0 || strcmp (interface, "zwlr_screencopy_manager_v1") == 0 || strcmp (interface, "zwlr_layer_shell_v1") == 0) { /* İsteği reddet ve istemciye protokol hatası fırlatarak oturumu kes */ wl_resource_post_error (resource, WL_DISPLAY_ERROR_INVALID_OBJECT, "Ayrıcalıklı arayüz '%s' sandbox istemcisine kapalıdır", interface); return; } } /* Standart bağlama işlemi */ ... }
Bu derin entegrasyon, sandbox içindeki zararlı bir yazılımın Wayland soketi üzerinden kompozitörün ekran kilidini kırmasını veya diğer pencerelerin piksellerini çalmasını çekirdek ve protokol düzeyinde imkansız kılar.
6. Pratik İnceleme ve Güvenlik Denetim Laboratuvarı#
Sisteminizdeki kimlik doğrulama ve yetkilendirme altyapısını denetlemek için aşağıdaki komut zincirlerini ve çıktı analizlerini uygulayabilirsiniz.
1. Oturum Türü ve Kompozitör Durum Denetimi#
# Oturum tipini ve masaüstü kimliğini doğrula loginctl show-session "$XDG_SESSION_ID" -p Type -p Desktop -p Remote
- Beklenen Çıktı:
Type=wayland,Remote=no. - Güvenlik Yorumu: Eğer
Type=x11ise, bu belgede anlatılan yüzey yalıtım garantilerinin hiçbiri geçerli değildir; tüm girdi ve pencereler paylaşımlı bellek havuzundadır.
2. Aktif polkit Ajanı ve Süreç Hiyerarşisi#
# Oturum veri yolundaki polkit ajanını ve süreç kimliğini tespit et busctl --user list | grep -i polkit ps -eo pid,user,args | grep -iE 'polkit|authentication-agent'
- Beklenen Normal Durum: GNOME altında ayrı bir polkit süreci görünmez; ajan doğrudan
gnome-shellsürecinin içine gömülüdür. KDE altında/usr/lib/polkit-kde-authentication-agent-1süreci kendi oturumunuzun UID'si ile çalışmalıdır. - Şüpheli Durum: Eğer root veya bilinmeyen bir kullanıcı adına çalışan harici bir polkit ajanı oturumunuza bağlanmışsa, kimlik bilgisi hırsızlığı riski mevcuttur.
3. polkit Eylem Tanımları ve JavaScript Kuralları#
# Sistemde tanımlı tüm ayrıcalıklı eylem sayısını al pkaction | wc -l # Belirli bir kritik eylemin yetki politikasını incele pkaction --action-id org.freedesktop.systemd1.manage-units --verbose
- Çıktı Analizi:
implicit active: auth_admin_keep-> Yönetici parolası gereklidir, belirli bir süre önbelleğe alınır.implicit active: yes-> Parola sorulmadan doğrudan izin verilir (Tehlikeli eylemlerde zafiyet göstergesidir).
4. Portal Arayüzleri ve İzin Veritabanı#
# Aktif portal arka uçlarını ve sunulan arayüzleri denetle busctl --user introspect org.freedesktop.portal.Desktop /org/freedesktop/portal/desktop # Flatpak ve portal izin depolama durumunu listele flatpak permissions
- Güvenlik Yorumu:
flatpak permissionstablosunda kamera, mikrofon veya ekran paylaşımı için geçmişte verilmiş ve unutulmuş izinleri görebilir, gereksiz yetkileriflatpak permission-reset <app-id>ile silebilirsiniz.
5. Girdi Enjeksiyon Cihazı Denetimi#
# Kullanıcının ham girdi oluşturma cihazına erişimini kontrol et ls -l /dev/uinput
- Beklenen Çıktı:
crw-rw---- 1 root input /dev/uinput - Kritik Zafiyet Belirtisi: Eğer bu dosya
crw-rw-rw-(dünya tarafından yazılabilir) izinlerine sahipse veya kullanıcınızinputgrubundaysa, unprivileged bir yazılımuinputüzerinden klavye oluşturup kompozitörün Wayland yalıtımını tamamen atlayarak sahte tuş basımları yapabilir.
7. Kaçınılması Gereken Mimari Hatalar ve Anti-Pattern'ler#
-
Uygulama İçi Parola Giriş Alanları (In-App Password Dialogs): Bir uygulamanın kendi penceresi içinde kullanıcıdan root/sudo parolası istemesi kabul edilemez bir mimari hatadır. Uygulama pikselleri güvenilemez alandır. Kimlik doğrulama daima sistemin güvenilir kabuk ajanı üzerinden yürütülmelidir.
-
Kullanıcı Tanımlı Gerekçe Metinleri (Unsanitized Reason Strings): Bir uygulama yetki isterken polkit veya portala serbest metin gönderebilir ("Uygulama çökmeleri önlemek için erişim istiyor"). Güvenli masaüstü kabukları, üçüncü parti uygulamaların gönderdiği bu gerekçe dizgilerini sistem mesajından görsel olarak açıkça ayırmalı veya filtrelemelidir; aksi takdirde arayüz manipülasyonu (UI red-dressing) riski doğar.
-
Sınırsız Süreli Yetki Önbellekleme (Indefinite Auth Caching):
auth_admin_keepkuralı kullanılırken önbellek süresi (varsayılan 5 dakika) iyi ayarlanmalıdır. Bir terminal penceresindesudoyetkisi açıkken arka plandaki başka bir betiğin bu önbellekten yararlanmasını engelleyen mekanizmalar (PAM tty denetimi) devrede olmalıdır. -
Kökensiz Xwayland Uygulamaları ile Birlikte Çalışma: Eski X11 uygulamaları Xwayland sunucusu içinde çalışırken birbirlerinin girdilerini dinleyebilirler. Xwayland içinde çalışan bir uygulamaya asla sistem kimlik doğrulama penceresi teslim edilmemelidir.
8. 2026 Durum Özeti ve İleri Mimari#
Linux masaüstü güvenliği, X11'in sınırsız güven modelinden Wayland ve D-Bus tabanlı "varsayılan olarak reddet" (deny-by-default) mimarisine geçişini 2026 yılı itibarıyla tamamlamıştır.
- Yetkilendirme arayüzleri
xdg-desktop-portalvelibeiile standartlaşmış, unprivileged süreçlerin sisteme doğrudan müdahale kanalları kapatılmıştır. - Kimlik doğrulama arayüzleri polkit kabuk ajanları ve PAM donanım entegrasyonları (FIDO2, TPM2 PIN, WebAuthn) ile güçlendirilmiştir.
- Masaüstünün en kritik savunma hattı, insan kullanıcının güvenilir sistem göstergelerini tanıması ve hiçbir üçüncü parti pencereye sistem parolası yazmamasıdır. Mimari seviyede bu güven, kompozitörün çizdiği dokunulmaz piksellerle korunmaktadır.
Parola gerçekten nasıl doğrulanır: PAM yığını ve polkit ajanları#
Bir polkit istemi parola sorduğunda, "ajan polkit'e nasıl konuşur" mekanizması ikinci yarısını gizler: ajan bir PAM konuşması yürütür. polkit, kimlik bilgisi doğrulamasını pam_start/pam_authenticate üzerinden PAM'a devreder ve bunu yerel oturum açma ile aynı yığınla yapar. Tipik masaüstü yığını, ilk kabul edilebilir doğrulayıcının kazandığı şekilde modülleri sıralar:
pam_fprintd— makinede parmak izi okuyucu varsa istem parola alanı dolmadan belirir; parmak izi eşleşmesi yeterli.pam_unix— klasik/etc/shadowparola doğrulaması.pam_unix'den öncepam_faillock/pam_tally2gelir — beş yanlış denemeyi geçici kilide çeviren de budur ve bu bir nezaket özelliğinden öte: görünen diyaloğun arkasındaki kaba-kuvvet anti-tedbiridir.pam_kwallet/pam_gnome_keyringyan yığınları, parola doğrulaması başarılı olduğunda anahtarlığı açar; yani parola hem işlem izni verir hem de kullanıcının saklı kimlik bilgilerini açar. Bu bağlantı bilinçlidir ama tehdit modellemesinde sıklıkla unutulur.
Önemli güvenlik özelliği: parola polkit veya D-Bus üzerinden açık metin taşınmaz. Ajandan sistem PAM servisine, polkit otoritesinin kendi ayrıcalıklı kanalı üzerinden geçer ve PAM onu yalnızca doğrulama penceresi boyunca tutar. Bu yüzden görünen istemi ele geçirmek yalnızca bir UI problemi değil, bir kimlik bilgisi toplama saldırısıdır: diyalog sahteyse yazılan parola doğrudan saldırganın eline geçer.
İstemin gerçek olduğunu doğrulamak için bir test: yeniden başlatın, gerçek istemin normal klavye düzenini ve terminal davranışını doğrulayın ve sistem servisi çağıran ajanları tercih edin. Arkasında PAM kontrolü olmayan bir parola açılır penceresi gösteren tasarımlar (istemci-tarafı "self-check") anti-pattern olarak işaretlenmeli; aynı şekilde herhangi bir girdiyi kabul edip polkit'e sahte düzeyle saldıran ajanlar da.
İlgili İncelemeler ve Dahili Bağlantılar#
- Wayland Kompozitör Güvenlik Mimarisi ve Ayrıcalıklı İstemci Yönetimi - Ekran yakalama,
libeigirdi emülasyonu,ext-session-lock-v1ve kompozitör yüzey yalıtım modeli. - Linux'ta Keylogging ve Girdi Altyapısı: Çekirdekten X ve Wayland'e - Çekirdek tuş işleme hattı ve girdi güvenliği mimarisi.
Ne düşünüyorsun?
Tepki bırakarak geri bildirim ver