Sebuah proses terisolasi menerbitkan system call yang tidak dapat direduksi secara aman oleh kebijakan seccomp biasa menjadi keputusan statis izinkan atau tolak. Argumennya mungkin merujuk ke memori proses yang dapat berubah, atau operasi tersebut memerlukan pekerjaan berprivilege yang dilakukan di luar proses terisolasi. Mengembalikan errno tetap terlalu membatasi, sedangkan mengizinkan panggilan secara langsung memberi target otoritas lebih besar daripada yang dimaksudkan deployment.
Notifikasi pengguna seccomp Linux membentuk jalur mediasi untuk kondisi ini. Filter dapat mengembalikan SECCOMP_RET_USER_NOTIF, sehingga kernel memblokir task pemicu dan mengirim permintaan melalui listener file descriptor. Supervisor userspace menerima permintaan tersebut lalu memasok hasil. Mekanisme ini memindahkan lokasi keputusan untuk syscall terpilih, tetapi tidak menjadikan seccomp sebagai reference monitor umum tanpa kebijakan dan kontrol race tambahan.
Listener terikat pada filter, bukan satu task
Sebuah proses memasang filter seccomp dengan SECCOMP_FILTER_FLAG_NEW_LISTENER. Jika berhasil, seccomp() mengembalikan listener file descriptor yang terkait dengan filter tersebut. Descriptor itu dapat dipindahkan ke proses lain, termasuk melalui pengiriman descriptor pada Unix-domain socket.
Saat filter memilih SECCOMP_RET_USER_NOTIF, syscall yang cocok tidak langsung dieksekusi. Task berhenti menunggu selama permintaan masih pending. Supervisor menerima struct seccomp_notif melalui SECCOMP_IOCTL_NOTIF_RECV dan merespons dengan SECCOMP_IOCTL_NOTIF_SEND.
Listener terkait dengan filter, bukan satu task. Karena itu, turunan yang memakai filter terpasang yang sama dapat menghasilkan notifikasi pada listener yang sama. Properti ini cocok untuk container manager dan process supervisor, tetapi juga berarti state kebijakan tidak boleh menganggap satu listener selalu memetakan satu identitas pemanggil.
Notifikasi membawa identifier, identifier task jika terlihat dalam PID namespace milik listener, flags, dan struct seccomp_data. Nomor syscall, nilai arsitektur, instruction pointer, serta nilai mentah register argumen tersedia melalui struktur data tersebut. Notifikasi tidak menyalin memori arbitrer yang dirujuk oleh argumen pointer.
Argumen pointer mentah tetap berupa state yang dapat berubah
Untuk syscall dengan argumen pointer, nilai register hanya mengidentifikasi alamat di target. Supervisor yang membaca string atau struktur dari memori target sedang mengamati state yang dapat berubah secara independen dari metadata notifikasi.
Kondisi ini membentuk batas time-of-check to time-of-use. Jika kebijakan memeriksa satu representasi lalu melakukan pekerjaan menggunakan data yang dibaca ulang dari memori target yang dapat berubah, thread lain pada target berpotensi mengubah byte di antara kedua operasi tersebut. Dokumentasi kernel menyoroti race ini dan menyarankan penyalinan memori target yang relevan ke memori milik supervisor sebelum keputusan kebijakan dibuat.
Satu kali penyalinan pun tidak membuat setiap pola emulasi menjadi atomik. Supervisor harus menetapkan byte salinan mana yang membentuk permintaan terotorisasi dan memastikan operasi berprivilege berikutnya memakai representasi yang sudah ditangkap tersebut, bukan nilai baru yang dikendalikan target. Syscall dengan graf pointer kompleks atau semantik yang relatif terhadap proses dapat memerlukan penanganan tambahan.
SECCOMP_IOCTL_NOTIF_ID_VALID menangani race yang berbeda. Operasi ini memungkinkan supervisor memeriksa apakah identifier notifikasi yang sudah diterima masih merujuk pada permintaan pending yang hidup. Hal ini relevan ketika target berhenti, sinyal menginterupsi syscall yang diblokir, atau identifier task numerik dapat dipakai kembali. Validasi identifier notifikasi tidak memvalidasi isi memori target.
Nilai balik sintetis bukan eksekusi syscall
Supervisor dapat menjawab notifikasi dengan nilai balik atau error. Dalam kondisi tersebut, kernel mengembalikan hasil yang diberikan kepada task yang diblokir tanpa mengeksekusi syscall yang dicegat.
Perbedaan ini penting untuk operasi yang memiliki efek samping di kernel. Mengembalikan nilai yang tampak sukses tidak menciptakan efek samping tersebut. Jika operasi yang dicegat seharusnya menghasilkan file descriptor, mapping, perubahan filesystem, atau objek kernel lain, supervisor memerlukan mekanisme yang benar-benar membentuk state terkait.
Karena itu, model respons hanya mendukung emulasi sejauh supervisor dapat mereproduksi efek yang relevan dan terlihat dari luar. Kebijakan yang merekayasa status sukses tanpa membentuk state yang dibutuhkan dapat merusak invariant aplikasi meskipun tidak ada batas privilege yang dilanggar.
Supervisor juga dapat menetapkan SECCOMP_USER_NOTIF_FLAG_CONTINUE, yang menginstruksikan kernel untuk mengeksekusi syscall asli. Operasi ini tidak setara dengan transaksi otorisasi stabil atas argumen pointer. Memori target dapat berubah setelah pemeriksaan supervisor dan sebelum kernel mengonsumsinya. Dokumentasi kernel secara eksplisit memperingatkan bahwa operasi continue terkena kelas race ini dan tidak patut diperlakukan sebagai primitive kebijakan keamanan untuk argumen yang dapat berubah.
ADDFD dapat memasang otoritas milik supervisor pada target
SECCOMP_IOCTL_NOTIF_ADDFD memberi supervisor sarana yang lebih konkret untuk operasi yang dicegat dan menghasilkan file descriptor. Supervisor dapat memasang duplikat descriptor miliknya ke tabel descriptor target dan mengembalikan nomor descriptor hasil pemasangan.
Operasi ini melintasi batas otoritas. Target menerima akses ke open file description yang sama atau objek kernel berbasis descriptor lain yang direpresentasikan oleh descriptor yang diinjeksi, sesuai semantik objek tersebut. Karena itu, supervisor harus memperlakukan pemilihan descriptor sebagai keputusan kebijakan, bukan sekadar pemformatan respons.
newfd_flags dapat meminta O_CLOEXEC untuk descriptor yang dipasang pada target. SECCOMP_ADDFD_FLAG_SETFD dapat meminta nomor descriptor tertentu; jika nomor itu sudah terbuka pada target, operasi terdokumentasi akan menggantinya. Semantik penggantian ini menjadikan asumsi tentang nomor descriptor sebagai bagian dari desain mediasi.
SECCOMP_ADDFD_FLAG_SEND dapat menggabungkan pemasangan descriptor dengan respons notifikasi. Bentuk atomik ini menghindari celah ketika descriptor sudah dimasukkan tetapi respons terpisah tidak dapat dikirim karena notifikasi tidak lagi valid. Mekanisme ini mempersempit satu race lifecycle; mekanisme tersebut tidak dengan sendirinya membuat descriptor yang dipilih aman bagi target.
Sinyal dapat membatalkan atau mengulang mediasi pending
Notifikasi ada selama target diblokir pada syscall yang dicegat. Lifecycle target dan pengiriman sinyal dapat mengubah state tersebut sebelum supervisor merespons. Respons terhadap permintaan yang sudah tidak valid dapat gagal dengan ENOENT.
Interupsi sinyal juga dapat menyebabkan syscall dimulai ulang dan menghasilkan notifikasi lain. Karena itu, supervisor tidak boleh menganggap setiap notifikasi yang terlihat selalu mewakili satu aksi aplikasi tingkat tinggi yang unik secara permanen. Efek samping yang dilakukan di luar transaksi notifikasi kernel memerlukan idempotensi atau mekanisme lain yang mencegah pekerjaan berprivilege dilakukan dua kali.
SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV mengubah penanganan sinyal setelah notifikasi diterima supervisor: sinyal nonfatal ditunda selama target menunggu respons, sedangkan sinyal fatal tetap berlaku. Hal ini dapat mengurangi gangguan pada mediasi berdurasi panjang, tetapi merupakan perilaku deployment, bukan jaminan umum bahwa sebuah permintaan pasti selesai.
Delegasi memperbesar peran keamanan supervisor
Filtering seccomp statis mempertahankan keputusan di dalam evaluasi kernel atas program BPF. Notifikasi pengguna secara sengaja menambahkan komponen userspace yang kredensial, namespace, inventaris descriptor, pembacaan memori, dan logika kebijakannya dapat memengaruhi hasil.
Supervisor tersebut dapat memiliki otoritas yang tidak tersedia bagi target. Desain ini dapat mendukung pemisahan privilege: permintaan sempit melintas dari proses terbatas ke komponen yang mampu menjalankan operasi terkendali. Susunan yang sama juga memusatkan risiko. Supervisor yang menerima identitas pemanggil ambigu, mempercayai data pointer yang dapat berubah, menginjeksi descriptor terlalu luas, atau melakukan pekerjaan irreversibel sebelum validitas permintaan dipastikan dapat melemahkan batas yang dimaksudkan.
Notifikasi pengguna seccomp paling presisi ketika diperlakukan sebagai protokol antara konteks syscall yang diblokir dan proses kebijakan. Kernel menyediakan identitas permintaan, blocking, transport respons, dan mekanisme transfer descriptor tertentu. Deployment tetap bertanggung jawab atas validasi semantik, penanganan race, minimalisasi otoritas, serta konsistensi antara hasil syscall sintetis dan efek samping yang dilakukan atas nama target.