Rehin izolasyon mekanizmasını Linux'a taşıma projesi

Cosmopolitan standart C kütüphanesinin ve Redbean platformunun yazarı, Linux için rehin() izolasyon mekanizmasının uygulandığını duyurdu. Pledge, başlangıçta OpenBSD projesi tarafından geliştirildi ve uygulamaların kullanılmayan sistem çağrılarına erişimini seçici olarak yasaklamanıza olanak tanır (uygulama için bir tür beyaz sistem çağrıları listesi oluşturulur ve diğer çağrılar yasaktır). Linux'ta bulunan seccomp gibi sistem çağrısı kısıtlama mekanizmalarının aksine, rehin mekanizması başlangıçta mümkün olduğu kadar basit olacak şekilde tasarlandı.

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ır erişim sınıflarını manipüle etmeden izolasyon kuralları oluşturmayı mümkün kılan bir taahhüt önerildi. Örneğin, sunulan sınıflar şunlardır: stdio (giriş/çıkış), rpath (salt okunur dosyalar), wpath (dosya yazma), cpath (dosya oluşturma), tmppath (geçici dosyalarla çalışma), inet (ağ yuvaları), unix ( unix soketleri), dns (DNS çözünürlüğü), getpw (kullanıcı veritabanına okuma erişimi), ioctl (ioctl çağrısı), proc (işlem yönetimi), exec (işlem başlatma) ve id (erişim hakları yönetimi).

Sistem çağrılarıyla çalışma kuralları, izin verilen sistem çağrıları sınıflarının bir listesi ve erişime izin verilen bir dizi dosya yolu dahil olmak üzere ek açıklamalar biçiminde belirtilir. Değiştirilen uygulamayı oluşturup başlattıktan sonra çekirdek, belirtilen kurallara uygunluğu izleme işini üstlenir.

FreeBSD için, kodlarında değişiklik yapmadan uygulamaları izole etme yeteneği ile öne çıkan ayrı bir rehin uygulaması geliştirilirken, OpenBSD'de rehin çağrısı temel ortamla sıkı entegrasyonu ve her birinin koduna ek açıklamalar eklemeyi amaçlamaktadır. başvuru.

Linux için rehin portunun geliştiricileri FreeBSD örneğini aldılar ve kodda değişiklik yapmak yerine, uygulama kodunu değiştirmeden kısıtlamalar uygulamanıza olanak tanıyan bir eklenti yardımcı programı rehin.com hazırladılar. Örneğin, curl yardımcı programını yalnızca stdio, rpath, inet ve threadstdio sistem çağrısı 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.

Rehin yardımcı programı, RHEL6'dan başlayarak tüm Linux dağıtımlarında çalışır ve root erişimi gerektirmez. Ek olarak, kozmopolit kütüphaneye dayalı olarak, C dilindeki program kodundaki kısıtlamaları yönetmek için bir API sağlanır; bu, diğer şeylerin yanı sıra, belirli uygulama işlevleriyle ilgili olarak erişimi seçici olarak kısıtlamak için bölgeler oluşturmaya olanak tanır.

Uygulama çekirdekte değişiklik yapılmasını gerektirmez; taahhüt kısıtlamaları SECCOMP BPF kurallarına çevrilir ve yerel Linux sistem çağrısı izolasyon mekanizması kullanılarak işlenir. Örneğin, çağrı rehini("stdio rpath", 0) bir BPF filtresine dönüştürülecektir static const struct sock_filter kFilter[] = { /* L0*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, sistem çağrısı, 0, 14 - 1) ), / * L1*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[0])), /* L2*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 2, 4 - 3, 0), /* L3* / BPF_JUMP( BPF_JMP | BPF_JEQ | BPF_K, 10, 0, 13 - 4), /* L4*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[1])), /* L5*/ BPF_STMT(BPF_ALU | BPF_AND) | BPF_K, ~0x80800), /* L6*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 1, 8 - 7, 0), /* L7*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 2, 0, 13 - 8) , /* L8*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[2])), /* L9*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 12 - 10, 0), /*L10*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 6, 12 - 11, 0), /*L11*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 17, 0, 13 - 11), /*L12*/ BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ALLOW), /*L13*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr))), /*L14*/ /* sonraki filtre */ };

Kaynak: opennet.ru

Yorum ekle