Sebuah supervisor mencatat PID 4127, mengerjakan aktivitas lain, lalu mengirim sinyal ke 4127. Di antara kedua langkah itu, proses awal dapat berhenti dan kernel pada akhirnya dapat memberikan PID numerik yang sama kepada proses lain. Angka tersebut tetap menunjuk suatu proses, tetapi belum tentu proses yang semula hendak dipengaruhi supervisor.

PID file descriptor Linux, yang umum disebut pidfd, memindahkan batas tersebut dari pencarian ulang angka menjadi file descriptor yang merujuk task tertentu. Perubahan ini sempit tetapi relevan bagi keamanan: operasi yang menerima pidfd dapat tetap terikat pada task yang dipilih saat referensi diperoleh, alih-alih kembali mencari angka yang dapat digunakan ulang.

PID numerik adalah nama, bukan handle yang tahan lama

PID positif bermakna di dalam PID namespace dan dapat digunakan ulang setelah proses terkait tidak ada. Kode yang membaca PID, memeriksa sebuah properti, lalu menjalankan operasi memakai angka yang sama memiliki celah waktu tempat identitas proses dapat berubah.

Pemeriksaan keberadaan sebelumnya tidak menutup celah itu. Sebagai contoh, keberhasilan kill(pid, 0) menetapkan fakta tentang proses yang diidentifikasi PID tersebut pada saat pemanggilan. kill(pid, SIGTERM) yang dijalankan kemudian melakukan pencarian PID lagi. Kedua pemanggilan itu tidak membentuk satu operasi atomik yang terikat identitas.

Perbedaan ini paling penting saat tindakan berikutnya membawa otoritas: menghentikan proses, memasuki namespace miliknya, memperoleh salah satu file descriptor miliknya, atau menerapkan operasi lain yang diarahkan ke proses. Pemeriksaan izin tetap diperlukan, tetapi izin saja tidak membuktikan bahwa identifier numerik yang telah digunakan ulang masih menunjuk target yang dimaksud.

pidfd_open mengubah pencarian PID saat ini menjadi referensi kernel

pidfd_open(pid, flags) memperoleh file descriptor yang merujuk task yang dipilih oleh pid. Pencarian tetap dimulai dengan PID numerik, sehingga akuisisi dapat gagal bila target sudah tidak ada. Namun, setelah pemanggilan berhasil, descriptor yang dihasilkan merujuk task terpilih tersebut dan tidak menjadi instruksi tetap untuk mencari kembali PID numerik.

Descriptor dibuat dengan close-on-exec aktif. Descriptor itu juga mengikuti aturan lifetime file descriptor biasa: duplikasi menghasilkan descriptor lain untuk referensi dasar yang sama, dan penutupan salinan terakhir melepaskan referensi milik pemanggil.

Untuk perangkat lunak yang membuat sendiri proses target, clone() atau clone3() dengan CLONE_PIDFD dapat mengembalikan pidfd sebagai bagian dari pembuatan proses. Susunan ini menghindari langkah akuisisi PID-ke-pidfd yang terpisah setelah pembuatan. pidfd_open() tetap menjadi antarmuka normal untuk memperoleh pidfd bagi proses yang sudah ada.

Signaling melalui pidfd_send_signal menghapus retargeting akibat penggunaan ulang PID

pidfd_send_signal() mengirim sinyal ke proses yang dirujuk pidfd. Kernel tetap menerapkan aturan izin sinyal; kepemilikan descriptor bukan pemberian otorisasi tanpa batas.

Properti identitas terpisah dari otorisasi. Jika proses yang dirujuk berhenti, pidfd tidak diam-diam mulai merujuk proses berikutnya yang menerima PID numerik sama. Karena itu, operasi sinyal melalui pidfd tidak dapat dialihkan targetnya hanya akibat penggunaan ulang PID.

Properti tersebut membuat urutan supervisor umum memiliki sifat yang berbeda secara material:

int pfd = syscall(SYS_pidfd_open, pid, 0);
if (pfd == -1)
    /* target was not acquired */;

/* policy checks and other work */

if (syscall(SYS_pidfd_send_signal, pfd, SIGTERM, NULL, 0) == -1)
    /* handle permission, lifetime, or other errors */;

pidfd menstabilkan identitas target sepanjang celah waktu tersebut. Ia tidak menstabilkan kredensial, executable image, security label, atau status aplikasi. Jika kebijakan bergantung pada properti yang dapat berubah itu, kebijakan memerlukan aturan tersendiri mengenai kapan properti diambil dan apakah transisi berikutnya dapat diterima.

