GNU/Linux >> Belajar Linux >  >> Linux

Apa itu vdso dan vsyscall?

vsyscall dan vDSO segmen adalah dua mekanisme yang digunakan untuk mempercepat panggilan sistem tertentu di Linux. Misalnya, gettimeofday biasanya dipanggil melalui mekanisme ini. Mekanisme pertama yang diperkenalkan adalah vsyscall , yang ditambahkan sebagai cara untuk menjalankan panggilan sistem tertentu yang tidak memerlukan tingkat hak istimewa apa pun untuk dijalankan guna mengurangi overhead panggilan sistem. Mengikuti contoh sebelumnya, semua gettimeofday perlu dilakukan adalah membaca waktu kernel saat ini. Ada aplikasi yang memanggil gettimeofday sering (misalnya untuk menghasilkan stempel waktu), sampai-sampai mereka peduli bahkan dengan sedikit biaya tambahan. Untuk mengatasi masalah ini, kernel memetakan ke ruang pengguna halaman yang berisi waktu saat ini dan gettimeofday yang cepat implementasi (yaitu hanya fungsi yang membaca waktu yang dihemat ke vsyscall ). Dengan menggunakan panggilan sistem virtual ini, pustaka C dapat menyediakan gettimeofday yang cepat yang tidak memiliki overhead yang diperkenalkan oleh peralihan konteks antara ruang kernel dan ruang pengguna yang biasanya diperkenalkan oleh model panggilan sistem klasik INT 0x80 atau SYSCALL .

Namun, vsyscall ini mekanisme memiliki beberapa batasan:memori yang dialokasikan kecil dan hanya memungkinkan 4 panggilan sistem, dan, yang lebih penting dan serius, vsyscall halaman dialokasikan secara statis ke alamat yang sama di setiap proses, karena lokasi vsyscall halaman dipaku di kernel ABI. Alokasi statis vsyscall ini mengkompromikan manfaat yang diperkenalkan oleh pengacakan ruang memori yang biasa digunakan oleh Linux. Penyerang, setelah mengkompromikan aplikasi dengan mengeksploitasi stack overflow, dapat memanggil system call dari vsyscall halaman dengan parameter arbitrer. Yang dia butuhkan hanyalah alamat panggilan sistem, yang mudah diprediksi karena dialokasikan secara statis (jika Anda mencoba menjalankan kembali perintah Anda bahkan dengan aplikasi yang berbeda, Anda akan melihat bahwa alamat vsyscall tidak berubah). Alangkah baiknya untuk menghapus atau setidaknya mengacak lokasi halaman vsyscall untuk menggagalkan serangan jenis ini. Sayangnya, aplikasi bergantung pada keberadaan dan alamat persis halaman tersebut, jadi tidak ada yang dapat dilakukan.

Masalah keamanan ini telah diatasi dengan mengganti semua instruksi panggilan sistem di alamat tetap dengan instruksi jebakan khusus. Sebuah aplikasi mencoba memanggil vsyscall halaman akan menjebak ke dalam kernel, yang kemudian akan meniru panggilan sistem virtual yang diinginkan di ruang kernel. Hasilnya adalah panggilan sistem kernel yang meniru panggilan sistem virtual yang diletakkan di sana untuk menghindari panggilan sistem kernel di tempat pertama. Hasilnya adalah vsyscall yang membutuhkan waktu lebih lama untuk dieksekusi, tetapi yang terpenting, tidak merusak ABI yang ada. Bagaimanapun, pelambatan hanya akan terlihat jika aplikasi mencoba menggunakan vsyscall bukan vDSO .

vDSO menawarkan fungsionalitas yang sama dengan vsyscall, sekaligus mengatasi keterbatasannya. vDSO (Virtual Dynamically linked Shared Objects) adalah area memori yang dialokasikan di ruang pengguna yang memaparkan beberapa fungsionalitas kernel di ruang pengguna dengan cara yang aman. Ini telah diperkenalkan untuk mengatasi ancaman keamanan yang disebabkan oleh vsyscall .VDSO dialokasikan secara dinamis yang memecahkan masalah keamanan dan dapat memiliki lebih dari 4 panggilan sistem. vDSO tautan disediakan melalui pustaka glibc. Penaut akan menautkan di glibc vDSO fungsi, asalkan rutinitas tersebut memiliki vDSO yang menyertainya versi, seperti gettimeofday . Saat program Anda dijalankan, jika kernel Anda tidak memiliki vDSO dukungan, syscall tradisional akan dibuat.

Kredit dan tautan bermanfaat :

  • Tutorial keren, cara membuat vDSO Anda sendiri.
  • vsyscall dan vDSO, artikel bagus
  • artikel dan tautan yang bermanfaat
  • Apa itu linux-gate.so.1?

Saya hanya ingin menambahkannya sekarang di kernel baru, vDSO tidak hanya digunakan untuk syscall "aman" tetapi digunakan untuk memutuskan mekanisme syscall mana yang merupakan metode pilihan untuk memanggil syscall pada sistem.


Linux
  1. Apa Karakter Khusus Dan Blokir File Khusus Dalam Sistem Unix??

  2. Linux – Apa Memori Tinggi dan Memori Rendah Di Linux?

  3. Apa itu Tautan Lunak dan Tautan Keras di Sistem File Linux

  1. Dalam bahasa apa Windows, Mac OS X dan Linux ditulis?

  2. Karakter apa yang dilarang dalam nama direktori Windows dan Linux?

  3. Apa panggilan OS / sistem asli Windows dan Linux yang dibuat dari malloc ()?

  1. Apa Proses Zombie Dan Bagaimana Menemukan &Membunuh Proses Zombie?

  2. Cara Menemukan Siapa yang Masuk Di Sistem Anda Dan Apa yang Mereka Lakukan

  3. Nama host - Tentang apa semua itu?