Prova echo 0 > /proc/sys/kernel/vsyscall64
Se stai provando a ptrace sulle chiamate gettimeofday e non vengono visualizzate, quale fonte di ora sta utilizzando il sistema (pmtimer, acpi, tsc, hpet, ecc.). Mi chiedo se mi asseconderesti provando a forzare il tuo timer su qualcosa di più vecchio come pmtimer. È possibile che una delle tante ottimizzazioni specifiche del timer gtod stia causando l'evitamento delle chiamate ptrace, anche con vsyscall impostato su zero.
C'è un modo per disabilitare l'uso di vsyscalls/vDSO per un singolo processo o, se ciò non è possibile, per l'intero sistema operativo?
Si scopre che lì IS un modo per disabilitare efficacemente il collegamento di vDSO per un singolo processo senza disabilitarlo a livello di sistema utilizzando ptrace
!
Tutto quello che devi fare è fermare il processo tracciato prima che ritorni da execve
e rimuovi il AT_SYSINFO_EHDR
voce dal vettore ausiliario (che viene direttamente dopo le variabili d'ambiente lungo la regione di memoria indicata in rsp
). PTRACE_EVENT_EXEC
è un buon posto per farlo.
AT_SYSINFO_EHDR
è ciò che il kernel utilizza per indicare al linker di sistema dove vDSO è mappato nello spazio degli indirizzi del processo. Se questa voce non è presente, ld
sembra agire come se il sistema non avesse mappato un vDSO.
Si noti che questo in qualche modo non annulla la mappatura del vDSO dalla memoria dei processi, ma lo ignora semplicemente quando si collegano altre librerie condivise. Un programma dannoso sarà comunque in grado di interagire con esso se l'autore lo desidera davvero.
So che questa risposta è un po' in ritardo, ma spero che questa informazione risparmierà il mal di testa a qualche povera anima
Per i sistemi più recenti echo 0 > /proc/sys/kernel/vsyscall64
potrebbe non funzionare. In Ubuntu 16.04 vDSO può essere disabilitato a livello di sistema aggiungendo il parametro del kernel vdso=0
in /etc/default/grub
sotto il parametro:GRUB_CMDLINE_LINUX_DEFAULT
.
IMPORTANTE:Parametro GRUB_CMDLINE_LINUX_DEFAULT
potrebbe essere sovrascritto da altri file di configurazione in /etc/default/grub.d/...
, quindi ricontrolla quando aggiungere la tua configurazione personalizzata.