Wayland Kompozitör Güvenlik Mimarisi ve Ayrıcalıklı İstemci Yönetimi

Görüntü sunucusu güvenlik modeli, X11 ve Wayland mimarilerinin girdi-çıktı CIA üçgeni, screencast, girdi emülasyonu (libei/EIS), oturum kilitleme (ext-session-lock-v1) ve sandbox (security-context-v1) ayrıcalıklarının 2026 standartlarında teknik analizi.

18 dk okuma
ibrahimsql
3.401 kelime

Wayland Kompozitör Güvenlik Mimarisi ve Ayrıcalıklı İstemci Yönetimi#

Bir işletim sisteminde görüntü sunucusu (display server), kullanıcı ile donanım arasındaki en kritik geçiş noktasıdır (choke point). Kullanıcının ekranda gördüğü her piksel görüntü sunucusundan geçerek monitöre ulaşır; klavyeden bastığı veya fareyle tıkladığı her olay da yine görüntü sunucusu tarafından işlenip hedef sürece dağıtılır.

Klasik X11 mimarisinde bu merkezi konum, herhangi bir istemcinin diğer tüm pencerelerin belleğini okuyabildiği, global girdi akışını dinleyebildiği ve sahte olaylar enjekte edebildiği örtük yetki (ambient authority) modeliyle işletiliyordu. Bu tasarım, masaüstünü doğası gereği keylogger'lara, pencere hırsızlığına ve yetki yükseltme saldırılarına karşı tamamen savunmasız bırakıyordu.

Wayland bu modeli kökten değiştirmiştir. Çekirdek Wayland protokolünde her istemci izoledir: istemciler yalnızca kendi tamponlarını (buffers) ve kendilerine yönlendirilen girdi olaylarını görebilir.

Ancak masaüstünün işlevsel olabilmesi için bazı uygulamaların bu katı yalıtımı aşması zorunludur:

  • Ekran kaydediciler ve uzaktan toplantı yazılımları ekranı yakalamak ister.
  • Ekran kilitleri oturumu tamamen kilitlemek ve diğer pencereleri örtmek zorundadır.
  • Uzaktan masaüstü ve erişilebilirlik araçları girdi emüle etmek ister.
  • Durum çubukları (panels/bars) global pencere listelerini ve bildirimleri yönetmek ister.

Bu uygulamalara ayrıcalıklı istemciler (privileged clients) denir. Kompozitörün bu ayrıcalıkları nasıl tanımladığı, doğruladığı, dağıttığı ve çalışma zamanında geri aldığı (revocation), modern Linux masaüstünün güvenlik sınırını belirler.

Bu dokümanda, Wayland kompozitör güvenlik modelini, girdi-çıktı CIA üçgenini, ext-session-lock-v1, libei/libeis, wp_security_context_manager_v1 ve PipeWire/Portal entegrasyonlarını 2026 standartlarında inceliyoruz.


1. Görüntü Sunucusu Güvenlik Üçgeni (CIA Matrix)#

Bir görüntü sunucusu, kullanıcıya iki temel veri akışı üzerinden üç temel güvenlik özelliği (Gizlilik, Bütünlük, Kullanılabilirlik) sağlamakla yükümlüdür:

KULLANICI ^ | Çıktı Akışı (Görülenler) | | Girdi Akışı (Yazılanlar) | v +-------------------------+ | GÖRÜNTÜ SUNUCUSU | | (Wayland Kompozitörü) | +-------------------------+ | ^ Pencere Çizimi (DMA) | | Olay Teslimi (wl_keyboard) v | İSTEMCİLER (APPS)

Detaylı CIA Güvenlik Matrisi#

Güvenlik BoyutuGirdi Akışı (Girdiler / Klavye / Fare)Çıktı Akışı (Çıktılar / Ekran Pikselleri)
Gizlilik (Confidentiality)Tuş basımları yalnızca o anda odaklanmış istemciye gider. Arka plandaki hiçbir istemci girdi akışını koklayamaz (anti-keylogging).Bir istemci yalnızca kendi çizdiği piksellere erişebilir. Diğer pencerelerin veya masaüstünün ekran görüntüsü izinsiz alınamaz (anti-screen capture).
Bütünlük (Integrity)İstemciler sahte klavye veya fare olayları üreterek diğer uygulamalara veya sisteme enjekte edemez (anti-input spoofing).Hiçbir istemci başka bir pencerenin içeriğini değiştiremez, başlık çubuğunu taklit edemez veya şeffaf bindirmelerle kandıramaz (anti-clickjacking).
Kullanılabilirlik (Availability)Hiçbir istemci girdi odağını rehin alarak diğer uygulamaların etkileşime girmesini engelleyemez (anti-input grab DoS).Hiçbir istemci ekranı kapatıp kapanmayı reddederek masaüstünü kitleyemez veya donanım kaynağını tüketip sunucuyu çökertemez.

