Son zamanlarda, Cosmopolitan C standart kütüphanesinin ve Redbean platformunun yazarı, Linux için pledge() izolasyon mekanizmasının uygulamasını duyurdu.
Başlangıçta OpenBSD projesi tarafından geliştirilen pledge, uygulamaların kullanılmayan sistem çağrılarına erişimini seçici olarak yasaklamanıza olanak tanır (uygulama için bir sistem çağrıları beyaz listesi oluşturur ve diğer çağrıları yasaklar). Linux'ta bulunan seccomp gibi sistem çağrısı erişim kontrol mekanizmalarının aksine, pledge baştan sona olabildiğince kullanıcı dostu olacak şekilde tasarlanmıştır.
Systrace mekanizmasını kullanarak OpenBSD temel ortamındaki uygulamaları izole etmeye yönelik başarısız girişim, bireysel sistem çağrıları düzeyinde izolasyonun çok karmaşık ve zaman alıcı olduğunu gösterdi.
Alternatif olarak, ayrıntılara girmeden ve hazırlanmış erişim sınıflarını manipüle etmeden izolasyon kuralları oluşturmaya olanak tanıyan bir taahhüt önerildi.
Örneğin, sunulan sınıflar stdio (giriş/çıkış), rpath (salt okunur dosyalar), wpath (dosya yaz), cpath (dosya oluştur), tmppath (geçici dosyalarla çalışma), inet (soket ağı), unix (unix soketleri) ), dns (DNS çözünürlüğü), getpw (kullanıcı veritabanına okuma erişimi), ioctl (ioctl çağrısı), proc (işlem kontrolü), exec (başlangıç işlemleri) ve id (izin kontrolü).
Sistem çağrılarıyla çalışma kuralları, izin verilen sistem çağrısı sınıflarının listesini ve erişime izin verilen dosya yollarının dizisini içeren ek açıklamalar şeklinde belirtilir . Değiştirilen uygulama derlenip çalıştırıldıktan sonra, çekirdek belirtilen kurallara uyumluluğu izleme görevini üstlenir.
Ayrı olarak, FreeBSD için, kodlarında değişiklik yapmadan uygulamaları izole etme yeteneği ile ayırt edilen rehin uygulaması geliştirilirken, OpenBSD'de rehin çağrısı, temel ortamla sıkı entegrasyon ve koda ek açıklamaların eklenmesini amaçlar. her birinin.
Rehin, patron Linux gibi şeyleri kullanmamız gerektiğini söylediğinde hepimizin imrendiği yasak meyve gibidir. Bu neden önemli? Çünkü rehin() aslında güvenliği anlaşılır kılıyor. Linux hiçbir zaman ölümlülerin anlayabileceği bir güvenlik katmanına sahip olmadı.
Linux Pledge portunun geliştiricileri, FreeBSD'nin yolunu izleyerek kod değişiklikleri yapmak yerine, uygulama kodunuzu değiştirmeden kısıtlamalar uygulamanıza olanak tanıyan ek bir yardımcı program hazırladılar (pledge.com adresinden). Örneğin, curl yardımcı programını yalnızca stdio, rpath, inet ve threadstdio sistem çağrı sınıflarına erişimle çalıştırmak için `./pledge.com -p 'stdio rpath inet thread' curl http://example.com` komutunu çalıştırmanız yeterlidir.
Bu yardımcı program, RHEL6'dan itibaren tüm Linux dağıtımlarında çalışır ve root erişimi gerektirmez. Ayrıca, cosmopolitan kütüphanesine dayalı olarak, C program kodundaki kısıtlamaları yönetmek için bir API sağlanmıştır; bu da, diğer şeylerin yanı sıra, belirli uygulama işlevlerine erişimi seçici olarak kısıtlamak için güvenli alanlar oluşturmaya olanak tanır.
Geçmişte bunu deneyen birkaç geliştirici oldu. İsimlerini vermeyeceğim çünkü bu projelerin çoğu asla tamamlanmadı. SECOMP söz konusu olduğunda, çevrimiçi öğreticiler yalnızca sistem çağrılarının nasıl beyaz listeye alınacağını açıklar, bu nedenle çoğu insan argümanları nasıl filtreleyeceğini bulmadan önce ilgisini kaybeder. İlerleyen projelerde setuid/setgid/sticky bitlerin değiştirilmesine izin verilmesi gibi gözetimler de vardı. Bu nedenle, mevcut alternatiflerin hiçbiri kullanılmamalıdır. Bence bu çaba bizi daha önce hiç olmadığı kadar rehin() sahibi olmaya çok daha yakınlaştırıyor.
Uygulama, çekirdek değişikliği gerektirmez: yardımcı program kısıtlamaları SECCOMP BPF kurallarına dönüştürülür ve Linux'un yerel sistem çağrısı yalıtım mekanizması kullanılarak işlenir. Örneğin, söz vermek("stdio rpath", 0) bir BPF filtresine dönüşecektir.
Son olarak, daha fazla bilgi edinmek isterseniz, ayrıntıları aşağıdaki bağlantıda bulabilirsiniz.