echo 0 > /proc/sys/kernel/vsyscall64
を試す
gettimeofday 呼び出しで ptrace を実行しようとしても表示されない場合は、システムが使用しているタイム ソース (pmtimer、acpi、tsc、hpet など) を確認してください。タイマーを pmtimer のような古いものに強制的に設定してみてください。多くの gtod タイマー固有の最適化の 1 つが原因で、vsyscall がゼロに設定されていても、ptrace 呼び出しが回避される可能性があります。
<ブロック引用>
vsyscalls/vDSO の使用を単一のプロセスに対して無効にする方法はありますか?それが不可能な場合は、オペレーティング システム全体に対して無効にする方法はありますか?
ISがあることが判明 ptrace
を使用して、システム全体で vDSO を無効にすることなく、単一プロセスの vDSO のリンクを効果的に無効にする方法 !
execve
から戻る前に、トレースされたプロセスを停止するだけです。 AT_SYSINFO_EHDR
を削除します 補助ベクトルからのエントリ (これは、rsp
で示されるメモリ領域に沿って環境変数の直後にあります) )。 PTRACE_EVENT_EXEC
はこれを行うのに適した場所です。
AT_SYSINFO_EHDR
vDSO がプロセスのアドレス空間のどこにマップされているかをカーネルがシステム リンカーに伝えるために使用するものです。このエントリが存在しない場合、ld
システムが vDSO をマッピングしていないかのように動作しているようです。
これは、vDSO をプロセス メモリからアンマップするわけではなく、他の共有ライブラリをリンクするときに単に無視することに注意してください。悪意のあるプログラムは、作成者が本当に望んでいる場合でも、それと対話することができます.
この回答が少し遅れていることは承知していますが、この情報が貧しい人々の頭痛の種から解放されることを願っています
新しいシステムの場合 echo 0 > /proc/sys/kernel/vsyscall64
動作しない場合があります。 Ubuntu 16.04 では、カーネル パラメータ vdso=0
を追加することで、システム全体で vDSO を無効にすることができます。 /etc/default/grub
で パラメータの下:GRUB_CMDLINE_LINUX_DEFAULT
.
重要:パラメータ GRUB_CMDLINE_LINUX_DEFAULT
/etc/default/grub.d/...
の他の設定ファイルによって上書きされる可能性があります ので、いつカスタム構成を追加するか再確認してください。