GNU/Linux >> Linux Esercitazione >  >> Linux

Cosa sono vdso e vsyscall?

La vsyscall e vDSO i segmenti sono due meccanismi utilizzati per accelerare determinate chiamate di sistema in Linux. Ad esempio, gettimeofday viene solitamente invocato attraverso questo meccanismo. Il primo meccanismo introdotto è stato vsyscall , che è stato aggiunto come un modo per eseguire chiamate di sistema specifiche che non richiedono alcun livello reale di privilegio per essere eseguite al fine di ridurre l'overhead delle chiamate di sistema. Seguendo l'esempio precedente, tutti gettimeofday deve fare è leggere l'ora corrente del kernel. Ci sono applicazioni che chiamano gettimeofday frequentemente (ad esempio per generare timestamp), al punto che si preoccupano anche di un po 'di sovraccarico. Per risolvere questo problema, il kernel mappa nello spazio utente una pagina contenente l'ora corrente e un veloce gettimeofday implementazione (cioè solo una funzione che legge il tempo risparmiato in vsyscall ). Usando questa chiamata di sistema virtuale, la libreria C può fornire un veloce gettimeofday che non ha l'overhead introdotto dal cambio di contesto tra spazio kernel e spazio utente solitamente introdotto dal classico modello di chiamata di sistema INT 0x80 o SYSCALL .

Tuttavia, questo vsyscall il meccanismo ha alcune limitazioni:la memoria allocata è piccola e consente solo 4 chiamate di sistema e, cosa più importante e seria, la vsyscall page viene allocata staticamente allo stesso indirizzo in ogni processo, poiché la posizione della vsyscall page è inchiodata nel kernel ABI. Questa allocazione statica della vsyscall compromette il vantaggio introdotto dalla randomizzazione dello spazio di memoria comunemente utilizzata da Linux. Un utente malintenzionato, dopo aver compromesso un'applicazione sfruttando uno stack overflow, può invocare una chiamata di sistema da vsyscall pagina con parametri arbitrari. Tutto ciò di cui ha bisogno è l'indirizzo della chiamata di sistema, che è facilmente prevedibile in quanto allocato staticamente (se provi a eseguire nuovamente il tuo comando anche con applicazioni diverse, noterai che l'indirizzo della vsyscall non cambia). Sarebbe bello rimuovere o almeno rendere casuale la posizione della pagina vsyscall per contrastare questo tipo di attacco. Sfortunatamente, le applicazioni dipendono dall'esistenza e dall'indirizzo esatto di quella pagina, quindi non si può fare nulla.

Questo problema di sicurezza è stato risolto sostituendo tutte le istruzioni di chiamata di sistema a indirizzi fissi con una speciale istruzione trap. Un'applicazione che tenta di chiamare vsyscall page intrappolerà il kernel, che quindi emulerà la chiamata di sistema virtuale desiderata nello spazio del kernel. Il risultato è una chiamata di sistema del kernel che emula una chiamata di sistema virtuale che è stata inserita lì per evitare la chiamata di sistema del kernel in primo luogo. Il risultato è una vsyscall che richiede più tempo per essere eseguito ma, soprattutto, non rompe l'ABI esistente. In ogni caso, il rallentamento verrà visualizzato solo se l'applicazione sta tentando di utilizzare la vsyscall page invece del vDSO .

Il vDSO offre le stesse funzionalità di vsyscall, superandone i limiti. Il vDSO (Virtual Dynamically linked Shared Objects) è un'area di memoria allocata nello spazio utente che espone in modo sicuro alcune funzionalità del kernel nello spazio utente. Questo è stato introdotto per risolvere le minacce alla sicurezza causate dal vsyscall .Il vDSO è allocato dinamicamente, il che risolve i problemi di sicurezza e può avere più di 4 chiamate di sistema. Il vDSO i collegamenti sono forniti tramite la libreria glibc. Il linker collegherà nella glibc vDSO funzionalità, a condizione che tale routine abbia un vDSO di accompagnamento versione, come gettimeofday . Quando il tuo programma viene eseguito, se il tuo kernel non ha vDSO support, verrà effettuata una chiamata di sistema tradizionale.

Crediti e link utili :

  • Fantastico tutorial su come creare il tuo vDSO.
  • vsyscall e vDSO, bell'articolo
  • articolo e link utili
  • Cos'è linux-gate.so.1?

Voglio solo aggiungerlo ora nei nuovi kernel, vDSO non è usato solo per le chiamate di sistema "sicure", ma è usato per decidere quale meccanismo di chiamata di sistema è il metodo preferito per invocare una chiamata di sistema sul sistema.


Linux
  1. Cosa sono i processi zombi e come trovare e uccidere i processi zombi?

  2. Come scoprire chi è connesso al tuo sistema e cosa stanno facendo

  3. Che cos'è Soft Links e Hard Links nel file system Linux

  4. In quali linguaggi sono scritti Windows, Mac OS X e Linux?

  5. Quali caratteri sono vietati nei nomi delle directory di Windows e Linux?

Che cos'è EFS (Elastic File System) in AWS e come utilizzarlo

Cosa sono i log di Linux e dove trovarli

Cos'è l'hypervisor e quali sono i suoi tipi

Linux:cosa intendiamo esattamente quando diciamo che stiamo usando Linux?

Che cos'è un database distribuito e a cosa servono i sistemi di dati distribuiti?

Che cosa sono le chiamate di sistema Linux e le funzioni di libreria?