X11 ve Modern Wayland Mimarisi Karşılaştırması#

+-------------------+-----------------------------------+-----------------------------------+ | Özellik | Klasik X11 Mimarisi | Modern Wayland Mimarisi | +-------------------+-----------------------------------+-----------------------------------+ | Girdi Gizliliği | HAYIR (XSelectInput / XRecord ile | EVET (Protokolde global girdi | | | tüm tuşlar serbestçe okunur) | dinleyici yoktur; izole aktarım) | +-------------------+-----------------------------------+-----------------------------------+ | Çıktı Gizliliği | HAYIR (XGetImage ile ekranın her | EVET (Tamponlar DRM DMA-BUF ile | | | pikseli anında çalınabilir) | doğrudan GPU'da yalıtılır) | +-------------------+-----------------------------------+-----------------------------------+ | Girdi Bütünlüğü | HAYIR (XTestFakeKeyEvent ile | EVET (Sentetik girdi kaldırıldı; | | | sahte tuş basımı yapılabilir) | libei ile izole portal şartı var) | +-------------------+-----------------------------------+-----------------------------------+ | Çıktı Bütünlüğü | KISMEN (Kök pencere ve pencere | EVET (Kompozitör sahne grafiğini | | | hiyerarşisi manipüle edilebilir) | mutlak olarak tek başına yönetir) | +-------------------+-----------------------------------+-----------------------------------+ | Kullanılabilirlik | ZAYIF (Global pointer/keyboard | GÜÇLÜ (Kompozitör odak ve yüzey | | | grab ile oturum kilitlenebilir) | ömürlerini zorla sonlandırabilir) | +-------------------+-----------------------------------+-----------------------------------+

2. Uçtan Uca Sistem ve Kompozitör Güvenlik Mimarisi#

Modern bir Linux sisteminde Wayland kompozitörü, çekirdek aygıtları ile uygulamalar arasında tek ve mutlak hakemdir:

+-----------------------------------------------------------------------------+ | FİZİKSEL DONANIM | | [Klavye / Fare] [Ekran Kartı / GPU] | +-----------------+-------------------------------------------+---------------+ | | | evdev ham olayları | DRM/KMS v v +-----------------------------------------------------------------------------+ | LINUX ÇEKİRDEĞİ | | /dev/input/event* /dev/dri/card* | +-----------------+-------------------------------------------+---------------+ | | | libinput olay işleme | GBMM / DMA-BUF v v +-----------------------------------------------------------------------------+ | WAYLAND KOMPOZİTÖRÜ | | (GNOME Mutter / KDE KWin / wlroots) | | | | +-----------------------------------------------------------------------+ | | | GÜVENLİK VE AYRICALIK MOTORU | | | | | | | | +--------------------------------+ +-----------------------------+ | | | | | wp_security_context_manager | | ext_session_lock_manager | | | | | | (Sandbox İstemci Kısıtlama) | | (Atomik Ekran Kilidi) | | | | | +--------------------------------+ +-----------------------------+ | | | | +--------------------------------+ +-----------------------------+ | | | | | libeis | | wlr-screencopy | | | | | | (Emüle Girdi Sunucusu) | | (Kısıtlı Ekran Akışı) | | | | | +--------------------------------+ +-----------------------------+ | | | +-----------------------------------------------------------------------+ | | | | +-------------------------------------|---------------------------------------+ | D-Bus / PipeWire v +-----------------------------------------------------------------------------+ | PORTAL VE MEDYA KATMANI | | | | +----------------------------+ +--------------------------+ | | | xdg-desktop-portal | | PipeWire | | | | (Kullanıcı Onay Brokerı) | | (DMA-BUF Sıfır Kopyalama)| | | +--------------+-------------+ +------------+-------------+ | +--------------------|------------------------------------|-------------------+ | | v v +-----------------------------------------------------------------------------+ | İSTEMCİ SEVİYESİ | | | | +---------------------------+ +----------------------------------------+ | | | Sandboxed Uygulama | | Ayrıcalıklı Oturum Aracı | | | | (Web Tarayıcı, Flatpak) | | (OBS Studio / Screen Locker / VNC) | | | | - Kısıtlı Wayland soketi | | - Portal onaylı PipeWire akışı | | | | - Sadece kendi yüzeyleri | | - libei onaylı sanal girdi soketi | | | +---------------------------+ +----------------------------------------+ | +-----------------------------------------------------------------------------+

3. Ayrıcalıklı İşlemler ve Modern 2026 Protokolleri#

1. Ekran Kaydı ve Ekran Paylaşımı (ScreenCast)#

  • Tarihsel Zafiyet: X11'de herhangi bir uygulama XGetImage çağırarak herhangi bir pencerenin veya tüm ekranın raster tamponunu sessizce bellek alanına kopyalayabilmekteydi.
  • Modern Protokol ve Portal Akışı:
    1. İstemci, oturum veri yolundaki org.freedesktop.portal.ScreenCast D-Bus arayüzüne CreateSession isteği atar.
    2. Portal, masaüstü kabuğunun güvenilir arayüzünü açarak kullanıcıya bir diyalog sunar: "Hangi monitörü veya hangi pencereyi paylaşmak istiyorsunuz?"
    3. Kullanıcı spesifik bir hedefi onayladığında, kompozitör hedef yüzeyin GPU tamponunu bir PipeWire düğümüne bağlar.
    4. İstemciye yalnızca bir PipeWire dosya tanıtıcısı (FD) teslim edilir. İstemci ekranın tamamını göremez; yalnızca kullanıcının onayladığı pikselleri sıfır kopyalı DRM DMA-BUF mekanizmasıyla GPU belleğinden okur.

2. Girdi Emülasyonu ve Uzaktan Masaüstü (libei ve libeis)#

  • Tarihsel Zafiyet: X11 XTest kütüphanesi, uygulamaların klavyeden rastgele tuş kombinasyonları göndermesine izin veriyordu; bu da ayrıcalık yükseltme için en sık kullanılan ilkeldi (primitive).
  • libei Mimarisi: Peter Hutterer tarafından geliştirilen ve 2026 itibarıyla standartlaşan Emulated Input System (EIS):
    • libei: Emüle edilmiş girdi gönderen istemci kütüphanesidir.
    • libeis: Kompozitör içine gömülü sunucu kütüphanesidir.
    • Akış: İstemci xdg-desktop-portal üzerinden RemoteDesktop arayüzünü çağırır. Kullanıcı izin verdikten sonra portal, kompozitörün libeis dinleyicisine bağlı bir UNIX soket dosya tanıtıcısı (ConnectToEIS) üretip istemciye döner.
    • İstemci bu soket üzerinden bir sanal klavye veya fare aygıtı tanımlar. Kompozitör, gelen olayların sentetik olduğunu bilir, onları fiziksel libinput olaylarından ayrı etiketler ve gerekirse kilit ekranında veya parola diyaloglarında bu girdileri yok sayar.
+-----------------------+ | Uzaktan Erişim App | | (AnyDesk / barrier) | +-----------+-----------+ | 1. D-Bus: org.freedesktop.portal.RemoteDesktop.SelectDevices() v +-----------------------+ | xdg-desktop-portal | <--- Kullanıcıya sorar: "Girdi kontrolü verilsin mi?" +-----------+-----------+ | 2. Onaylandı: Kompozitöre ConnectToEIS() çağrısı v +-----------------------+ | Wayland Kompozitörü | <--- libeis soket çifti (socketpair) oluşturur, | (libeis) | istemci ucunu portala döner +-----------+-----------+ | 3. Soket FD istemciye iletilir (ei_setup_backend_fd) v +-----------------------+ | Uzaktan Erişim App | <--- libei üzerinden izole EIS protokolüyle | (libei) | sanal tuş ve fare olayları yollar +-----------------------+

Derin Kaynak Kod Analizi: libei C İstemci Gerçekleştirmesi#

Geleneksel X11'de XTestFakeKeyEvent() ile tek satırda yapılan güvensiz tuş basımının aksine, libei işlem sınırlarını (ei_device_frame) ve oturum doğrulamasını zorunlu kılar:

/* libei C İstemcisi - Güvenli Sanal Klavye Girdi Enjeksiyonu */ #include <libei-1.0/libei.h> #include <linux/input-event-codes.h> #include <stdio.h> void send_emulated_keystroke (int eis_socket_fd) { /* 1. Portal tarafından sağlanan EIS soketi ile istemci bağlamı oluştur */ struct ei *ei = ei_new_sender (NULL); if (ei_setup_backend_fd (ei, eis_socket_fd) < 0) return; /* 2. Sanal donanım koltuğu (seat) ve aygıtı tanımla */ struct ei_seat *seat = ei_get_default_seat (ei); struct ei_device *kbd = ei_device_new (seat); ei_device_configure_capability (kbd, EI_DEVICE_CAP_KEYBOARD); /* 3. Atomik girdi işlem döngüsünü başlat */ ei_device_start_emulating (kbd, 1); uint64_t timestamp = ei_now (ei); /* Tuşa basış olayı (KEY_ENTER basıldı) */ ei_device_keyboard_key (kbd, KEY_ENTER, 1); /* Donanım seviyesinde olay çerçevesini tamamla (senkronizasyon) */ ei_device_frame (kbd, timestamp); /* Tuşu bırakış olayı (KEY_ENTER bırakıldı) */ ei_device_keyboard_key (kbd, KEY_ENTER, 0); ei_device_frame (kbd, timestamp + 25000); // 25ms sonra /* 4. Emülasyonu sonlandır ve belleği temizle */ ei_device_stop_emulating (kbd); ei_device_unref (kbd); ei_unref (ei); }

Kompozitör tarafında (libeis), bu soketten gelen olaylar hiçbir zaman fiziksel libinput donanım akışıyla körü körüne karıştırılmaz; is_emulated: true bayrağı ile etiketlenir ve kilit ekranı gibi hassas bağlamlarda otomatik olarak filtrelenir.


3. Oturum Kilitleme Protokolü (ext-session-lock-v1)#

  • Tarihsel Zafiyet: Eski ekran kilitleyicileri (XScreenSaver, i3lock veya ilk dönem Wayland araçları), ekranın üzerine tam ekran bir pencere açıp girdiyi "grab" ederek çalışıyordu. Eğer ekran koruyucu program bir bellek hatası (SIGSEGV) alırsa veya işletim sistemi tarafından kill edilirse, kilit penceresi anında yok oluyor ve altındaki masaüstü tüm pencereleriyle savunmasız biçimde açılıyordu.
  • Protokol Garantileri (ext-session-lock-v1):
    • Kilit istemcisi kompozitörden bir ext_session_lock_v1 nesnesi talep eder.
    • Kompozitör oturumu dondurur ve istemciye her monitör için bir ext_session_lock_surface_v1 yüzeyi tahsis eder.
    • Çökme Koruması (Crash Resilience): Eğer kilit istemcisi çökerse veya kompozitörle bağlantısı koparsa, kompozitör masaüstünü ASLA açmaz. Kompozitör ekranı kalıcı olarak opak siyaha boyar ve tüm girdi yönlendirmesini tamamen durdurur. Oturum yalnızca yeniden başlatılarak veya çekirdek konsolundan kurtarılabilir.

Derin Kaynak Kod Analizi: ext-session-lock-v1.xml ve wlroots Çökme Koruması#

Protokolün XML durum makinesi (staging/ext-session-lock/ext-session-lock-v1.xml), istemcinin oturumu açması ile yok etmesi arasındaki farkı kesinleştirir:

<interface name="ext_session_lock_v1" version="1"> <description summary="aktif oturum kilit nesnesi"> İstemci bu nesneyi alarak oturumu kilitler. Yalnızca kilit açıldığında 'unlock_and_destroy' çağrılabilir. Standart 'destroy' istemcinin kilit açılmadan sonlandığını bildirir. </description> <request name="destroy" type="destructor"/> <request name="get_lock_surface"> <arg name="id" type="new_id" interface="ext_session_lock_surface_v1"/> <arg name="surface" type="object" interface="wl_surface"/> <arg name="output" type="object" interface="wl_output"/> </request> <request name="unlock_and_destroy" type="destructor"/> <event name="locked"/> <event name="finished"/> </interface>

wlroots kütüphanesindeki (wlr/types/wlr_session_lock_v1.c) kompozitör gerçekleştirimi, istemci beklenmedik şekilde çöktüğünde masaüstünün açılmasını şu şekilde engeller:

/* wlroots wlr_session_lock_v1.c - Çökme Dayanıklılığı (Crash Resilience) Mantığı */ static void session_lock_resource_destroy (struct wl_resource *resource) { struct wlr_session_lock_v1 *lock = wlr_session_lock_v1_from_resource (resource); /* İstemci 'unlock_and_destroy' çağrısı yapmadan (yani parola doğrulanmadan) kapandıysa */ if (!lock->unlocked) { /* KRİTİK GÜVENLİK GARANTİSİ: Masaüstü pencereleri ASLA görünür hale getirilmez! */ wlr_log (WLR_ERROR, "Oturum kilitleyici istemci çöktü veya kapandı; masaüstü kilitli tutuluyor!"); /* Kilit nesnesi sıfırlanır ancak kompozitör acil durum siyah ekran modunda kalır */ lock->manager->current_lock = NULL; /* Kompozitör sahne grafiğini opak siyaha kilitler ve tüm girdi odağını düşürür */ compositor_enforce_blank_screen_fallback (lock->manager); return; } /* Yalnızca meşru unlock_and_destroy çağrısında masaüstü yüzeyleri geri çizilir */ compositor_unfreeze_normal_desktop (lock->manager); }

Bu mekanizma, bir saldırganın kilit ekranı sürecine SIGSEGV enjekte ederek veya kill -9 göndererek oturumu açabilmesini (X11'deki klasik fiziksel bypass) donanım ve protokol düzeyinde tamamen imkansız kılar.


4. Sandbox Yalıtımı (wp_security_context_manager_v1)#

  • Mekanizma: Sandbox yöneticisi (Bubblewrap / Flatpak), korumalı uygulamayı başlatmadan önce kompozitörün güvenlik bağlamı yöneticisine bir dinleme soketi (listen_fd) kaydeder.
  • Kısıtlama: Bu sokete bağlanan istemci, wl_registry sorgusunda ayrıcalıklı protokolleri (örneğin wlr-screencopy, ext-session-lock-v1, zwlr_layer_shell_v1) göremez.
  • Yuvalama Yasağı (No Nesting): Sandboxed istemcinin kendi içinde yeni bir güvenlik bağlamı oluşturması protokol kuralı olarak engellenir; böyle bir denemede kompozitör istemciyi protokolden atar.

Derin Kaynak Kod Analizi: security-context-v1.xml sözleşmesi#

staging/security-context/security-context-v1.xml içindeki durum makinesi üç adımdan oluşur ve sırası zorunludur:

<interface name="wp_security_context_manager_v1" version="1"> <request name="create_listener"> <arg name="id" type="new_id" interface="wp_security_context_v1"/> <arg name="listen_fd" type="fd" summary="listening socket FD"/> <arg name="close_fd" type="fd" summary="FD signaling when done"/> </request> </interface> <interface name="wp_security_context_v1" version="1"> <request name="set_sandbox_engine"> <arg name="name" type="string" summary="the sandbox engine name"/> </request> <request name="set_app_id"> <arg name="app_id" type="string" summary="the application ID"/> </request> <request name="set_instance_id"> <arg name="instance_id" type="string" summary="the instance ID"/> </request> <request name="commit" summary="register the security context"/> </interface>

Kurallar: set_sandbox_engine ters-DNS ad kullanır (org.flatpak gibi; engines.md iyi bilinen motorları listeler). app_id + sandbox motoru uygulamayı, instance_id + motor çalışan örneği tekil tanımlar. commit atomiktir; sonrasında destroy dışında istek protokol hatasıdır (already_used). Aynı alan iki kez kurulamaz (already_set), tutarsız meta veri invalid_metadata üretir. Yöneticinin kendisi sandbox'lı bağlantıya sunulmaz veya nested hatası gönderilir; iç içe bağlam yasaktır çünkü ayrıcalık yükseltmeye yol açabilir. Kompozitör, güvenlik bağlamlı bağlantıdan gelen istemciye ayrıcalıklı globalleri hiç ilan etmez; LD_PRELOAD kancası bile göremediği protokolü kullanamaz.


4. Tehdit Modeli ve Saldırı Yüzeyi Analizi#

+-----------------------------------------------------------------------------+ | SALDIRGAN TEHDİT MODELİ | | | | [Vektör A: Unprivileged Host Kötü Amaçlı Yazılımı] | | - Kullanıcı yetkisiyle arka planda çalışır. | | - Hedef: Parola çalmak, ekranı gizlice kaydetmek. | | - Wayland Savunması: Global dinleyici yok, ekran DMA-BUF ile kilitli. | | | | [Vektör B: Kötü Amaçlı Sandboxed Flatpak / Web Uygulaması] | | - Sandbox içinde kısıtlıdır. | | - Hedef: Wayland soketi üzerinden kompozitör zaaflarını sömürmek. | | - Wayland Savunması: wp_security_context_manager ile protokol izolasyonu. | | | | [Vektör C: Xwayland Köprüsü Üzerinden Yan Kanal Saldırıları] | | - Hedef: X11 uyumluluk katmanındaki eski uygulamaları dinlemek. | | - Wayland Savunması: Xwayland istemcileri bağımsız X11 köklerinde izole | | edilir; Wayland pencereleri Xwayland'e görünmez. | +-----------------------------------------------------------------------------+

Xwayland Güvenlik Çıkmazı#

Wayland'e geçiş sürecinde en büyük güvenlik açığı X11 uyumluluk katmanı olan Xwayland olmuştur.

Eğer bir kullanıcı hem Wayland uygulamaları hem de Xwayland altında çalışan eski yazılımlar kullanıyorsa:

  1. Bir Xwayland istemcisi, aynı Xwayland sunucusuna bağlı diğer tüm X11 istemcilerinin girdilerini dinleyebilir ve piksellerini çalabilir.
  2. Ancak modern bir kompozitörde Xwayland istemcileri, saf Wayland yüzeylerinin piksellerini veya girdilerini ASLA göremez.
  3. 2026 yılı kompozitörleri (Mutter, KWin), güvenlik açısından kritik uygulamalar için Xwayland'i varsayılan olarak devre dışı bırakmakta veya her uygulama için ayrı bir izole Xwayland örneği (rootless multi-instance Xwayland) ayağa kaldırmaktadır.

5. Pratik İnceleme ve Kompozitör Teşhis Laboratuvarı#

Aşağıdaki komutlarla çalışan bir sistemde kompozitörün ayrıcalık yönetimini ve aktif protokollerini denetleyebilirsiniz:

1. Kompozitör Tarafından Sunulan Protokolleri Listeleme#

# Sistemdeki Wayland global nesnelerini ve versiyonlarını listele wayland-info
  • İnceleme: Çıktıda wp_security_context_manager_v1, ext_session_lock_manager_v1 ve zwlr_screencopy_manager_v1 arayüzlerinin varlığını arayın.
# Güvenlik ve kısıtlama protokollerini filtrele wayland-info | grep -E 'security_context|session_lock|screencopy|input_capture'
  • Beklenen Durum: Güvenli bir masaüstünde ext_session_lock_manager_v1 bulunmalıdır. screencopy protokolü genel istemcilere açıksa, unprivileged süreçlerin doğrudan ekran görüntüsü alabilme riski mevcuttur.

2. PipeWire Ekran Paylaşım Düğümlerini Denetleme#

# Aktif ekran paylaşımı veya medya akışlarını PipeWire üzerinden izle pw-cli list-objects Node | grep -E 'node.name|media.class'
  • Güvenlik Yorumu: Ekran kaydı açıkken media.class = "Video/Source" düğümü görünür. Eğer siz bir kayıt başlatmadığınız halde burada aktif bir PipeWire akışı varsa, bir uygulamanın arka planda ekranınızı okuduğu anlamına gelir.

3. Oturum Kilit Durumu ve loginctl#

# Oturumun işletim sistemi seviyesinde kilitli olup olmadığını kontrol et loginctl show-session "$XDG_SESSION_ID" -p LockedHint
  • Çıktı Analizi: Ekran kilitlendiğinde bu değerin LockedHint=yes olması gerekir. Eğer ekran görsel olarak kilitli görünüyor ancak bu değer no ise, kilit arayüzü oturum yöneticisiyle doğru entegre olmamış demektir.

4. Çekirdek Girdi Cihazı İzinlerini Doğrulama#

# uinput ve evdev izinlerini listele ls -l /dev/uinput /dev/input/event*
  • Beklenen Güvenli Durum: Cihaz düğümleri yalnızca root ve input grubuna ait olmalı; standart kullanıcılar doğrudan okuma/yazma iznine sahip olmamalıdır.

6. Arayüz ve Kompozitör Tasarımcıları İçin Güvenlik İlkeleri#

Eğer bir Wayland kompozitörü, kabuk bileşeni veya ayrıcalıklı istemci geliştiriyorsanız, aşağıdaki kurallar bağlayıcı güvenlik prensipleridir:

  1. Hiçbir Arayüzü Varsayılan Olarak Erişilebilir Kılmayın: Ayrıcalıklı bir Wayland protokolü (session-lock, screencopy, layer-shell), rastgele bağlanan tüm istemcilere wl_registry.global ile duyurulmamalıdır. Yalnızca yetkilendirilmiş, güvenilir veya kompozitör tarafından başlatılmış istemciler bu arayüzleri bağlayabilmelidir.

  2. Bağlantı Başarısızlıklarını Güvenli Tasarlayın: Yetkisiz bir istemci ayrıcalıklı bir global nesneye bind çağrısı yaptığında, kompozitör ya bu çağrıyı sessizce yutmalı ya da istemciye bir protokol hatası (wl_error) göndererek istemci bağlantısını derhal kesmelidir.

  3. Çalışma Zamanında Yetki Geri Alma (Revocation) Desteği Sağlayın: Kullanıcıya ekranını paylaşma yetkisi verildiğinde bu kalıcı bir açık kapı olmamalıdır. Kompozitör veya portal, panelde sürekli bir kırmızı gösterge sunmalı ve kullanıcı göstergeye tıkladığı anda DMA-BUF tampon akışını anında sonlandırabilmelidir.

  4. İstemcinin Kendi Kimlik Beyanına Güvenmeyin: İstemcinin D-Bus veya Wayland üzerinden gönderdiği uygulama adı veya simge dizgisi asla doğrudan kabul edilmemelidir. Kimlik doğrulama, işletim sistemi çekirdeğinin sağladığı SO_PEERCRED, /proc/[PID]/root veya Flatpak metadata dosyaları üzerinden yapılmalıdır.


7. Özet ve 2026 Durumu#

Wayland'in sunduğu en büyük devrim, performanstan veya pencere efektlerinden önce güvenlik mimarisidir.

  • 2010'lu yılların başlarında X11'in açtığı güvenlik deliklerini kapatmak için yola çıkan Wayland, 2026 yılı itibarıyla ekran yakalama (PipeWire), girdi emülasyonu (libei), oturum kilitleme (ext-session-lock-v1) ve sandbox yalıtımı (wp_security_context_manager_v1) standartlarıyla olgunlaşmış ve eksiksiz bir güvenlik sınırına kavuşmuştur.
  • Artık Linux masaüstünde ayrıcalıklı bir işlem yapmak, tüm oturumun güvenliğini tehlikeye atmak zorunda değildir; her ayrıcalık, kullanıcının denetiminde ve kompozitörün katı hakemliğinde işletilmektedir.

Metin Giriş Yöntemi Görünürlüğü: input-method-v1 yüzeyi#

Protokol yığınının bir katmanı oturum (seat) ile metin alanı arasına oturur: input method'lar. IBus ve Fcitx gibi framework'ler, kompozitörün tuş vuruşlarını kompozisyon ve öneri için bir input method motoruna iletebilmesi amacıyla bir Wayland istemci protokolü (input-method-v1) sunar. Kompozisyon yapabilmek için motor, bir metin alanının ham tuş olaylarını alır — pratikte masaüstü içinde ayrıcalıklı bir dinleyici gibi çalışır.

Bu yüzden bir input method istemcisi gerçek bir keylogging yüzeyidir. Ele geçirilmiş veya kötü niyetli bir IM eklentisi, kullanıcının uygulama daha görmeden yazdıklarını yeniden kurabilir; bunu meşru bir Wayland protokolü üzerinden ve çekirdek ayrıcalığına gerek olmadan yapar. Savunma kompozisyondur: masaüstünde mümkün olan en az IM backend'ini tutun, yalnızca kullandığınız backend'leri kurun, platform destekliyorsa sandbox'ta çalıştırın (Flatpak GNOME runtime'ı çoğu kurulumda IBus'i Flatpak sandbox'ında çalıştırır) ve Latin dışı girdiye ihtiyacı olmayan sistemlerde IM'i devre dışı bırakıp yüzeyi kapatın.

İlgili ama daha düşük görünürlüklü bir protokol text-input-v1/text-input-v3'tür; metin alanı IM'e neyi değiştirmesi gerektiğini bu yolla söyler. input-method-v1 kadar güçlü değildir — ham olayları vermez — ama buffer içeriklerini yine de IM sürecine taşır. Denetimi aynı kuralla yapın: daha az IM istemcisi, tuş vuruşlarına daha az yol.

X11'de bu düzeyde eşdeğer bir sınır yoktur; IBus/Fcitx orada ham X inputunu doğrudan okur, bu da X11 input modelinin daha geniş sayılmasının nedenlerinden biridir. Wayland'in oturum bölümü — klavye olayları kompozitörden geçer ve yalnızca oturuma katılan input-method-v1 istemcisi bunları görür — gerçek bir daraltmadır ve bunu açıkça söylemek gerekir, Wayland'in problemi sihirli biçimde kaldırdığını varsaymak yerine.

Oturum Seviyesinde Gerçek: RemoteDesktop v2, EIS ve Kalıcılık#

Kullanıcının "uzak girdiye izin ver" olarak gördüğü şey bir oturumdur, bir anahtar değildir. org.freedesktop.portal.RemoteDesktop arayüzü (sürüm 2) yaşam döngüsünü açıkça tanımlar:

  1. CreateSession, arayanın sahip olduğu bir oturum nesnesi açar.
  2. SelectDevices istenen aygıt sınıflarını bildirir — klavye, pointer, dokunmatik ekran — ve masaüstünün hangilerine izin verdiğini döndürür.
  3. Start onay diyaloğunu gösterir; başarıldığında oturum canlıdır.

Ancak o andan itibaren girdi enjekte edilebilir. İki enjeksiyon yolu vardır ve analist için farkı önemlidir:

  • EIS (önerilen): ConnectToEIS arayana libei gönderici bağlamını destekleyen bir dosya tanımlayıcı verir; olaylar EI protokolü üzerinden bu fd üzerinden akar. Bu yol bağlandıktan sonra D-Bus Notify* yöntemleri kullanılmamalıdır; oturum pratikte özel bir boruya verilmiş olur.
  • D-Bus Notify* yöntemleri: NotifyPointerMotion, NotifyPointerMotionAbsolute, NotifyKeyboardKeycode, NotifyTouch* gibi her olay D-Bus çağrısı olarak gönderilir. libei bağlantısına gerek duymadan çalışır ama her olay bir D-Bus işlemidir; bu yüzden daha gevezedir ve sistem veri yolu izleyicisinde daha kolay fark edilir.

Kalıcılık v2'de değişti. Uygulama persist_mode isteyebilir ve bir restore_token alabilir, böylece kullanıcı her açılışta yeniden onay vermez. Burada oluşturulan oturumlar sahiplik merkezidir: uzak masaüstü oturumu ekran yakalamayla birleştirildiğinde kalıcılık org.freedesktop.portal.RemoteDesktop üzerinden yönetilir ve ScreenCast.SelectSources üzerindeki eşleşen seçenekler kullanılmamalıdır. Panolar paylaşımı, aynı oturum kapsamında ayrı bir izin olan Clipboard.RequestClipboard ile çekilir.

Tespit açısından kullanışlı değişmez: Bu portal üzerinden sentetik girdi enjekte eden her şey ya canlı bir RemoteDesktop oturum tutamacına sahiptir (EIS fd'si veya D-Bus yöntem akışı) ya da portala hiç girmez (bu, tamamen farklı bir sınır olan evdev/uinput yoludur — keylogging serisine bakın). Oturum tutamacı, sistem veri yolunda portalın oturum tablosunda görünür (org.freedesktop.portal.Desktop/SessionX benzeri nesneler); çalışan sistemde savunmacının en ucuz bakısı budur.

Kaynak kod karşılığı: protokol neyi garanti eder?#

Bu bölümdeki izolasyon iddiaları Wayland'in kendi kodundan doğrulanabilir (wayland-src klonunda):

  • protocol/wayland.xml: wl_seat sürüm 11 bir klavye+fare+dokunmatik grubudur; get_keyboard bu seat'e ait wl_keyboard döndürür. wl_keyboard mantıksal durumu aktif yüzey, basılı tuşlar, değiştiriciler ve gruptur. enter aktif yüzeyi kurar (zaten varsa gönderilmez), leave sıfırlar, key (serial, time, key, state) yalnızca hemen öncesinde aktif yüzey varsa gönderilir. key ham platform kodudur; xkb_v1 keymap'te +8 ile anlam kazanır. repeat_info v4, release v3, repeated durumu v10 ile geldi.
  • src/wayland-client.c:66: struct wl_proxy içinde display, queue, refcount, user_data, dispatcher, version vardır. :659 wl_proxy_add_listener kuralı: dinleyici veya dispatcher varsa -1 döner, wrapper ise abort eder. Ayrıcalıklı dinleyici taklidi bu yüzden ikinci kurulumda ölür.
  • Pratik sonuç: LD_PRELOAD ile wl_keyboard_interface yakalama (Aishou/wayland-keylogger, Keylogger.cpp:129-162) yalnızca bulaştığı sürecin kendi proxy'sini görür; komşu istemcinin enter/key akışı o sürece hiç uğramaz. Detaylı PoC çözümlemesi için keylogging serisine bakın.

İlgili İncelemeler ve Dahili Bağlantılar#

---
Bu yazıyı paylaş:
TwitterLinkedInFacebook

Ne düşünüyorsun?

Tepki bırakarak geri bildirim ver

İlgili Yazılar