Apa itu vdso dan vsyscall?

89

aku melakukannya sudo cat /proc/1/maps -vv

Saya mencoba memahami hasilnya. Saya dapat melihat banyak pustaka bersama yang dipetakan ke segmen pemetaan memori seperti yang diharapkan.

Menjelang akhir ada sesuatu seperti

Apa maksud vdsodan vsyscallmaksudnya? adalah vsyscall bagian kernel dari memori? Akan sangat bagus jika ada yang bisa menjelaskan masalah ini.

liv2hak
sumber
5
Google untuk VDSO memberikan halaman wiki VDSO ini (yang memiliki referensi lebih lanjut).
Basile Starynkevitch
procfs , lihat versi kernel Anda dari file ini untuk spesifikasi sistem Anda.
kebisingan tanpa seni
Saya pikir penjelasan yang lebih baik bahwa apa yang dapat ditemukan di wiki atau di dokumentasi procfs diperlukan untuk topik ini.
Giuseppe Pes

Jawaban:

151

The vsyscall dan vDSO segmen adalah dua mekanisme yang digunakan untuk mempercepat panggilan sistem tertentu di Linux. Misalnya, gettimeofdaybiasanya dipanggil melalui mekanisme ini. Mekanisme pertama yang diperkenalkan adalah vsyscall , yang ditambahkan sebagai cara untuk mengeksekusi panggilan sistem tertentu yang tidak memerlukan tingkat hak istimewa untuk dijalankan guna mengurangi overhead panggilan sistem. Mengikuti contoh sebelumnya, yang gettimeofdayperlu dilakukan hanyalah membaca waktu kernel saat ini. Ada aplikasi yang gettimeofdaysering memanggil (misalnya untuk menghasilkan cap waktu), sampai-sampai mereka peduli bahkan dengan sedikit overhead. Untuk mengatasi masalah ini, kernel memetakan ke dalam ruang pengguna sebuah halaman yang berisi waktu saat ini dan puasagettimeofdayimplementasi (yaitu hanya fungsi yang membaca waktu yang disimpan ke dalam vsyscall ). Dengan menggunakan panggilan sistem virtual ini, pustaka C dapat menyediakan cepat gettimeofdayyang tidak memiliki overhead yang diperkenalkan oleh sakelar konteks antara ruang kernel dan ruang pengguna yang biasanya diperkenalkan oleh model panggilan sistem klasik INT 0x80atau SYSCALL.

Namun, mekanisme vsyscall ini memiliki beberapa batasan: memori yang dialokasikan kecil dan hanya memungkinkan 4 panggilan sistem, dan, yang lebih penting dan serius, halaman vsyscall dialokasikan secara statis ke alamat yang sama di setiap proses, karena lokasi halaman vsyscall adalah dipaku di kernel ABI. Alokasi statis vsyscall ini membahayakan manfaat yang diperkenalkan oleh pengacakan ruang memori yang biasa digunakan oleh Linux. Seorang penyerang, setelah mengkompromikan aplikasi dengan mengeksploitasi stack overflow, dapat memanggil panggilan sistem dari vsyscallhalaman dengan parameter sewenang-wenang. 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 jenis serangan ini. Sayangnya, aplikasi bergantung pada keberadaan dan alamat pasti dari halaman itu, jadi tidak ada yang bisa dilakukan.

Masalah keamanan ini telah diatasi dengan mengganti semua instruksi panggilan sistem di alamat tetap dengan instruksi perangkap khusus. Aplikasi yang mencoba memanggil ke halaman vsyscall 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 halaman vsyscall, bukan vDSO .

The vDSO menawarkan fungsi yang sama dengan vsyscall, sementara mengatasi keterbatasan. VDSO (Virtual Dynamically linked Shared Objects) adalah area memori yang dialokasikan di ruang pengguna yang memperlihatkan 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. The vDSO link yang disediakan melalui perpustakaan glibc. Linker akan menautkan dalam fungsionalitas glibc vDSO , asalkan rutin tersebut memiliki versi vDSO yang menyertainya , seperti gettimeofday. Ketika program Anda dijalankan, jika kernel Anda tidak memiliki vDSO dukungan, syscall tradisional akan dibuat.

Kredit dan tautan berguna:

Giuseppe Pes
sumber
3
Mengapa vsyscall hanya memiliki 4 panggilan sistem? Ada 8 megabyte yang dicadangkan untuk panggilan sistem dan hanya 1 halaman (sebenarnya 3 fungsi, disesuaikan dengan 1024 ambil 1 halaman) digunakan.
skap
9

Saya hanya ingin menambahkan bahwa sekarang di kernel baru, vDSOtidak hanya digunakan untuk syscall "aman" tetapi digunakan untuk memutuskan mekanisme syscall mana yang lebih disukai metode untuk memanggil syscall pada sistem.

tidak kompeten
sumber