GNU/Linux >> Belajar Linux >  >> Linux

Menonaktifkan vsyscalls di Linux

Coba echo 0 > /proc/sys/kernel/vsyscall64

Jika Anda mencoba melakukan ptrace pada panggilan gettimeofday dan tidak muncul, sumber waktu apa yang digunakan sistem (pmtimer, acpi, tsc, hpet, dll). Saya ingin tahu apakah Anda akan menghibur saya dengan mencoba memaksakan pengatur waktu Anda ke sesuatu yang lebih tua seperti pmtimer. Ada kemungkinan salah satu dari banyak pengoptimalan khusus gtod timer menyebabkan panggilan ptrace Anda dihindari, bahkan dengan vsyscall disetel ke nol.


Apakah ada cara untuk menonaktifkan penggunaan vsyscalls/vDSO untuk satu proses atau, jika tidak memungkinkan, untuk keseluruhan sistem operasi?

Ternyata ada IS cara untuk menonaktifkan penautan vDSO secara efektif untuk satu proses tanpa menonaktifkannya di seluruh sistem menggunakan ptrace !

Yang harus Anda lakukan adalah menghentikan proses yang dilacak sebelum kembali dari execve dan hapus AT_SYSINFO_EHDR entri dari vektor tambahan (yang muncul langsung setelah variabel lingkungan di sepanjang wilayah memori yang ditunjukkan di rsp ). PTRACE_EVENT_EXEC adalah tempat yang baik untuk melakukan ini.

AT_SYSINFO_EHDR adalah apa yang digunakan kernel untuk memberi tahu tautan sistem tempat vDSO dipetakan dalam ruang alamat proses. Jika entri ini tidak ada, ld tampaknya bertindak seolah-olah sistem belum memetakan vDSO.

Perhatikan bahwa ini tidak menghapus peta vDSO dari memori proses Anda, ini hanya mengabaikannya saat menautkan pustaka bersama lainnya. Program jahat masih dapat berinteraksi dengannya jika pembuatnya benar-benar menginginkannya.

Saya tahu jawaban ini agak terlambat, tetapi saya harap informasi ini akan menghindarkan beberapa orang yang malang dari sakit kepala


Untuk sistem yang lebih baru echo 0 > /proc/sys/kernel/vsyscall64 mungkin tidak bekerja. Di Ubuntu 16.04 vDSO dapat dinonaktifkan di seluruh sistem dengan menambahkan parameter kernel vdso=0 di /etc/default/grub di bawah parameter:GRUB_CMDLINE_LINUX_DEFAULT .

PENTING:Parameter GRUB_CMDLINE_LINUX_DEFAULT mungkin ditimpa oleh file konfigurasi lain di /etc/default/grub.d/... , jadi periksa kembali kapan harus menambahkan konfigurasi khusus Anda.


Linux
  1. Cara Mengubah Nama Host di Linux

  2. Contoh Perintah "shutdown" di Linux

  3. Resize2fs Contoh Perintah di Linux

  1. Contoh Perintah localectl di Linux

  2. riwayat waktu aktif linux

  3. Alternatif untuk `memory.size()` R di linux?

  1. Pengantar Sistem File Linux

  2. Persyaratan Sistem Kali Linux

  3. Sistem antrian Linux