- D-Bus, uygulamalar arası iletişim için kullanılan bir veri yoludur; fikir olarak faydalı olsa da uygulaması son derece zayıf ve standart dışı
- Standart dokümantasyonu eksik ve tutarsız, ayrıca gerçek uygulamalar buna uymadığı için uyumluluk çöküşü yaşanıyor
- Güvenlik açıkları da ciddi; bir uygulama, kilidi açılmış durumdayken başka bir uygulamanın gizli verilerini okuyabiliyor
- Buna karşılık yazar, yeni bir veri yolu sistemi olan
hyprtavern ile hyprwire protokolünü geliştiriyor
hyprtavern, katı tip denetimi, yerleşik yetki yönetimi, güvenli gizli depolama (kv) gibi özelliklerle D-Bus'un yapısal sorunlarını çözmeyi hedefliyor
D-Bus'un kavramı ve sınırları
- D-Bus, uygulama ve servislerin paylaşılan bir veri yolu (
bus) üzerinden metotlarını ve özelliklerini sunmasına ve birbirini çağırmasına imkân veren bir sistem
- Örneğin hava durumu servisi sunan bir uygulama veri yoluna API kaydederse, diğer uygulamalar bunu bulup kullanabilir
- Ancak D-Bus, aşırı derecede esnek ve yapısız tasarımı nedeniyle herhangi bir nesnenin rastgele metot kaydetmesine ve çağırmasına izin veriyor
- Bu da "Garbage in, garbage out" durumuna yol açıyor
Standart dokümantasyon ve uygulama karmaşası
- D-Bus standart dokümantasyonu birden fazla yere dağılmış, tamamlanmamış ve anlaşılması zor durumda
- Gerçek uygulamalar ya buna uymuyor ya da birbirinden farklı belirtimleri keyfî biçimde kullanıyor
- Yazar,
xdg-desktop-portal-hyprland geliştirirken restore_token belirtimini uyguladığını,
ancak tüm uygulamaların resmî olmayan restore_data alanını kullandığı için bunun uyumlu olmadığını açıklıyor
- D-Bus'un
variant tipi (a{sv}) keyfî veri aktarımına izin verdiğinden, protokol tutarlılığını bozan başlıca nedenlerden biri olarak gösteriliyor
Güvenlik yapısındaki kusurlar
- D-Bus'ta merkezî yetki yönetimi veya reddetme mekanizması bulunmuyor
- Tüm uygulamalar diğer uygulamaların çağrılarını görebiliyor ve açık bir güvenlik önlemi yoksa sınırsız erişim mümkün oluyor
gnome-keyring, kwallet gibi gizli depo sistemleri de yapısal olarak zayıf
- Depo kilidi açıldığında tüm uygulamalar tüm gizli verilere erişebiliyor
- Yazar bunu "güvenlik açısından şaka düzeyinde" diye nitelendiriyor
Yeni alternatif: hyprwire ve hyprtavern
- Yazar, D-Bus'un sorunlarını çözmek için yeni bir veri yolu sistemi olan
hyprtavern geliştiriyor
hyprwire, Wayland tasarımından ilham alan yalın ve tutarlı bir wire protokolü
- Tip zorlaması, hızlı bağlantı ve basit yapı gibi özelliklere sahip
hyprtavern, uygulamaların protokol tabanlı nesneleri kaydedip birbirini keşfettiği bir yapı sunuyor
- Yerleşik yetki sistemi, katı protokol uyumu, basitleştirilmiş API ve güvenli varsayılanlar sağlıyor
hyprtavern-kv (güvenli anahtar-değer deposu)
- D-Bus Secrets API'sinin yerine geçen temel (
core) protokol
- Bir uygulamanın kaydettiği sırlar yalnızca o uygulama tarafından okunabiliyor ve numaralandırma (
enumeration) yapılamıyor
- Flatpak, Snap, AppImage uygulamaları için kimlik tabanlı erişim denetimi de planlanıyor
- Veriler her zaman şifreli olarak saklanıyor ve parola ayarlandığında gerçek güvenlik garantisi sağlanabiliyor
- Tüm uygulamalar güvenli gizli depo işlevinden varsayılan olarak yararlanabiliyor
Geliştirme durumu ve gelecek planları
hyprtavern hâlâ geliştirmenin erken aşamasında ve gelecekte Hyprland 0.54 sürümünde dahili olarak kullanılması planlanıyor
- İlk benimsenmenin sınırlı olacağı öngörülse de kademeli geçiş mümkün
- D-Bus'tan farklı olarak birden fazla oturum veri yolu paralel çalıştırılabildiği için uyumluluk proxy'leri yazmak da mümkün
- C++ ile yazıldı ve Rust, Go, Python bağlayıcıları da kolayca geliştirilebilir
- Yazar, "D-Bus temelden düzeltilemez; tamamen yeniden tasarlanması gerekir" diye vurguluyor
SSS özeti
- "Tekerleği yeniden icat etmek" eleştirisine karşı, D-Bus'un temel tasarımının bozuk olduğu ve bu yüzden yeniden tasarımın kaçınılmaz olduğu söyleniyor
- Dokümantasyon şu anda WIP (çalışma aşamasında) durumunda ve tamamlandığında yayımlanacak
- Wayland'ın kullanılmama nedeni, genel amaçlı IPC için uygun olmaması
- D-Bus uyumluluk proxy'si (
hyprtavern-dbus-notification-proxy) yazmak mümkün
- Rust yerine C++ kullanılmasının nedeni, geliştiricinin ana dilinin C++ olması
- Güvenlik açısından
LD_PRELOAD saldırıları tamamen engellenemese de, saldırının zorluğunu ve tespit edilebilirliğini artıran bir yapı hedefleniyor
Sonuç
- D-Bus, standart dışılık, güvenlik eksikliği ve tutarsızlık nedeniyle Linux masaüstü ekosisteminde bir darboğaz olarak görülüyor
hyprtavern, bunun yerine geçebilecek modern ve güvenli bir IPC veri yolu olarak geliştiriliyor ve
Hyprland ekosistemi merkezli kademeli bir benimsenme bekleniyor
- Amaç, "userspace'i daha yaşanabilir hâle getirmek"
1 yorum
Hacker News yorumları
GNOME’un gizli depoya erişim zafiyeti tartışmasını görünce, GNOME ekibinin sorunu “güvenilmeyen uygulamalar gizli servisle iletişim kuramaz” güvenlik modeline dayanarak reddetmesi komik geliyor
GNOME gerçekten de palyaço ekibi tarafından yürütülen bir proje gibi duruyor
Biri “yeni bir bus’ı kendim yapacağım” deyince, zaten milyarlarca cihaza dağıtılmış olan Binder’ı yeniden kullanmayı önermiş
Binder, Android’in temel IPC mekanizması ve arkasında çok daha fazla geliştirici ile sahada doğrulanmış kod var
İlgili yazılar: LWN, Rust-for-Linux mailing list
Hyprwire ve Hyprtavern için umutlanmıştım ama neredeyse hiç belge ya da test yok
Bu projeler iyi bir başlangıç noktası olabilirdi, o yüzden biraz hayal kırıklığı yarattı
OpenWrt geliştiricileri zaten uzun zaman önce ubus adlı bir alternatif yapmıştı
Bakınız: ubus docs, ubus vs dbus karşılaştırması
Ama güvenlik modeli neredeyse yok ve OpenWrt’nin yapısı düşünüldüğünde bunun makul nedenleri var
D-Bus’un sorunlarından biri, tarayıcı eklentilerinin GNOME/KDE ile iletişim kurarken ortaya çıkan zafiyetler
Sadece bir web sitesini ziyaret ederek bile D-Bus API’si flood edilip masaüstü kilitlenebiliyordu
Eğer güvenlik araştırmacısıysan, D-Bus gerçekten incelenmeye değer bir alan
D-Bus, Linux masaüstünde XPC, COM ve Android IPC’ye en yakın şey
Ama masaüstü parçalanmışlığı yüzünden birleşik bir geliştirme yığını kurmak zor
GNOME için yaptığın şey KDE’de işe yaramıyor, XFCE ve Sway ise bambaşka tarafta
KWallet ya da GNOME Keyring gibi gizli depoların, kilit açıldıktan sonra fiilen tüm uygulamalara açık olduğunu ilk kez öğreniyorum
seahorsearayüzüyle baktığımda çoğunlukla Chromium ile ilgili anahtarlar ve JetBrains hesap token’ları gördümDüz metin parolalar yoktu ama kötü niyetli bir uygulama Chromium verilerini kurcalarsa daha fazlasını bulabilir gibi geliyor
Sistem erişim sırasında bildirim vermiyorsa, hangi yazılımın yönettiğinin çok büyük bir farkı yok
“Neden ille de genel amaçlı bir bus protokolüne ihtiyaç var?” diye soruyorum
Unix domain socket üzerinde HTTP ya da basit bir JSON protokolü kullanmak yeterli olur
Yetki yönetimi, SSH forwarding, container mount gibi şeyler de zaten destekleniyor
D-Bus; servis, arayüz, yol, metot gibi yapılarla karmaşık bir düzen kuruyor ama buna rağmen mesaj tanımlama eksik kalıyor ve uygulamaya özgü protokol ayrıntılarını bilmek gerekiyor
Sonuçta proxy işlemek de zorlaşıyor ve ortaya gereğinden fazla karmaşık bir sistem çıkıyor
D-Bus’un tasarımı, “en iyi çözümün her zaman seçilmediği” rastlantısallık yasasına bir örnek gibi duruyor
Tıpkı React’tan daha iyi sayısız framework olmasına rağmen yeterince bilinmedikleri için görünmez olmaları gibi
GNOME’un zafiyet bildirimine karşı çıkarken Flatpak sandbox erişim kısıtlarını öne sürmesi, bana eski bir Microsoft blog yazısını hatırlattı
Üstelik alıntıyı ekran görüntüsü olarak paylaşıp kopyalanamaz hale getirmelerini gerçekten anlayamıyorum