Sadece modprobeçekirdeğe yeni kod yükleyerek güvenliği "yener".
Çeşitli nedenlerden dolayı, çekirdek iş parçacığı yerine kullanıcı boşluğunda yarı ayrıcalıklı kodun (X sunucusu içindeki grafik sürücüleri gibi) olması daha mantıklıdır.
- HW'yi
killkilitlemediği sürece daha kolay yapabilmek .
- Kodunu / verilerini dosya sistemindeki dosyalardan talep etmesini sağlamak. (Çekirdek belleği ücretli değildir)
- O X sunucusu hatalar kendi sanal adres alanı verilmesi olabilir çekirdeği aşağı almadan, sadece X sunucusu çökmesine.
Güvenlik için fazla bir şey yapmaz, ancak büyük güvenilirlik ve yazılım mimarisi avantajları vardır.
Grafik sürücülerini çekirdeğe hazırlamak, X istemcileri ile X sunucusu arasındaki bağlam anahtarlarını, başka bir kullanım alanı işlemine veri almak yerine yalnızca bir kullanıcı -> çekirdek -> kullanıcı gibi azaltabilir, ancak X sunucuları geçmişte çok büyük ve çok hatalıdır onları tam olarak çekirdekte istemek.
Evet, bu privs ile zararlı kod olabilir o isterse kullanarak, çekirdek devralmak /dev/memçekirdek kodlarını değiştirmek için.
Örneğin, x86'da, IO ayrıcalık düzeyini 0 olarak ayarlamak için clibir ioplsistem çağrısı yaptıktan sonra bu çekirdekteki kesintileri devre dışı bırakmak için bir talimat çalıştırın .
Ancak x86 iopl"only" bile bazı talimatlara erişim sağlar : in / out (ve dize sürümleri ins / out) ve cli / sti. "Modele özgü kayıtları" kullanmanıza rdmsrveya wrmsrokumanıza veya yazmanıza (örn IA32_LSTAR. X86-64 syscallkomutu için çekirdek giriş noktası adresini ayarlamanıza ) veya lidtinterrupt-tanımlayıcı tablosunu (tamamen almanıza izin verir) mevcut çekirdekten, en azından bu çekirdeğin üstünde).
Saldırı sürecinin /dev/memkendi sayfa tablolarını mmapdeğiştirmeye daha fazla alternatif olarak bir ofset olarak yararlı bulabileceği en üst düzey sayfa dizininin fiziksel adresini tutan CR3 gibi kontrol kayıtlarını bile okuyamazsınız /dev/mem. )
invd( geri yazma olmadan tüm önbellekleri geçersiz kılın !! ( kullanım örneği = RAM yapılandırılmadan önce erken BIOS)) sadece IOPL değil, her zaman tam CPL 0 (geçerli ayrıcalık düzeyi) gerektiren başka bir eğlencedir. Hatta wbinvdayrıcalıklıdır çünkü çok yavaştır (ve kesilemez) ve tüm çekirdeklerdeki tüm önbellekleri temizlemek zorundadır . (Bkz . Bir programla ilgili tüm CPU önbelleğini temizlemenin bir yolu var mı? Ve WBINVD talimatı kullanımı )
Verileri kod olarak çalıştıran hatalı bir adrese atlamaya neden olan hatalar, bu nedenle, kullanıcı alanı X sunucusunda yanlışlıkla bu yönergelerin hiçbirini yürütemez.
Geçerli ayrıcalık düzeyi (korumalı ve uzun modda) (kod segmenti seçicisinin) düşük 2 bitidircs . mov eax, cs/ and eax, 3ayrıcalık düzeyini okumak için herhangi bir modda çalışır.
Ayrıcalık düzeyini yazmak için bir jmp farveya call farayarlamak için CS:RIP(ancak hedef segment için GDT / LDT girişi eski ayrıcalık düzeyine göre kısıtlayabilir, bu nedenle kullanıcı alanı bunu yükseltmek için bunu yapamaz). Veya bir çekirdek giriş noktasında 0 halkasına geçmek için intveya syscalltuşunu kullanın.
ioplizin vermiyor , bu nedenle , baytlarla başlayan yürütülebilir belleğe işaret eden bozuk bir işlev işaretçisinden atlayarak, hatalı bir kullanıcı alanı programının yanlışlıkla çalışmadığından emin olmak için hala yararlıdır . Kullanıcı alanı işlemlerinin ayrıcalıklarını yükseltmesinin faydalı olmasının güvenlikle ilgili olmayan nedenlerinden bazılarına bir yanıt ekledim.invd0F 08