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.
7f3c00137000-7f3c00179000 r-xp 00000000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c00179000-7f3c00379000 ---p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c00379000-7f3c0037a000 r--p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c0037a000-7f3c0037b000 rw-p 00043000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c0037b000-7f3c00383000 r-xp 00000000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00383000-7f3c00583000 ---p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00583000-7f3c00584000 r--p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00584000-7f3c00585000 rw-p 00009000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00585000-7f3c0059b000 r-xp 00000000 08:01 21237220 /lib/x86_64-linux-gnu/libnih.so.1.0.0
7f3c0059b000-7f3c0079b000 ---p 00016000 08:01 21237220 /lib/x86_64-linux-gnu/libnih.so.1.0.0
7f3c0079b000-7f3c0079c000 r--p 00016000 08:01 21237220 /lib/x86_64-linux-gnu/libnih.so.1.0.0
Menjelang akhir ada sesuatu seperti
7f3c0165b000-7f3c0177e000 rw-p 00000000 00:00 0 [heap]
7fff97863000-7fff97884000 rw-p 00000000 00:00 0 [stack]
7fff97945000-7fff97946000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Apa maksud vdso
dan vsyscall
maksudnya? adalah vsyscall bagian kernel dari memori? Akan sangat bagus jika ada yang bisa menjelaskan masalah ini.
Jawaban:
The 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 mengeksekusi panggilan sistem tertentu yang tidak memerlukan tingkat hak istimewa untuk dijalankan guna mengurangi overhead panggilan sistem. Mengikuti contoh sebelumnya, yanggettimeofday
perlu dilakukan hanyalah membaca waktu kernel saat ini. Ada aplikasi yanggettimeofday
sering 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 puasagettimeofday
implementasi (yaitu hanya fungsi yang membaca waktu yang disimpan ke dalam vsyscall ). Dengan menggunakan panggilan sistem virtual ini, pustaka C dapat menyediakan cepatgettimeofday
yang tidak memiliki overhead yang diperkenalkan oleh sakelar konteks antara ruang kernel dan ruang pengguna yang biasanya diperkenalkan oleh model panggilan sistem klasikINT 0x80
atauSYSCALL
.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 , sepertigettimeofday
. Ketika program Anda dijalankan, jika kernel Anda tidak memiliki vDSO dukungan, syscall tradisional akan dibuat.Kredit dan tautan berguna:
sumber
Saya hanya ingin menambahkan bahwa sekarang di kernel baru,
vDSO
tidak hanya digunakan untuk syscall "aman" tetapi digunakan untuk memutuskan mekanisme syscall mana yang lebih disukai metode untuk memanggil syscall pada sistem.sumber