Vdso ve vsyscall nedir?


89

yaptım sudo cat /proc/1/maps -vv

Çıktıyı anlamaya çalışıyorum. Beklendiği gibi bellek eşleme segmentine eşlenen çok sayıda paylaşılan kitaplık görebiliyorum.

Sonlara doğru şöyle bir şey var

Ne geliyor vdsove vsyscallortalama? vsyscall belleğin çekirdek kısmını mı? Herhangi birinin konuya biraz ışık tutması harika olur.


5
VDSO için Google bu VDSO wikipage'i verir (daha fazla referans vardır).
Basile Starynkevitch

procfs belgeleri , sisteminizin özellikleri için bu dosyanın çekirdek sürümüne bakın.
artless noise

Bu konu için wiki'de veya procfs belgelerinde bulunabilecek daha iyi bir açıklamanın gerekli olduğunu düşünüyorum.
Giuseppe Pes

Yanıtlar:


151

Vsyscall ve vDSO segmentleri Linux belirli sistem aramaları hızlandırmak için kullanılan iki mekanizma. Örneğin gettimeofday, genellikle bu mekanizma aracılığıyla çağrılır. Tanıtılan ilk mekanizma , sistem çağrısı ek yükünü azaltmak için herhangi bir gerçek ayrıcalık düzeyine ihtiyaç duymayan belirli sistem çağrılarını yürütmenin bir yolu olarak eklenen vsyscall idi. Önceki örneği takip ederek, tek gettimeofdayyapmanız gereken çekirdeğin o anki saatini okumaktır. gettimeofdaySık sık çağıran (örneğin, zaman damgası oluşturmak için), biraz da olsa ek yükü önemsedikleri noktaya kadar uygulamalar vardır. Bu endişeyi gidermek için, çekirdek, kullanıcı alanına güncel saati ve hızlı bir şekilde içeren bir sayfayı eşler.gettimeofdayuygulama (yani sadece vsyscall'a kaydedilen zamanı okuyan bir işlev ). Bu sanal sistem çağrısını kullanarak, C kütüphanesi, gettimeofdaygenellikle klasik sistem çağrı modeli INT 0x80veya SYSCALL.

Bununla birlikte, bu vsyscall mekanizmasının bazı sınırlamaları vardır: ayrılan bellek küçüktür ve yalnızca 4 sistem çağrısına izin verir ve daha önemlisi ve daha önemlisi, vsyscall sayfası statik olarak her işlemde aynı adrese atanır, çünkü vsyscall sayfasının konumu ABI çekirdeğinde çivilendi. Vsyscall'ın bu statik tahsisi, Linux tarafından yaygın olarak kullanılan bellek alanı randomizasyonunun sağladığı faydadan ödün verir. Bir saldırgan, bir yığın taşmasını kullanarak bir uygulamanın güvenliğini ihlal ettikten sonra, vsyscall'dan başlatabilir.keyfi parametrelere sahip sayfa. İhtiyacı olan tek şey, statik olarak tahsis edildiği için kolayca tahmin edilebilen sistem çağrısının adresidir (farklı uygulamalarda bile komutunuzu tekrar çalıştırmayı denerseniz, vsyscall adresinin değişmediğini fark edeceksiniz ). Bu tür saldırıları engellemek için vsyscall sayfasının konumunu kaldırmak veya en azından rasgele sıralamak güzel olurdu. Maalesef, uygulamalar o sayfanın varlığına ve tam adresine bağlıdır, bu nedenle hiçbir şey yapılamaz.

Bu güvenlik sorunu, sabit adreslerdeki tüm sistem çağrısı talimatlarının özel bir tuzak talimatıyla değiştirilmesiyle giderildi. Vsyscall sayfasını çağırmaya çalışan bir uygulama , çekirdeğe hapsolacak ve daha sonra çekirdek alanında istenen sanal sistem çağrısını taklit edecektir. Sonuç, ilk başta çekirdek sistem çağrısını önlemek için oraya yerleştirilen sanal bir sistem çağrısını taklit eden bir çekirdek sistem çağrısıdır. Sonuç, yürütmesi daha uzun süren ancak en önemlisi mevcut ABI'yi bozmayan bir vsyscall'tır . Her durumda, yavaşlama yalnızca uygulama vDSO yerine vsyscall sayfasını kullanmaya çalışıyorsa görülecektir .

VDSO onun sınırlamalar aşılmak suretiyle, vsyscall aynı işlevselliğe sahip bulunuyor. VDSO (Sanal Dinamik Olarak Bağlı Paylaşılan Nesneler), kullanıcı alanında bazı çekirdek işlevlerini güvenli bir şekilde ortaya çıkaran, kullanıcı alanında ayrılmış bir bellek alanıdır. Bu, .NET Framework'ün neden olduğu güvenlik tehditlerini çözmek için sunulmuştur vsyscall. VDSO, güvenlik endişelerini çözen ve 4'ten fazla sistem çağrısına sahip olabilen dinamik olarak tahsis edilmiştir. VDSO bağlantılar glibc kitaplığı aracılığıyla sağlanmaktadır. Bağlayıcı, glibc vDSO işlevselliğinde, böyle bir rutinin eşlik eden bir vDSO sürümüne sahip olması koşuluyla bağlanacaktırgettimeofday . Programınız çalıştığında, çekirdeğinizde vDSO yoksa destek, geleneksel bir sistem çağrısı yapılacaktır.

Krediler ve faydalı bağlantılar:


3
Vsyscall'da neden yalnızca 4 sistem çağrısı olabilir? Sistem çağrıları için ayrılmış 8 megabayt vardır ve yalnızca 1 sayfa (aslında 3 işlev, 1024 al 1 sayfa ile hizalanmış) kullanılır.
2018'de

9

Şimdi eklemek istiyorum ki, artık yeni çekirdeklerde, vDSOsadece "güvenli" sistem çağrıları için değil, sistemde bir sistem çağrısı başlatmak için hangi sistem çağrı mekanizmasının tercih edildiğine karar vermek için kullanılıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.