タラバガニー設計局stalins.clubNOTE/notes/seccomp-user-notification

seccomp user notificationは「ポリシー判定器」ではない

seccomp user notificationは、seccomp filterが特定system callを検出したとき、その処理をuser spaceのsupervisorへ通知して一時停止できる仕組みである。

通常のseccomp-BPFではfilter自身が ALLOWERRNOKILL などを返す。一方、user notificationでは SECCOMP_RET_USER_NOTIF を返すことで、target processをkernel内で待たせ、listener fdを持つsupervisorが通知を受け取る。

これによりsupervisorは、targetより多くの情報や権限を使って処理し、system callを代理実行したり、失敗を返したり、条件によって元のsystem callをcontinueさせたりできる。

ただし、ここには重要な注意がある。Linuxの seccomp_unotify(2) manualは、user notification mechanismをsecurity policyの実装に使ってはいけないと明記している。

特に SECCOMP_USER_NOTIF_FLAG_CONTINUE で元のsystem callを続行させる場合、supervisorが引数を確認してからkernelが実際にsystem callを実行するまでの間にtarget側が引数を書き換えられるTOCTOU raceが存在する。

したがって、例えばpath accessの許可/拒否をuser notificationだけで決める設計は危険である。security boundaryはLandlockなどkernel側の仕組みに置き、user notificationは「より強い権限を持つsupervisorが安全に代理操作する」「resource virtualizationを行う」といった用途に限定する方が筋がよい。

この役割分担を実際に採る新しいprocess sandboxの例が SandlockはLandlockとseccompを組み合わせた軽量プロセスsandbox である。Landlockそのものについては Landlockは非特権プロセス自身が権限を削るLSM、sandboxの隔離境界全体については Linuxサンドボックスの隔離境界をどう捉えるか を参照。

#security

出典

▸ ノート一覧に戻る