GNU/Linux >> Linux の 問題 >  >> Linux

Linux での vsyscall の無効化

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/... の他の設定ファイルによって上書きされる可能性があります ので、いつカスタム構成を追加するか再確認してください。


Linux
  1. Linuxでホスト名を変更する方法

  2. Linux での resize2fs コマンドの例

  3. Linux での localectl コマンドの例

  1. Linux での「shutdown」コマンドの例

  2. Linux 稼働時間の履歴

  3. Linux の R の「memory.size()」に代わるものは?

  1. Linuxファイルシステムの概要

  2. KaliLinuxのシステム要件

  3. Linux 待ち行列システム