GNU/Linux >> Znalost Linux >  >> Linux

Co je vdso a vsyscall?

vsyscall a vDSO segmenty jsou dva mechanismy používané k urychlení určitých systémových volání v Linuxu. Například gettimeofday se obvykle vyvolává prostřednictvím tohoto mechanismu. Prvním představeným mechanismem byl vsyscall , který byl přidán jako způsob provádění specifických systémových volání, která nepotřebují ke spuštění žádnou skutečnou úroveň oprávnění, aby se snížila režie systémových volání. Podle předchozího příkladu všechny gettimeofday co musíte udělat, je přečíst aktuální čas jádra. Existují aplikace, které volají gettimeofday často (např. pro generování časových razítek), do té míry, že se starají i o trochu režie. Aby se tento problém vyřešil, jádro namapuje do uživatelského prostoru stránku obsahující aktuální čas a rychlé gettimeofday implementace (tj. pouze funkce, která přečte čas uložený do vsyscall ). Pomocí tohoto virtuálního systémového volání může knihovna C poskytnout rychlý gettimeofday který nemá režii zaváděnou kontextovým přepínačem mezi prostorem jádra a uživatelským prostorem, který obvykle zavádí klasický model systémového volání INT 0x80 nebo SYSCALL .

Nicméně toto vsyscall mechanismus má určitá omezení:přidělená paměť je malá a umožňuje pouze 4 systémová volání, a co je důležitější a vážnější, vsyscall stránka je v každém procesu staticky přidělena stejné adrese, protože umístění vsyscall stránka je přibitá v kernel ABI. Tato statická alokace vsyscall ohrožuje výhodu, kterou přináší randomizace paměťového prostoru běžně používaná v Linuxu. Útočník může po kompromitaci aplikace zneužitím přetečení zásobníku vyvolat systémové volání z vsyscall stránka s libovolnými parametry. Vše, co potřebuje, je adresa systémového volání, která je snadno předvídatelná, protože je staticky přidělena (pokud se pokusíte znovu spustit příkaz i s různými aplikacemi, všimnete si, že adresa vsyscall se nemění). Bylo by hezké odstranit nebo alespoň randomizovat umístění stránky vsyscall, aby se zabránilo tomuto typu útoku. Bohužel aplikace závisí na existenci a přesné adrese dané stránky, takže nelze nic dělat.

Tento bezpečnostní problém byl vyřešen nahrazením všech instrukcí systémových volání na pevných adresách speciální instrukcí trap. Aplikace, která se pokouší volat do vsyscall stránka se zachytí do jádra, které pak emuluje požadované virtuální systémové volání v prostoru jádra. Výsledkem je systémové volání jádra emulující virtuální systémové volání, které bylo vloženo, aby se zabránilo systémovému volání jádra. Výsledkem je vsyscall jehož provedení trvá déle, ale co je zásadní, nenaruší stávající ABI. V každém případě se zpomalení projeví pouze v případě, že se aplikace pokouší použít vsyscall namísto vDSO .

vDSO nabízí stejnou funkcionalitu jako vsyscall, přičemž překonává jeho omezení. VDSO (Virtual Dynamically Linked Shared Objects) je paměťová oblast alokovaná v uživatelském prostoru, která bezpečným způsobem odhaluje některé funkce jádra v uživatelském prostoru. Toto bylo zavedeno, aby vyřešilo bezpečnostní hrozby způsobené vsyscall .VDSO je dynamicky přidělováno, což řeší bezpečnostní problémy a může mít více než 4 systémová volání. vDSO odkazy jsou poskytovány prostřednictvím knihovny glibc. Linker se propojí v glibc vDSO funkčnost za předpokladu, že taková rutina má doprovodné vDSO verzi, například gettimeofday . Když se váš program spustí, pokud vaše jádro nemá vDSO podporu, bude provedeno tradiční systémové volání.

Poděkování a užitečné odkazy :

  • Úžasný návod, jak vytvořit vlastní vDSO.
  • vsyscall a vDSO, pěkný článek
  • užitečný článek a odkazy
  • Co je linux-gate.so.1?

Jen to chci přidat nyní v nových jádrech vDSO se nepoužívá pouze pro "bezpečná" syscall, ale používá se k rozhodnutí, který mechanismus syscall je preferovanou metodou pro vyvolání syscall v systému.


Linux
  1. Co jsou zombie procesy a jak najít a zabít zombie procesy?

  2. Jak zjistit, kdo je přihlášen ve vašem systému a co dělá

  3. Co jsou speciální znaky a speciální soubory bloků v systému Unix?

  1. Linux – Co je velká a nízká paměť v Linuxu?

  2. Co jsou měkké a pevné odkazy v systému souborů Linux

  3. Jaké znaky jsou v názvech adresářů Windows a Linux zakázány?

  1. Co je velká a nízká paměť v Linuxu?

  2. Co je to linuxový kontejner a linuxový hypervizor?

  3. Názvy hostitelů – o čem jsou?