- Landlock, uygulamaların erişebileceği kaynakları açıkça bildirerek çekirdek seviyesinde kendi kendini sandboxlama yapmasını sağlayan bir Linux güvenlik API'sidir
- Mevcut SELinux veya AppArmor'dan daha basit olup, geliştirici yetkisi olmadan çalıştırma anında politika oluşturup uygulayabilir
- Politikalar erişilebilir dosya, dizin ve port gibi öğeleri açık izin listesi (allowlist) şeklinde tanımlar; katmanlı kısıtlama ile kademeli güvenlik artırımı sağlar
- Rust, Go, Haskell gibi dillerde bağlayıcılar bulunur ve GUI uygulamaları, sunucular ve masaüstü süreçleri gibi çeşitli ortamlarda ince ayarlı erişim kontrolü uygulanabilir
- Linux güvenlik ekosisteminde basit ve pratik bir yetkisiz sandbox aracı olarak, gelecekte masaüstü güvenliğini güçlendiren ana bileşen olarak öne çıkıyor
Landlock Özeti
- Landlock, Linux uygulamalarının erişebileceği kaynakları açıkça tanımlamasını sağlayan bir API
- OpenBSD'nin
unveil() ve pledge() kavramlarına benzer ve “yalnızca gerekli kaynaklara izin ver, geri kalanını engelle” ilkesine dayanır
- Mevcut Linux güvenlik mekanizmalarından daha kolay anlaşılan ve entegre edilebilen bir geliştirici dostu savunma katmanı sunar
- Amacı, Landlock kullanımını teşvik etmek
Çalışma Şekli
- Linux Security Module (LSM) biçiminde, Linux 5.13'ten itibaren kullanılabilir
- SELinux veya AppArmor'dan farklı olarak, süreç bazlı geçici kısıtlama (transient restriction) uygulanır
- Politika çalışma zamanında oluşturulur ve yalnızca mevcut iş parçacığı ile çocuk süreçlere uygulanır; süreç sonlandığında kaybolur
- Politika bileşenleri
- Handled accesses: kısıtlanacak işlem kategorileri (ör. dosya sistemi okuma/yazma)
- Access grants: izin verilecek nesnelerin açık listesi
- Örnek politika
/home/user yalnızca okunur
/tmp okuma/yazma
2222 portuna bağlanma izni
landlock_restrict_self() çağrısı ile bu iş parçacığı ve çocuk süreçler kalıcı olarak kısıtlı alana girer
- Kısıtlama geri alınamaz, en fazla 16 katman (layer) üst üste eklenebilir
- Alt katmanlar erişimi daha da azaltabilir ancak üst katmanda kaldırılan yetkiler geri yüklenemez
- Yetkisiz (unprivileged) çalışma ile, sıradan uygulamalar da kendi sandboxlarını kullanabilir
- ABI versiyonlama ile eski çekirdeklerde mümkün olan aralıkta çalışır
- Stackable LSM olduğundan SELinux ve AppArmor ile birlikte kullanılabilir
Kullanım Nedenleri
- Tahmin edilebilir dosya erişim desenine sahip uygulamalar için uygundur
- Örn: bir web sunucusunun erişimi yalnızca
/var/www/html ve /tmp ile sınırlandırılabilir
- Yönetici müdahalesi veya sistem genelinde ayar gerekmeyecek, politika doğrudan kod içinde tanımlanabilir
- Yetki yükseltme olmadan kullanılabilir, çoğu programa kolayca entegre edilebilir
- Rust, Go, Haskell için bağlayıcılar bulunur,
unveil tarzı sarmalayıcı projeler de birçoğu mevcuttur
- Resmi bir C kütüphanesi henüz yok olsa da, çeşitli gayriresmi uygulamalar kullanılabilir
- Rust örnek kodunda
/usr, /etc, /dev yalnızca okunabilir olarak, /home, /tmp ise okuma/yazma erişimiyle ayarlanır
Linux'ta Sandboxing Durumu ve Gereklilik
- Linux kullanımıyla birlikte masaüstü odaklı kötü amaçlı yazılımlar da artmaktadır
- Linux'un görece güvenli olması yapısal güvenlikten değil, pazar payı ve teknik engeller nedeniyle
- Yaygın dağıtımların sorunları
- Güvenilmemiş ikililerin çalıştırılabilmesi
- İnternetten doğrudan betik çalıştırılabilmesi
- Parolasız sudo kullanımı
- Standart bir uygulamanın
$HOME içindeki hassas dosyalara erişebilmesi
- X11 ortamında tuş takibi yapılabilmesi
- Rasgele porta bağlanabilme
Mevcut Güvenlik Araçlarının Sınırlamaları
- Containerization (Docker, Podman): Hizmet izolasyonu için uygun ama masaüstü uygulamalar için uygun değil,
--privileged seçeneğiyle izolasyonun etkisizleştirildiği örnekler vardır
- Flatpak / Snap: GUI uygulamaları için uygun ama izin kapsamı aşırı geniş, CLI araçları için uygun değil
- Firejail: Uygulama başına profil gerekir, her çalıştırmada açıkça çağrılması gerekir
Geliştirici Bakış Açısından Mevcut Mekanizmalar
- seccomp: Güçlü ama yapılandırması karmaşık ve kara liste yaklaşımı kırılgan
- SELinux: Güçlü ama karmaşık ve yönetici politikası gerekli, çoğu yaygın dağıtımda varsayılan olarak devre dışı
- AppArmor: SELinux'tan daha basit olsa da yine yönetici profili gerekir, bazı dağıtımlarda devre dışı
Landlock'un Avantaj Özeti
- Yetkisiz, uygulama odaklı, kolay entegre edilebilir, varsayılan reddetme (deny-by-default)
- Linux 5.13 sonrası yaygın destek, geri/ileri uyumluluk korunur
- Mükemmel olmasa da, basit ve bağımsız yetkisiz bir sandbox aracı olarak boşluğu doldurur
Landlock'un Uygulanabilirliği
- Yüksek ayrıcalıklı daemon süreçleri uzun süre çalışırken Landlock ile erişim alanı sınırlandırılabilir
- PDF okuyucu, resim görüntüleyici, web tarayıcı, kelime işlemci gibi uygulamaları yalnızca açılmış dosyalara erişecek şekilde sınırlandırabilirsiniz
- FTP/HTTP sunucuları yalnızca gerekli dosyalara erişecek şekilde yapılandırılabilir
- Örn: nginx root ile çalışsa bile saldırganın bir kabuk alması durumunda bile politikada olmayan dosyalara erişimi olmaz
- Supervisor önerisi uygulanırsa, Linux masaüstüne Android benzeri bir yetkilendirme sistemi eklenebilir
- GUI ve yetki depolama sistemi ile birleştiğinde daha güvenli bir kullanıcı deneyimi mümkün olur
Landlock'ta Devam Eden Özellik Geliştirme
- Supervise Mode: Kullanıcı alanında erişim izni verme/ret etme etkileşimli kararına dönüşür, Android benzeri izin istemi benzeri davranır
- Socket Restrictions: Sürecin kullanabileceği soket türleri ve portları üzerinde daha ince kontrol
- LANDLOCK_RESTRICT_SELF_TSYNC: Kısıtlamayı süreç içindeki tüm iş parçacıklarına yayar
- LANDLOCK_ADD_RULE_QUIET: Belirli nesneler için denetim log mesajını bastırır
- LANDLOCK_ADD_RULE_NO_INHERIT: Üst dizin yetkisinin alt dizinlere miras kalmasını engeller, dosya sistemi kontrolünde ayrıntılı ayar sağlar
Özet
- Landlock, basit ve yetkisiz tabanlı varsayılan reddedici bir sandbox mekanizması
- Anlaşılması ve entegrasyonu kolaydır ve Linux masaüstü ve uygulama güvenliğini artırma konusunda büyük potansiyele sahiptir
- Geliştirici, uygulamasına Landlock'u doğrudan ekleyerek güvenlik seviyesini artırabilir
1 yorum
Hacker News görüşü
C ile basit bir program yazıp yalnızca belirli bir portun dinlenmesine izin verdim, diğer tüm ağ bağlantılarını engelledim
sandboxer.cörneğine baktım ve dosya erişim kısıtlarına dokunmadan sadece ağı kontrol ettimEngellenen bağlantılar
dmesgiçinde görünüyor; muhtemelen audit özelliği sayesindeBu araç ayrıcalıksız kullanıcı modunda çalışıyor ve konteyner içinde de güvenlik duvarı ayarı olmadan gayet iyi çalışıyor
Yine de bunun kötü niyetli bir programı tamamen durdurmak için uygun olduğunu düşünmüyorum
Issue #28 ve ilgili mail dizisine bakılırsa, sandbox kurallarının var olmayan dizinlere başvuramaması gibi bir sorun var
Örneğin
~/.sshhenüz yokken bir kural eklerseniz, dizin daha sonra oluşturulsa bile erişim engellenmiyorYani güvenlik açısından bir açık oluşabiliyor
Bunları en az ayrıcalıkla çalıştırmak epey zahmetli
“Microlandia” çalışmıyor ama diğer Unity oyunları gayet iyi açılıyor
Landlock tabanlı araçların çoğalmasını ve böyle işleri kolaylaştırmasını umuyorum
CRI’lar kendi arayüzlerini tanımlamaya çalışıyor gibi görünüyor ama bu kaçınılmaz olarak çekirdek desteğinin gerisinden gelecektir
Çoğu altyapı sorumlusunun uygulama bazında sandbox politikalarını bakımını yapacağını sanmıyorum
Uygulamanın Landlock’u doğrudan kullanması daha gerçekçi görünüyor
runtime sistem çağrılarını olduğu gibi geçirirse uygulamanın kendi kendini kilitlemesine güvenmek zorunda kalınacağı sorununu açıklıyor
Dahili olarak benzer API’ler kullanarak kritik süreç yönetimi yapıyoruz
Bu tür araştırmalar düzenlemeye tabi sektörler için de çok faydalı olacaktır
Çekirdek özelliğiyse C API’nin doğal olarak önce gelmesi gerekmez miydi, neden yok merak ediyorum
libc bunun üstüne oturan bir katmandır ve bugün bile libc içinde sarmalayıcısı olmayan pek çok syscall var
İsterseniz header’ları kendiniz yazıp
_syscallNmakrosuyla çağırabilirsinizlandbox gibi basit bir sarmalayıcı kullanılabilir,
Rust veya Go da C FFI sunabilir
Çekirdekteki sandboxer.c örneği yeterince yol gösterici
Landlock’la aynı şey değil ama tamamlayıcı olarak kullanılabilir
/sysayarları yerine yeni syscall’lar eklemiş olması ilginçMuhtemelen ayrıcalıksızlık ilkesi yüzündendir
seccomp ile Landlock syscall’larını engellemenin mümkün olup olmadığını da merak ediyorum
Eski seccomp politikaları Landlock numaralarını içermiyorsa SIGSYS oluşabilir mi?
Dosya sistemi tabanlı API’lerde çok fazla footgun var ve dirfd tabanlı erişim denetimi için syscall daha uygun
İyi yazılmış seccomp filtreleri -ENOSYS döndürerek bunu basitçe “desteklenmiyor” gibi gösterir
Çünkü Landlock mevcut yetkileri daha da kısıtlar, yeni yetkiler vermez
Mac’ten çıkıp tamamen Linux’a geçmeye hazırlanıyorum ve Landlock’un zararlı yazılım savunmasına nasıl katkı sağlayabileceğini merak ediyorum
Örneğin
~/.ssherişimini otomatik reddeden bir ortam kurmak istiyorumAyrıca bununla bir uygulama başlatıcısı yapılıp yapılamayacağını da bilmek istiyorum
Amaç, uygulamanın kendi ihtiyaç duymadığı yetkileri kısıtlayarak saldırganın sistemi ele geçirmesini önlemektir
~/.ssherişimini engellemek gibi şeyler için AppArmor veya SELinux gibi bir MAC modeli gerekirLandlock, uygulamanın kendisini ya da alt süreçlerini kısıtlaması gerektiğinde faydalıdır
Örneğin npm’in post-install betiklerini yalnızca build diziniyle sınırlaması gibi
OpenBSD’deki pledge gibi, uygulama geliştiricisinin doğrudan kullandığı bir API’dir
Ancak Linux’ta ekosistem daha parçalı olduğu için benimsenmesi yavaş olacaktır
Bu arada wrapper veya launcher biçiminde kullanmak daha gerçekçi
Sonuçta sadece program kendi yetkilerini biliyorsa etkili olur
Uygulama başta ihtiyaç duyduğu kaynakları whitelist’e alır, geri kalan her şeyi engeller
Amaç kötü niyetli yazılımlara karşı savunma değil, kendi sürecini korumaktır
Standart kütüphanede zaten syscall varken, ayrıca ayrı bir kütüphaneye gerçekten ihtiyaç var mı?
man7 belgesi de mevcut
Buradaki asıl isteğin yalnızca bir soyutlama katmanı olup olmadığını merak ediyorum
glibc’nin hâlâ Landlock arayüzü sunmuyor olması şaşırtıcı
Muhtemelen Linux dışı uyumluluk kaygılarındandır