Pollability mengubah exit proses menjadi status descriptor

pidfd yang diperoleh melalui antarmuka pidfd yang didukung dapat dipantau dengan poll(), select(), atau epoll(). Terminasi proses membuat descriptor melaporkan readiness sesuai semantik polling pidfd yang terdokumentasi. Dengan demikian, event loop dapat mengaitkan pengamatan lifecycle dengan referensi kernel yang sama seperti yang dipakai untuk operasi terarah ke proses.

Sifat ini lebih kuat daripada memeriksa keberadaan PID berulang kali. Polling pidfd mengamati lifecycle task yang dirujuk; mekanisme itu tidak beralih ke task pengganti setelah PID numerik digunakan ulang.

Waiting memiliki aturan relasi tambahan. pidfd tidak membuat setiap proses yang dirujuk dapat di-wait oleh setiap pemanggil. Perilaku waitid() tetap bergantung pada relasi proses dan cara pidfd diperoleh. Identitas stabil dan izin untuk reap atau wait merupakan properti yang berbeda.

pidfd_getfd membawa batas akses ptrace yang terpisah

pidfd_getfd(pidfd, targetfd, flags) dapat menduplikasi file descriptor dari proses yang dirujuk oleh pidfd. Descriptor baru merujuk open file description yang sama dengan descriptor target, sehingga file offset dan file status flags dibagi pada tingkat tersebut.

Operasi ini sengaja tidak diotorisasi hanya berdasarkan kepemilikan pidfd. Linux menerapkan pemeriksaan akses PTRACE_MODE_ATTACH_REALCREDS. pidfd memilih proses target tanpa ambiguitas penggunaan ulang PID; mekanisme akses ptrace menentukan apakah pemanggil boleh melintasi batas proses untuk memperoleh descriptor.

Pemisahan itu penting dalam desain berorientasi capability. pidfd adalah referensi stabil, tetapi operasi yang berbeda melalui referensi tersebut menerapkan kondisi otorisasi masing-masing. Menganggap setiap pidfd setara dengan kendali tanpa batas atas proses akan melebihkan semantik keamanan antarmuka ini.

PID namespace tetap membentuk akuisisi dan operasi

Nilai PID bersifat relatif terhadap namespace. Pemanggil hanya dapat memberikan nilai PID yang bermakna dari sudut pandang namespace-nya saat memperoleh pidfd, dan operasi terarah ke proses tetap memiliki pembatasan spesifik namespace yang ditentukan antarmukanya.

pidfd mengurangi ambiguitas setelah akuisisi; ia tidak meratakan PID namespace menjadi namespace proses global. Broker yang menerima PID numerik dari namespace lain tetap memerlukan protokol eksplisit mengenai namespace tempat angka itu ditafsirkan. Mengirim pidfd yang sudah diperoleh melalui socket AF_UNIX memakai SCM_RIGHTS dapat memindahkan referensi kernel antarproses yang bekerja sama, dengan tetap tunduk pada kemampuan proses penerima untuk memakai setiap operasi berikutnya.

Hal ini juga memisahkan provenance dari otoritas. Menerima pidfd dapat mengidentifikasi referensi task yang dipilih di tempat lain, tetapi tidak membuktikan bahwa setiap operasi pada task tersebut diizinkan atau tepat.

Identitas stabil mempersempit satu kelas race pada kontrol proses

pidfd menghapus satu mode kegagalan spesifik dari kontrol proses Linux: operasi berbasis pidfd yang dijalankan kemudian tetap terkait dengan task yang dirujuk descriptor, bukan mencari ulang PID yang dapat digunakan kembali. Sifat ini terutama berguna ketika pemilihan dan tindakan dipisahkan oleh jeda event loop, evaluasi kebijakan, IPC, atau supervisi asinkron.

Batasnya tetap sengaja sempit. pidfd tidak membekukan atribut proses, melewati pemeriksaan izin sinyal atau ptrace, menjamin task tetap hidup, ataupun memberikan makna tingkat aplikasi kepada proses. Nilai keamanannya adalah referensi identitas kernel yang stabil. Sistem yang memisahkan otorisasi, status proses yang dapat berubah, interpretasi namespace, dan penanganan lifecycle dapat memakai properti tersebut tanpa memperluasnya menjadi jaminan yang tidak diberikan Linux.