Agen diagnostik mungkin memerlukan byte dari proses lain tanpa menghentikan proses tersebut atau melakukan attach seperti debugger tradisional. Linux process_vm_readv() menyediakan jalur data itu: pemanggil memberikan buffer lokal dan rentang alamat pada proses target, lalu kernel mentransfer byte di antara kedua address space.
Interface ini kuat karena target tidak secara eksplisit mengirimkan data. Batas keamanannya karena itu berada di luar protokol aplikasi milik target. Linux membatasi operasi dengan pemeriksaan access mode ptrace, sementara transfer memori tetap bergantung pada layout virtual memory target yang dapat berubah.
Izin merupakan keputusan inspeksi proses
process_vm_readv() tidak memberikan akses memori arbitrer hanya karena dua proses berada pada host yang sama. Izin untuk mengakses proses lain diatur oleh pemeriksaan PTRACE_MODE_ATTACH_REALCREDS. Pemeriksaan tersebut merupakan bagian dari mekanisme access control ptrace yang lebih luas saat satu proses dapat menginspeksi atau mengubah state sensitif milik proses lain.
Keputusan dapat bergantung pada credential, capabilities, status dumpable target, dan kebijakan Linux Security Module yang aktif. Karena itu, kecocokan PID target bukan otoritas yang memadai. Process supervisor, debugger, crash collector, atau agen observability tetap beroperasi di dalam kebijakan inspeksi proses milik kernel.
Hal ini juga berarti kebijakan deployment dapat mengubah hasil tanpa perubahan pada pemanggilan process_vm_readv() itu sendiri. Kebijakan LSM dan pembatasan ptrace merupakan bagian dari trust boundary efektif di sekitar syscall.
Vektor alamat mendeskripsikan dua address space independen
Syscall menerima array struct iovec untuk sisi lokal dan remote. Entry remote mengidentifikasi virtual address pada proses target; entry lokal mengidentifikasi tujuan pada pemanggil.
struct iovec local = {
.iov_base = buffer,
.iov_len = sizeof buffer,
};
struct iovec remote = {
.iov_base = remote_address,
.iov_len = sizeof buffer,
};
ssize_t n = process_vm_readv(pid, &local, 1, &remote, 1, 0);Panjang vektor lokal dan remote tidak harus sama untuk setiap entry. Linux memproses vektor sesuai urutan array, mengisi entry lokal dan mengonsumsi entry remote berdasarkan panjangnya. Argumen flags saat ini wajib bernilai nol.
Pemanggil karena itu memerlukan dua bentuk correctness sekaligus: otorisasi untuk menginspeksi proses dan informasi alamat target yang akurat. Yang pertama ditegakkan oleh access control; yang kedua merupakan properti state memori target saat operasi berlangsung.
Mapping remote divalidasi selama transfer
Linux memvalidasi metadata vektor lokal sebelum memulai operasi, tetapi region memori remote diperiksa ketika transfer mencapainya. Alamat remote yang menjadi tidak valid, atau entry yang mencapai region tanpa akses, dapat menghentikan operasi setelah byte sebelumnya sudah berpindah.
Return value yang sukses dapat lebih kecil daripada total panjang yang diminta. Pemanggil yang memerlukan snapshot dengan panjang tepat harus membandingkan jumlah byte hasil dengan panjang yang dituju, bukan menganggap setiap hasil nonnegatif sebagai transfer lengkap.
Perilaku ini penting untuk pembacaan struktur data yang dapat melintasi batas page. Rentang remote dapat dimulai pada page valid lalu berlanjut ke page yang tidak tersedia. Bagian awal mungkin sudah tersalin ketika akses berikutnya gagal.
Dokumentasi syscall menyarankan agar satu elemen vektor remote tidak melintasi batas page ketika membaca data dengan panjang yang belum diketahui seperti C string pada memori remote. Pemisahan rentang remote pada batas page membatasi titik tempat page yang tidak dapat diakses menghentikan sebuah elemen vektor.
Read yang diizinkan bukan snapshot atomik
Transfer data tidak dijamin atomik. Proses target dapat terus berjalan dan mengubah memori ketika pemanggil membacanya. Dua field yang disalin dalam satu operasi karena itu dapat mencerminkan momen berbeda jika target memodifikasinya secara concurrent.
Properti tersebut memisahkan akses dari konsistensi:
pemeriksaan ptrace -> bolehkah pemanggil menginspeksi proses ini?
validitas alamat -> dapatkah rentang remote diakses sekarang?
state aplikasi -> apakah byte hasil membentuk snapshot koheren?process_vm_readv() menangani dua bagian pertama pada batas kernel. Syscall ini tidak membuat protokol snapshot level aplikasi untuk state mutable.
Sistem monitoring yang membaca counter lock-free mungkin dapat menerima trade-off tersebut. Tool analisis crash yang memerlukan object graph koheren mungkin membutuhkan mekanisme koordinasi terpisah, penghentian proses, skema versioning, atau format data yang dirancang untuk observasi concurrent. Syscall itu sendiri tidak menyediakan semantik tersebut.
Identitas proses numerik tetap menjadi persoalan terpisah
Target dipilih menggunakan PID numerik. Interface tersebut tidak mengubah PID menjadi referensi objek yang persisten. Software kontrol yang berjalan lama tetap perlu memperhitungkan lifecycle proses dan penggunaan ulang PID saat menentukan task yang direpresentasikan sebuah identifier.
Pemeriksaan akses melindungi proses yang saat ini memiliki identitas terpilih, tetapi logika aplikasi tetap perlu mengikat keputusan otorisasinya pada instance proses yang dimaksud. PID lama yang disimpan melewati event lifecycle dapat kemudian menunjuk ke task berbeda.
Persoalan ini terpisah dari pemeriksaan izin memori. Otorisasi kernel dapat dengan benar menolak atau mengizinkan akses terhadap target saat ini sementara pemanggil sudah memilih proses yang keliru akibat state identitas yang stale.
Read dan write berbagi bentuk transport tetapi bukan konsekuensi keamanan
Linux juga menyediakan process_vm_writev(), yang mentransfer byte ke arah sebaliknya. Kedua interface memakai vektor lokal dan remote serta diatur oleh access control bergaya ptrace, tetapi penulisan memori proses lain mengubah state target alih-alih hanya mengobservasinya.
Kebijakan operasional karena itu sebaiknya tidak memperlakukan transfer memori lintas proses sebagai satu capability tanpa pembedaan. Komponen yang hanya memerlukan observasi mungkin tidak memiliki alasan sah untuk memutasi memori target. Kebijakan kernel dan LSM, arsitektur proses, serta penetapan privilege perlu mencerminkan kebutuhan yang lebih sempit jika memungkinkan.
Pembedaan tersebut juga penting selama analisis insiden. Jalur read dapat mengekspos credential, material kriptografis, atau data aplikasi yang berada di memori. Jalur write dapat mengubah control data atau state aplikasi. Keduanya tidak dapat dianggap aman hanya karena tidak memakai urutan attach ptrace() tradisional.
Batas keamanan menggabungkan otoritas, identitas, dan stabilitas memori
process_vm_readv() paling tepat diperlakukan sebagai kanal observasi berprivilege dengan kontrak yang mencakup beberapa kondisi independen. Pemanggil harus lolos pemeriksaan akses ptrace, mengidentifikasi proses hidup yang dimaksud, memberikan alamat remote yang valid, serta menangani transfer yang dapat parsial atau berlangsung bersamaan dengan mutasi target.
Kondisi tersebut menghasilkan jaminan yang lebih sempit daripada istilah pembacaan lintas proses. Otorisasi yang sukses menetapkan bahwa kernel mengizinkan relasi inspeksi pada saat itu. Otorisasi tidak memastikan identitas semantik byte, membekukan target, atau menjamin rentang multi-page yang diminta tiba sebagai satu snapshot koheren.
Untuk tooling yang sensitif terhadap keamanan, batas tersebut perlu tetap eksplisit. Kebijakan inspeksi proses menentukan akses, logika lifecycle proses menentukan identitas target, dan koordinasi spesifik aplikasi menentukan apakah memori yang disalin cukup konsisten bagi operasi yang dilakukan.