Sebuah system call yang dipilih oleh seccomp filter dapat berhenti sebelum dieksekusi kernel lalu muncul sebagai request pada notification file descriptor. Dengan SECCOMP_RET_USER_NOTIF, Linux mengubah call tersebut menjadi titik koordinasi antara target yang terblokir dan supervisor userspace. Supervisor dapat mengemulasikan hasil, menginjeksi file descriptor untuk operasi yang sesuai, atau mengizinkan kernel melanjutkan call asli.

Mekanisme ini sengaja lebih sempit daripada security policy engine umum di userspace. Batas terkuatnya adalah protokol suspensi dan respons yang dimediasi kernel. Data yang diakses melalui pointer ke memori target tetap dapat berubah di sekitar proses inspeksi supervisor, dan respons yang melanjutkan call asli kembali masuk ke eksekusi kernel biasa dengan race tersebut tetap relevan.

Listener terikat pada filter

Filter yang dipasang dengan SECCOMP_FILTER_FLAG_NEW_LISTENER menghasilkan notification file descriptor. Rule yang mengembalikan SECCOMP_RET_USER_NOTIF membuat call yang cocok menghasilkan request pada descriptor tersebut.

Descriptor itu terkait dengan filter, bukan hanya satu task tertentu. Descendant yang berbagi filter dapat menghasilkan notification pada listener yang sama. Karena itu, descriptor berfungsi sebagai endpoint supervisi untuk satu domain filter, bukan mailbox privat milik satu thread.

Listener juga dapat dipindahkan melewati batas proses melalui mekanisme transfer descriptor biasa seperti SCM_RIGHTS. Properti ini memungkinkan container manager atau supervisor lain tetap terpisah dari workload yang call-nya diintersep.

Notification mewakili call yang terblokir, bukan pekerjaan yang sudah selesai

SECCOMP_IOCTL_NOTIF_RECV mengembalikan struct seccomp_notif yang berisi identifier, informasi thread target, dan struct seccomp_data. Pada titik ini, call yang diintersep belum selesai secara normal. Target menunggu respons kecuali request terinterupsi atau menjadi tidak valid karena kondisi lain.

Supervisor membalas dengan SECCOMP_IOCTL_NOTIF_SEND. Respons dapat memberikan return value atau error tanpa mengeksekusi system call asli. Pola ini memungkinkan emulasi ketika supervisor menjalankan pekerjaan ekuivalen atau pengganti dengan otoritasnya sendiri.

SECCOMP_USER_NOTIF_FLAG_CONTINUE memiliki semantik berbeda. Flag ini meminta kernel melanjutkan call asli milik target. Supervisor tidak lagi mengganti hasil; supervisor melepaskan target kembali ke jalur syscall normal.

Perbedaan tersebut penting karena emulasi dan continuation mengekspos transisi state yang berbeda. Supervisor yang menjalankan operasi sendiri bertindak dengan credentials, namespaces, descriptors, dan konteks proses miliknya kecuali state target yang relevan direkonstruksi secara sengaja.

Register argument adalah snapshot, memori yang ditunjuk bukan

struct seccomp_data membawa nomor syscall dan nilai mentah argument register. Untuk argument pointer, nilai tersebut adalah alamat. Notification tidak menyalin memori target yang dirujuk alamat itu menjadi request immutable.

Target yang memiliki thread lain yang masih runnable dapat mengubah memori ketika thread yang diintersep sedang terblokir. Jika supervisor membaca pathname, socket address, atau objek lain yang ditunjuk pointer lalu mengizinkan syscall asli berlanjut, kernel dapat melihat byte yang berbeda dari byte yang sebelumnya diperiksa supervisor.

Ini adalah batas time-of-check/time-of-use yang melekat pada model continuation. Dokumentasi kernel secara eksplisit memperingatkan agar userspace notification tidak diperlakukan sebagai mekanisme policy untuk call yang keputusan keamanannya bergantung pada pointer target yang didereference.

Ketika supervisor perlu memeriksa memori target untuk operasi yang diemulasikan, penyalinan seluruh input relevan ke memori milik supervisor sebelum keputusan dibuat menghasilkan snapshot lokal yang stabil untuk keputusan tersebut. Hal itu tidak membuat syscall yang kemudian dilanjutkan memakai snapshot tersebut.

Notification ID menjaga lifetime request

