我正在开发一个软件,该软件可以使用ptrace(2)监视其他进程的系统调用。不幸的是,大多数现代操作系统都实现了某种快速的用户模式系统,在Linux中称为vsyscalls。
是否有任何方法可以在单个进程中禁用vsyscalls/vDSO,或者,如果不可能,则禁用整个操作系统?
发布于 2011-11-26 16:59:55
试试echo 0 > /proc/sys/kernel/vsyscall64
如果您试图对gettimeofday调用进行跟踪,并且它们没有出现,那么系统使用的是什么时间源(pmtimer、acpi、tsc、hpet等)。我不知道你会不会通过强迫你的计时器去做一些更老的东西,比如pmtimer来逗我开心。许多特定于gtod定时器的优化可能会导致避免ptrace调用,即使vsyscall设置为零。
发布于 2018-09-19 09:16:21
是否有任何方法可以在单个进程中禁用vsyscalls/vDSO,如果不可能的话,可以禁用整个操作系统吗?
事实证明,是,这是一种有效地禁用单个进程链接vDSO的方法,而不禁用整个系统使用ptrace!
您所要做的就是在跟踪的进程从execve返回之前停止它,并从辅助向量中删除AT_SYSINFO_EHDR条目(它直接在rsp中指向的内存区域的环境变量之后出现)。PTRACE_EVENT_EXEC是这样做的好地方。
AT_SYSINFO_EHDR是内核用来告诉系统链接器vDSO映射到进程地址空间中的位置的。如果这个条目不存在,ld似乎就像系统没有映射vDSO一样。
请注意,这并不是以某种方式将vDSO从进程内存中取消映射,而是在链接其他共享库时忽略它。如果作者真的愿意的话,恶意程序仍然能够与它交互。
我知道这个答案有点晚了,但我希望这个信息能让一些可怜的人头痛。
发布于 2017-05-16 01:09:10
对于较新的系统,echo 0 > /proc/sys/kernel/vsyscall64可能无法工作。在Ubuntu16.04中,可以通过在vDSO参数:GRUB_CMDLINE_LINUX_DEFAULT下在/etc/default/grub中添加内核参数vdso=0来禁用系统范围内的GRUB_CMDLINE_LINUX_DEFAULT。
注意:参数GRUB_CMDLINE_LINUX_DEFAULT可能会被/etc/default/grub.d/...中的其他配置文件覆盖,所以请反复检查何时添加自定义配置。
https://stackoverflow.com/questions/8280014
复制相似问题