Filter seccomp dapat menghentikan system call terpilih sebelum dieksekusi lalu mengubahnya menjadi request pada listener file descriptor. Thread pemanggil tetap terblokir saat supervisor userspace memeriksa notifikasi dan mengembalikan hasil. Mekanisme ini membentuk batas mediasi yang lebih sempit daripada tracing setiap system call dan lebih dinamis daripada menanam seluruh keputusan langsung di classic BPF.

Mekanismenya adalah SECCOMP_RET_USER_NOTIF. Filter mengembalikan action tersebut untuk operasi yang memerlukan mediasi eksternal. Filter yang dipasang dengan SECCOMP_FILTER_FLAG_NEW_LISTENER menghasilkan listener file descriptor, lalu supervisor memakai ioctl notifikasi seccomp pada descriptor tersebut.

Filter memilih call yang keluar dari jalur keputusan kernel

Filter seccomp konvensional menyelesaikan system call secara langsung melalui action seperti SECCOMP_RET_ALLOW, SECCOMP_RET_ERRNO, atau action yang menghentikan proses. User notification menambahkan jalur yang mendelegasikan keputusan ke userspace.

target thread
    |
    | system call
    v
seccomp filter
    |
    +-- ALLOW ----------> normal syscall execution
    |
    +-- ERRNO ----------> synthetic failure
    |
    +-- USER_NOTIF -----> listener fd -----> supervisor
                              ^                  |
                              |                  |
                              +---- response ----+

Listener terkait dengan filter yang terpasang, bukan dengan satu target thread tertentu. Jika beberapa task yang berbagi filter menghasilkan notifikasi, listener yang sama dapat menerimanya. Sifat ini cocok untuk event loop pada container manager atau proses lain yang mengawasi sandbox.

Jika SECCOMP_RET_USER_NOTIF terpilih tetapi listener yang terpasang tidak tersedia, system call tidak diteruskan secara diam-diam. Target menerima perilaku ENOSYS.

Notifikasi membawa argumen register, bukan salinan data yang ditunjuk pointer

SECCOMP_IOCTL_NOTIF_RECV mengembalikan struct seccomp_notif. Member data memuat nomor system call, informasi arsitektur, instruction pointer, dan nilai argumen yang ditangkap dari antarmuka system call.

Untuk argumen berupa integer, nomor file descriptor, flag mask, atau scalar sejenis, nilainya tersedia langsung. Argumen pointer berbeda: notifikasi membawa nilai pointer, bukan salinan immutable dari memori target yang dirujuk pointer tersebut.

Perbedaan itu membentuk batas time-of-check/time-of-use. Supervisor yang membaca pathname dari memori target lalu membuat keputusan kebijakan tidak dapat menganggap memori target tetap sama sesudahnya. Kode target multi-thread dapat mengubah byte yang dirujuk secara bersamaan.

Mediator yang kuat menyalin memori target yang diperlukan ke storage milik supervisor sebelum menjadikannya dasar keputusan. Meski demikian, mengizinkan system call asli untuk berlanjut dapat membuat kernel membaca kembali memori target, sehingga supervisor harus memperhitungkan observasi kedua terhadap state yang mutable.

ID notifikasi menandai request yang dapat hilang

Setiap notifikasi memiliki ID. Supervisor mengembalikan ID tersebut melalui SECCOMP_IOCTL_NOTIF_SEND, sehingga response terikat pada request yang sedang terblokir.

Notifikasi tidak dijamin tetap valid tanpa batas. Target dapat berhenti, atau penanganan signal dapat membatalkan operasi yang terblokir. SECCOMP_IOCTL_NOTIF_ID_VALID memungkinkan supervisor memeriksa apakah sebuah ID masih merujuk request aktif sebelum menjalankan aksi eksternal yang efek sampingnya mahal jika diterapkan pada request yang sudah stale.

Pemeriksaan validitas tidak mengubah rangkaian userspace multi-langkah menjadi transaksi umum. State masih dapat berubah setelah pemeriksaan. Fasilitas ini memeriksa kelangsungan request, bukan primitive sinkronisasi universal.

