Отключение vsyscalls в Linux - PullRequest
       12

Отключение vsyscalls в Linux

6 голосов
/ 26 ноября 2011

Я работаю над программным обеспечением, которое отслеживает системные вызовы других процессов с помощью ptrace (2). К сожалению, большинство современных операционных систем реализуют какие-то быстрые системные вызовы пользовательского режима, которые в Linux называются vsyscalls .

Есть ли способ отключить использование vsyscalls / vDSO для одного процесса или, если это невозможно, для всей операционной системы?

Ответы [ 3 ]

6 голосов
/ 26 ноября 2011

Попробуйте echo 0 > /proc/sys/kernel/vsyscall64

Если вы пытаетесь отследить вызовы gettimeofday и они не отображаются, какой источник времени использует система (pmtimer, acpi, tsc, hpet и т. Д.).Интересно, вы бы меня унизили, пытаясь заставить свой таймер сделать что-то старше, например, pmtimer.Возможно, одна из многих оптимизаций таймера gtod позволяет избежать вызовов ptrace, даже если vsyscall установлен в ноль.

3 голосов
/ 19 сентября 2018

Есть ли способ отключить использование vsyscalls / vDSO для одного процесса или, если это невозможно, для всей операционной системы?

Оказывается, есть IS способ эффективно отключить связывание vDSO для одного процесса без его отключения в масштабе всей системы с помощью ptrace!

Все, что вам нужно сделать, это остановить отслеживаемый процесс до его возврата из execve и удалить запись AT_SYSINFO_EHDR из вспомогательного вектора (который идет непосредственно после переменных среды в области памяти, указанной в rsp) , PTRACE_EVENT_EXEC хорошее место для этого.

AT_SYSINFO_EHDR - это то, что ядро ​​использует, чтобы сообщить системному компоновщику, где vDSO отображается в адресном пространстве процесса. Если эта запись отсутствует, ld, похоже, действует так, как если бы система не отображала vDSO.

Обратите внимание, что это каким-то образом не отображает vDSO из памяти ваших процессов, оно просто игнорирует его при связывании других общих библиотек. Вредоносная программа все равно сможет взаимодействовать с ней, если автор этого действительно хотел.

Я знаю, что этот ответ немного запоздал, но я надеюсь, что эта информация избавит какую-то бедную душу от головной боли

2 голосов
/ 16 мая 2017

Для более новых систем echo 0 > /proc/sys/kernel/vsyscall64 может не работать.В Ubuntu 16.04 vDSO можно отключить для всей системы, добавив параметр ядра vdso=0 в /etc/default/grub под параметром: GRUB_CMDLINE_LINUX_DEFAULT.

ВАЖНО: параметр GRUB_CMDLINE_LINUX_DEFAULT может быть перезаписан другими файлами конфигурации в/etc/default/grub.d/..., поэтому дважды проверьте, когда добавить свою пользовательскую конфигурацию.

...