Essayez echo 0 > /proc/sys/kernel/vsyscall64
Si vous essayez de ptrace sur les appels gettimeofday et qu'ils ne s'affichent pas, quelle source d'heure le système utilise-t-il (pmtimer, acpi, tsc, hpet, etc.). Je me demande si vous me feriez plaisir en essayant de forcer votre minuterie sur quelque chose de plus ancien comme pmtimer. Il est possible que l'une des nombreuses optimisations spécifiques au temporisateur gtod empêche vos appels ptrace d'être évités, même avec vsyscall défini sur zéro.
Existe-t-il un moyen de désactiver l'utilisation de vsyscalls/vDSO pour un seul processus ou, si ce n'est pas possible, pour l'ensemble du système d'exploitation ?
Il s'avère qu'il y a EST un moyen de désactiver efficacement la liaison vDSO pour un seul processus sans le désactiver à l'échelle du système en utilisant ptrace
!
Tout ce que vous avez à faire est d'arrêter le processus tracé avant qu'il ne revienne de execve
et supprimer le AT_SYSINFO_EHDR
entrée du vecteur auxiliaire (qui vient directement après les variables d'environnement le long de la région de mémoire pointée dans rsp
). PTRACE_EVENT_EXEC
est un bon endroit pour le faire.
AT_SYSINFO_EHDR
est ce que le noyau utilise pour indiquer à l'éditeur de liens système où vDSO est mappé 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'avait pas mappé de vDSO.
Notez que cela ne démappe pas d'une manière ou d'une autre le vDSO de la mémoire de vos processus, il l'ignore simplement lors de la liaison d'autres bibliothèques partagées. Un programme malveillant pourra toujours interagir avec lui si son auteur le voulait vraiment.
Je sais que cette réponse est un peu tardive, mais j'espère que cette information épargnera des maux de tête à une pauvre âme
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 de noyau vdso=0
en /etc/default/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/default/grub.d/...
, vérifiez donc quand ajouter votre configuration personnalisée.