Le vsyscall et vDSO Les segments sont deux mécanismes utilisés pour accélérer certains appels système sous Linux. Par exemple, gettimeofday
est généralement invoqué par ce mécanisme. Le premier mécanisme introduit était vsyscall , qui a été ajouté comme moyen d'exécuter des appels système spécifiques qui ne nécessitent aucun niveau de privilège réel pour s'exécuter afin de réduire la surcharge des appels système. Suivant l'exemple précédent, tous les gettimeofday
doit faire est de lire l'heure actuelle du noyau. Il existe des applications qui appellent gettimeofday
fréquemment (par exemple pour générer des horodatages), au point qu'ils se soucient même d'un peu de surcharge. Pour résoudre ce problème, le noyau mappe dans l'espace utilisateur une page contenant l'heure actuelle et un rapide gettimeofday
implémentation (c'est-à-dire juste une fonction qui lit le temps gagné dans vsyscall ). En utilisant cet appel système virtuel, la bibliothèque C peut fournir un rapide gettimeofday
qui n'a pas la surcharge introduite par le changement de contexte entre l'espace noyau et l'espace utilisateur généralement introduit par le modèle d'appel système classique INT 0x80
ou SYSCALL
.
Cependant, ce vsyscall mécanisme a quelques limitations :la mémoire allouée est petite et ne permet que 4 appels système, et, plus important et plus sérieux, le vsyscall la page est statiquement allouée à la même adresse dans chaque processus, puisque l'emplacement du vsyscall La page est clouée dans l'ABI du noyau. Cette allocation statique du vsyscall compromet le bénéfice introduit par la randomisation de l'espace mémoire couramment utilisée par Linux. Un attaquant, après avoir compromis une application en exploitant un débordement de pile, peut invoquer un appel système depuis le vsyscall page avec des paramètres arbitraires. Tout ce dont il a besoin est l'adresse de l'appel système, qui est facilement prévisible car elle est allouée statiquement (si vous essayez de relancer votre commande même avec des applications différentes, vous remarquerez que l'adresse du vsyscall ne change pas). Ce serait bien de supprimer ou au moins de randomiser l'emplacement de la page vsyscall pour contrecarrer ce type d'attaque. Malheureusement, les applications dépendent de l'existence et de l'adresse exacte de cette page, donc rien ne peut être fait.
Ce problème de sécurité a été résolu en remplaçant toutes les instructions d'appel système à des adresses fixes par une instruction trap spéciale. Une application essayant d'appeler le vsyscall La page sera interceptée dans le noyau, qui émulera alors l'appel système virtuel souhaité dans l'espace du noyau. Le résultat est un appel système du noyau émulant un appel système virtuel qui a été mis là pour éviter l'appel système du noyau en premier lieu. Le résultat est un vsyscall qui prend plus de temps à s'exécuter mais, surtout, ne casse pas l'ABI existant. Dans tous les cas, le ralentissement ne sera visible que si l'application essaie d'utiliser le vsyscall au lieu du vDSO .
Le vDSO offre les mêmes fonctionnalités que le vsyscall, tout en s'affranchissant de ses limitations. Le vDSO (Virtual Dynamically link Shared Objects) est une zone mémoire allouée dans l'espace utilisateur qui expose certaines fonctionnalités du noyau dans l'espace utilisateur de manière sûre. Ceci a été introduit pour résoudre les menaces de sécurité causées par le vsyscall
.Le vDSO est alloué dynamiquement, ce qui résout les problèmes de sécurité et peut avoir plus de 4 appels système. Le vDSO les liens sont fournis via la bibliothèque glibc. L'éditeur de liens créera un lien dans la glibc vDSO fonctionnalité, à condition qu'une telle routine soit accompagnée d'un vDSO version, telle que gettimeofday
. Lorsque votre programme s'exécute, si votre noyau n'a pas vDSO support, un appel système traditionnel sera effectué.
Crédits et liens utiles :
- Tutoriel génial, comment créer votre propre vDSO.
- vsyscall et vDSO, bel article
- article et liens utiles
- Qu'est-ce que linux-gate.so.1 ?
Je veux juste ajouter cela maintenant dans les nouveaux noyaux, vDSO
n'est pas utilisé uniquement pour les appels système "sûrs", mais il est utilisé pour décider quel mécanisme d'appel système est la méthode préférée pour invoquer un appel système sur le système.