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 em> sous Linux. P>
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? P>
4 Réponses :
Essayez 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. P> echo 0> / proc / sys / kernel / vsyscall64 code> p>
Essayé, ne semble pas fonctionner, je ne vois toujours pas le temps / GetTimeofday syscalls. J'ai aussi essayé l'option vdso = 0 code> 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 i> voir le GetTimeOdday code> syscall avec vsyscall64 = 0, mais je ne vois toujours pas le temps
code> 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.
pour les nouveaux systèmes IMPORTANT: paramètre echo 0> / proc / sys / kernel / vsyscall64 code> 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 code> dans
/ etc / par défaut / grub> sous le paramètre:
grub_cmdline_linux_default code >. P>
grub_cmdline_linux_default code> peut être écrasé par d'autres fichiers de configuration dans
/etc/defaulau/grub.d /... code>, donc double vérification quand ajouter votre coutume Configuration. P>
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
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? P> blockQuote>
Il s'avère STRY> est strud> 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 p>! P>
Tout ce que vous avez à faire est d'arrêter le processus tracé avant son retour de
Execve code> et de supprimer la saisie code> AT_SYSInfo_ehdr code> à partir du vecteur auxiliaire (qui vient directement après les variables d'environnement La région de mémoire pointa dans
RER code>).
PTRACE_EVENT_EXEC CODE> est un bon endroit pour le faire. p>
at_sysinfo_ehdr code> 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 code> semble agir comme si le système n'a pas été mappé de VDSO. P>
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. p>
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 p>
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?
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 p>
La procédure générale est assez simple: p>
Impliquez-vous que
pTrace code> n'atteignez pas tous les syscalls vsyscall-ed?