Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Goで実践するSeccompを使ったファイルアクセス制御の話

Avatar for sh47 sh47
May 28, 2025

 Goで実践するSeccompを使ったファイルアクセス制御の話

Asakusa.go 2025年5月21日(水)

Avatar for sh47

sh47

May 28, 2025

Other Decks in Technology

Transcript

  1. 話すこと • 今回使う技術について ◦ seccomp ◦ ptrace ◦ unixドメインソケット •

    Seccompを使ったファイルアクセス制御について実験してみた ◦ 1) Seccomp+ptraceを使った特定 ファイルへ アクセスを制限する ◦ 2) SeccompとUNIXドメインソケットでファイルアクセス 安全性を高めるに
  2. 動機: Goでシステムプログラミングに挑戦 • Go システムプログラミング向き ◦ システムコールへ アクセス ◦ UNIXドメインソケットや名前空間

    操作といった OS 機能と直接やり取りができる ◦ 並行処理が書きやすい ◦ etc. • C言語と比べても短くシンプルに書ける でSeccompやPtrace 学習をGoでチャ レンジ
  3. Seccomp(secure computing mode) • Linux 機能であり、プロセスが実行できるシステムコールを制御できる ◦ 実行して良いシステムコール リストを与えると、それ以外 システムコールが実行されたときブ

    ロックできる • Go言語だったらlibseccomp-golangを使え 簡単にSeccompを活用できる ◦ https://github.com/seccomp/libseccomp-golang • ptraceと組み合わせると、システムコールとそ 引数 組み合わせでブロックする ことが可能 ◦ e.g.) “test.txt”をopenしたときにブロックする
  4. Seccompで システムコール実行を許可/禁止ができる • 先 例 Openで ファイル読み込みを禁止にする • でもファイルが読めない 不便

    ◦ たとえ 特定 ファイルへ アクセスだけブロックしたい • そこで細かい制御で組み合わせる がptraceというLinuxシステムコール
  5. ptrace • デバッガ等がプロセス 実行を制御するため Linux システムコール ◦ gdbやstraceコマンドも内部で使ってる ◦ Goで

    syscallパッケージ経由で使える • ターゲット プロセスにアタッチしてメモリやレジスタ 中身を見れる ◦ 今発表で 監視対象プロセスが開こうとしてるファイルを特定する に使う • システムコール 呼び出し/終了をフックできる ◦ デバッグだったりセキュリティにおける監視に活用できる https://man7.org/linux/man-pages/man2/ptrace.2.html straceでもptraceが使われている 対象プロセス メモリ空間から データ読み出しも Goで シンプル に書ける
  6. seccomp+ptraceで特定ファイルへ アクセスをブロック • 親プロセスが子プロセスが特定 ファイルへ アクセスする をブロック ◦ seccompにより子プロセス でファイルへ

    アクセス (openat)が発生したときにトラップを発生させて 親プロセス が補足 • seccompでopenatが叩かれた時、親プロセスに通知 • 親プロセスで 子プロセスにptraceでアタッチしてファイル名を調べる 親プロセス 子プ1ロセス (1) exec.Commandで起動 (2) ファイルを開いた を通知 (4) ptraceでファイル名を調べる ファイル (3) 子プロセスが ファイルを開く
  7. seccomp+ptraceで特定ファイルへ アクセスを検知 親プロセス側 設定 • 子プロセスがSeccompルールに引っかかったらトラップし親プロセスが補足 • ファイル名 取得 親プロセスがptraceで行う

    ◦ seccomp 何 システムコールが呼 れたか 分かってもファイル名等 詳細な引数 分からな い。 ◦ そ ためptraceで子プロセスにアタッチしてメモリからファイル名を読み出す https://man7.org/linux/man-pages/man2/seccomp.2.html
  8. 複数 プロセス間で ファイルアクセス制御 • 例) 以下 2つ プロセスを想定 ◦ プロセスAで

    ファイルを開く ◦ プロセスBで seccompでopenatを禁止する ◦ プロセスB ファイルを読み出すに プロセス Aからディスクリプタを受け取る ▪ Unixドメインソケットを通してディスクリプタを受け取る • Seccomp+UNIXドメインソケット 応用 ◦ プロセスを分離し安全性について細かい制御ができる で ▪ 不審なファイルアクセスがないか知るに プロセス Aだけ見れ ok ▪ 万が一プロセスAが乗っ取られてもプロセス A システムコールが制限されてる プロセスA プロセスB (1) ファイル名を渡す (3) ディスクリプタを返す ファイル (2) openでディスクリプタを取得
  9. ユースケース: Seccomp+UNIXドメインソケットでプロセス間で ファイル アクセス処理を分離 2つ プロセス(プロセスA, プロセスB) • Seccompで以下 ようにシステムコールを制御する

    ◦ プロセスA openを実行できない ◦ プロセスB openを実行できる • プロセスAがファイルをアクセスしたい場合 ◦ プロセスBにファイルを開いて貰ってディスクリプタを受け取る ◦ UNIXドメインソケットによるディスクリプタパッシングを用いる • ファイルを開く プロセスBにしか許可されていない ◦ Seccompで責務を分離する プロセスB ファイルを読みたかったらプロセスAにリクエストすれ 良い
  10. プロセス間で ファイルアクセス制御 利点を考えてみる • プロセスを分離してアタックサーフェスを局所化できないか ◦ 例え プロセスAが乗っ取られたとしても使えるシステムコール Seccompで制限されている •

    プロセス 責務を分離することで細かいセキュリティ制御が可能になる で ◦ e.g.) 不審なファイルアクセスがないか知るに プロセス Aだけ見れ okになる プロセスA プロセスB (1) ファイル名を渡す (3) ディスクリプタを返す ファイル (2) openでディスクリプタを取得
  11. まとめ • GoでSeccomp/ptrace/UNIXドメインソケットを使った処理を実践 ◦ 主に使ったpackage libseccomp-golang, syscall • 以下 ように応用できる

    ◦ 特定 ファイルにアクセスした を seccomp+ptraceで検知してブロック ▪ 侵入検知に応用できそう ◦ プロセス間でUnixドメインソケットを介したやり取りによるファイルアクセス制御 ▪ 細かいアクセス制御してシステム 安全性を高めるため 使い方ができないか • Seccomp+Ptrace+Unixドメインソケット 組み合わせ ◦ 他にも面白い使い方ができないか模索していきたい
  12. 参考資料 • Applying Seccomp Filters at Runtime for Go Binaries

    ◦ https://www.heroku.com/blog/applying-seccomp-filters-on-go-binaries/ • Tracing Processes in Go with Ptrace and Seccomp ◦ https://medium.com/@mindo.robert1/tracing-processes-in-go-with-ptrace-and-seccomp-9904cf a7121e • Goメモ-565 (ファイルディスクリプタパッシング)(File Descriptor Passing, sys/unix, SCM_RIGHTS) ◦ https://devlights.hatenablog.com/entry/2025/04/21/073000