Response dapat mengemulasi return value atau melanjutkan call asli

Struktur response normal, struct seccomp_notif_resp, membawa ID notifikasi bersama return value, error, dan flags. Supervisor dapat menghasilkan success atau failure sintetis tanpa mengeksekusi system call asli milik target.

Linux juga menyediakan SECCOMP_USER_NOTIF_FLAG_CONTINUE. Dengan flag ini, kernel melanjutkan system call asli setelah notifikasi. Mode ini memerlukan perhatian khusus pada argumen pointer karena implementasi syscall dapat mengamati memori target setelah pemeriksaan kebijakan oleh supervisor.

Continuation karena itu tidak sama dengan mengeksekusi request beku yang ditangkap saat notifikasi. Operasi dilanjutkan dengan argumen register yang telah dilaporkan sebelumnya, tetapi memori yang dirujuk masih mungkin berubah.

Batas keamanan juga bergantung pada precedence filter. Seccomp mengevaluasi filter yang terpasang berdasarkan precedence action; action user notification tidak menggantikan hasil restriktif dengan precedence lebih tinggi dari filter lain.

ADDFD dapat memasang descriptor milik supervisor ke target

Sebagian operasi yang diintersep secara alami mengembalikan file descriptor. Supervisor mungkin perlu menjalankan sendiri operasi yang privileged atau sensitif terhadap kebijakan, kemudian memberikan descriptor hasilnya kepada target yang terblokir.

SECCOMP_IOCTL_NOTIF_ADDFD, pada kernel yang menyediakan operasi tersebut, menduplikasi descriptor dari supervisor ke tabel file descriptor target. Semantiknya serupa dengan transfer descriptor melalui SCM_RIGHTS: kedua sisi dapat memiliki descriptor yang merujuk open file description yang sama.

Kernel dapat mengalokasikan nomor descriptor terendah yang tersedia pada target, atau SECCOMP_ADDFD_FLAG_SETFD dapat meminta nomor descriptor target tertentu. newfd_flags dapat menerapkan O_CLOEXEC pada descriptor yang dipasang.

Untuk operasi emulasi seperti openat(), urutannya dapat berbentuk:

supervisor receives notification
        |
        v
supervisor opens approved object
        |
        v
SECCOMP_IOCTL_NOTIF_ADDFD
        |
        v
target receives descriptor

SECCOMP_ADDFD_FLAG_SEND dapat menggabungkan pemasangan descriptor dan response notifikasi secara atomik terhadap operasi tersebut. Hal ini menghindari celah antara keberhasilan memasukkan descriptor dan pengiriman hasil syscall secara terpisah.

User notification adalah mekanisme mediasi, bukan batas privilege umum dengan sendirinya

Supervisor harus memvalidasi setiap input yang memengaruhi aksi privileged. Notifikasi melaporkan percobaan operasi target, tetapi nomor file descriptor, pointer, namespace, credential, dan state concurrent yang dikendalikan target dapat mengubah makna nilai tersebut.

Sebagai contoh, argumen descriptor numerik mengidentifikasi entry pada tabel descriptor target, bukan tabel milik supervisor. Memakai integer yang sama secara lokal akan merujuk descriptor yang tidak terkait. Operasi descriptor lintas proses memerlukan mekanisme yang memang dirancang untuk relasi tersebut, bukan substitusi angka.

Mediasi pathname juga memiliki konteks filesystem namespace dan directory descriptor. Merekonstruksi operasi di supervisor dapat menghasilkan semantik resolusi berbeda kecuali mediator secara sengaja mempertahankan konteks yang relevan.

Batas yang berguna bersifat spesifik: notifikasi user seccomp mengubah percobaan syscall terpilih menjadi request sinkron yang dapat diperiksa dan dijawab supervisor. Emulasi yang benar tetap memerlukan penanganan eksplisit terhadap memori mutable, identitas descriptor, namespace, masa hidup request, dan semantik operasi yang diintersep.