Notification yang diterima memiliki ID yang dipakai oleh operasi berikutnya. Target dapat berhenti atau call yang terblokir dapat terinterupsi sebelum supervisor selesai memproses request.

SECCOMP_IOCTL_NOTIF_ID_VALID memeriksa apakah sebuah ID masih merujuk pada request terblokir yang hidup. Pemeriksaan ini penting sebelum bertindak melalui interface yang memakai ID target yang dilaporkan, karena numeric process ID atau thread ID dapat dipakai ulang setelah proses keluar.

Validasi ID menangani lifetime notification. Validasi ini tidak membekukan memori target atau membuat transaksi yang mencakup tindakan supervisor secara arbitrer. Rancangan tetap perlu memisahkan “request ini masih aktif” dari “seluruh state eksternal yang diamati untuk request ini masih sama.”

ADDFD memindahkan open file description ke target

Sebagian system call yang diemulasikan secara alami mengembalikan file descriptor. SECCOMP_IOCTL_NOTIF_ADDFD memungkinkan supervisor memasang descriptor ke file descriptor table milik target saat memproses notification yang valid.

Tanpa SECCOMP_ADDFD_FLAG_SETFD, kernel memilih nomor descriptor target terendah yang tersedia. Dengan SECCOMP_ADDFD_FLAG_SETFD, supervisor meminta nomor tertentu sesuai aturan interface. newfd_flags dapat meminta O_CLOEXEC.

SECCOMP_ADDFD_FLAG_SEND dapat menggabungkan pemasangan descriptor dengan respons notification. Ini menghindari langkah respons terpisah antara pembuatan descriptor target dan pelepasan call yang terblokir.

Descriptor yang dipindahkan tetap merepresentasikan kernel object yang dibuka atau diperoleh supervisor. Injeksi descriptor karena itu melewati batas otoritas: supervisor memberi target akses ke objek yang dipilih di bawah kendali supervisor.

Readiness mengekspos state protokol

Notification descriptor terintegrasi dengan poll(), select(), dan epoll. Notification yang menunggu membuat descriptor readable. Setelah notification diterima, descriptor dapat menunjukkan writability untuk sebuah respons.

Integrasi ini memungkinkan mekanisme masuk ke event loop tanpa thread receive blocking khusus. Readiness tetap menggambarkan state protokol notification, bukan progres target. Event loop yang sibuk dapat menunda respons dan membuat thread yang diintersep tetap terblokir.

Availability supervisor akibatnya menjadi bagian dari liveness workload. Filter yang mengarahkan call penting ke listener menciptakan dependensi pada proses yang melayani listener tersebut. Penanganan kegagalan perlu memperhitungkan dependensi itu, bukan memperlakukan notification sebagai observability pasif.

Precedence filter tetap menjadi bagian dari batas

Seccomp filter dapat ditumpuk, dan precedence action memengaruhi perilaku yang berlaku. Userspace notifier bukan reference monitor eksternal yang otomatis mendominasi setiap keputusan filter berikutnya.

Kumpulan filter yang terpasang pada target karena itu tetap menjadi bagian dari security model. Jika policy target mengizinkan pemasangan filter tambahan atau operasi kontrol terkait, precedence action yang dihasilkan perlu dipertimbangkan bersama peran notifier yang dimaksud.

Ini juga menjadi alasan notification interface lebih cocok untuk privilege mediation daripada enforcement policy mandiri. Permission check kernel, namespace rule, capabilities, keputusan LSM, dan semantik seccomp filter tetap berotoritas di sekitar operasi yang didelegasikan.

Delegasi membentuk batas otoritas dan liveness yang eksplisit

Seccomp user notification mengubah percobaan syscall terpilih menjadi protokol request-response. Target berhenti, kernel menyediakan identitas request dan data call pada level register, lalu supervisor memilih bentuk respons yang tersedia.

Protokol ini dapat mendukung kompatibilitas container dan privileged mediation tanpa memindahkan seluruh subsystem ke target. Batasnya juga konkret: memori yang ditunjuk pointer bersifat mutable, identitas notification memiliki lifetime, continuation mempertahankan pointer race, descriptor yang diinjeksi memindahkan otoritas nyata, dan stall pada supervisor menjadi stall pada target.

Properti tersebut membuat mekanisme tepat saat delegasi memang disengaja dan kontrol keamanan kernel di sekitarnya tetap berlaku. Batas yang sama juga membedakannya dari pengganti lengkap berbasis userspace untuk syscall security policy.