8
votes

Désactivation de VSYSCALLS à Linux

Je travaille sur un logiciel qui surveille les appels système d'autres processus à l'aide de PTRACE (2). Malheureusement, la plupart des systèmes d'exploitation modernes mettent en œuvre une sorte de syscalls de mode utilisateur rapide appelé vsyscalls sous Linux.

existe-t-il un moyen de désactiver l'utilisation de VSYSCALLS / VDSO pour un processus unique ou, si cela n'est pas possible, pour l'ensemble du système d'exploitation?


1 commentaires

Impliquez-vous que pTrace n'atteignez pas tous les syscalls vsyscall-ed?


4 Réponses :


7
votes

Essayez echo 0> / proc / sys / kernel / vsyscall64

Si vous essayez de piller sur les appels de GettimeOfDay et qu'ils ne montrent pas, quelle source la source est le système utilisant (PMTIMER, ACPI, TSC, HPET, etc.). Je me demande si vous m'y humorisez en essayant de forcer votre minuterie à quelque chose de plus âgé comme PMTIMER. Il est possible que l'une des nombreuses optimisations spécifiques à la minuterie GTOD provoque l'évitée de vos appels de pTRACE, même avec VSYSCALL défini à zéro.


6 commentaires

Essayé, ne semble pas fonctionner, je ne vois toujours pas le temps / GetTimeofday syscalls. J'ai aussi essayé l'option vdso = 0 de démarrage sans succès.


@Michael avez-vous regardé la source de GetTimeofDay, vu si cela honore le drapeau VSYSCALL? Je vais me regarder moi-même ce soir.


Ok, je peut voir le GetTimeOdday syscall avec vsyscall64 = 0, mais je ne vois toujours pas le temps syscall.


Doit avoir été un autre problème, vous aviez raison, je peux voir tous les syscalls avec vsyscall64 = 0.


Pour éviter les appels VDSO pour un processus spécifique sans modifications à l'échelle du système, voir ma réponse: Stackoverflow.com/a/52402306/10126273


Cela ne fonctionne pas dans les noyaux plus récents car cet accord a été supprimé en 2011.



2
votes

pour les nouveaux systèmes echo 0> / proc / sys / kernel / vsyscall64 pourrait ne pas fonctionner. Dans Ubuntu 16.04 VDSO peut être désactivé à l'échelle du système en ajoutant le paramètre du noyau vdso = 0 dans / etc / par défaut / grub> sous le paramètre: grub_cmdline_linux_default .

IMPORTANT: paramètre grub_cmdline_linux_default peut être écrasé par d'autres fichiers de configuration dans /etc/defaulau/grub.d /..., donc double vérification quand ajouter votre coutume Configuration.


1 commentaires

Pour éviter les appels VDSO pour un processus spécifique sans modifications à l'échelle du système, voir ma réponse: Stackoverflow.com/a/52402306/10126273



4
votes

existe-t-il un moyen de désactiver l'utilisation de VSYSCALLS / VDSO pour un processus unique ou, si cela n'est pas possible, pour l'ensemble du système d'exploitation?

Il s'avère est un moyen de désactiver efficacement la liaison de VDSO pour un processus unique sans désactiver l'utilisation du système informatique à l'aide de pTrace !

Tout ce que vous avez à faire est d'arrêter le processus tracé avant son retour de Execve et de supprimer la saisie AT_SYSInfo_ehdr à partir du vecteur auxiliaire (qui vient directement après les variables d'environnement La région de mémoire pointa dans RER ). PTRACE_EVENT_EXEC est un bon endroit pour le faire.

at_sysinfo_ehdr est ce que le noyau utilise pour dire à la liaison système où VDSO est mappée dans l'espace d'adressage du processus. Si cette entrée n'est pas présente, ld semble agir comme si le système n'a pas été mappé de VDSO.

Notez que cela ne manque pas de la Mémoire VDSO de la mémoire de vos processus, cela ne l'ignore que lors de la liaison d'autres bibliothèques partagées. Un programme malveillant sera toujours en mesure d'interagir avec elle si l'auteur voulait vraiment.

Je sais que cette réponse est un peu tardive, mais j'espère que cette information épargnera une certaine âme pauvre un mal de tête


1 commentaires

Cela nécessite que le processus (pour lequel vous souhaitez désactiver VDSO) fonctionne sous une exécutable / script de wrapper, non? Pouvez-vous poster un code source pour un tel exécutable ou un tel script (ou poster un lien à ce sujet) au cas où vous en auriez un?



2
votes

Ramassage sur Appels d'appels d'offres , j'ai créé une enveloppe qui désactive VDSO pour un binaire arbitraire, sans affecter la Reste du système: https://github.com/danteeu/novdso

La procédure générale est assez simple:

  1. Utilisez PTRACE pour attendre le retour de l'exécution (2)
  2. Trouvez l'adresse de l'AuxVector
  3. écrase l'entrée AT_SYSInfo_ehdr avec AT_ignore, indiquant à l'application d'ignorer la valeur suivante

0 commentaires