TenForward

技術ブログ。はてなダイアリーから移転しました

LXDのシステムコールインターセプション機能を試す(ちょっと成功編)

昨日失敗した「システムコールインターセプション」機能のお試し。

tenforward.hatenablog.com

昨日追記した

t=2020-03-30T21:42:08+0900 lvl=dbug msg="Handling mknod syscall" audit_architecture=3221225534 container=c1 project=default seccomp_notify_flags=0 seccomp_notify_id=11827333229505280862 syscall_args="&{cMode:8192 cDev:0 cPid:13025 path:/run/systemd/inaccessible/chr}" syscall_number=133

でふと思いつきました。私が試している Plamo Linux 7.1 には systemd はいませんので、これはコンテナ上の systemd のお話だと仮定して、このパスについて調べました。コンテナ上に /run/systemd/inaccessible/chr ディレクトリが存在しなかったので、このディレクトリがないことによるエラーじゃないかと思い、それじゃあということで試しました。(ディレクトリがない理由はわかりません)

images.linuxcontainers.org にある alpine のイメージを使ってコンテナを作ります。

$ lxc launch images:alpine/3.11 a1
a1 を作成中
a1 を起動中                                         
$ lxc shell a1
a1:~# mknod test c 5 1
mknod: test: Operation not permitted

mknodが失敗する所までは同じ。security.syscalls.intercept.mknodtrue に設定してコンテナを再起動すると、特にエラーになることもなく起動します。

$ lxc config set a1 security.syscalls.intercept.mknod true
$ lxc restart a1
$ lxc shell a1

ここでコンテナ内で mknod すると、

a1:~# mknod test c 5 1
a1:~# ls -l
total 0
crw-rw-rw-    0 root     root        5,   1 Mar 31 09:42 test

無事デバイスファイルが作成できました。当たり前ですが、あっさりすぎるほど成功です。

コンテナログにも関連するログが出ていますね。

lxc a1 20200331094221.740 TRACE    seccomp - (path to lxc src)/src/lxc/seccomp.c:lxc_seccomp_load:1267 - Retrieved new seccomp listener fd 7
lxc a1 20200331094221.740 TRACE    attach - (path to lxc src)/src/lxc/attach.c:attach_child_main:810 - Loaded seccomp profile
lxc a1 20200331094221.740 TRACE    commands - (path to lxc src)/src/lxc/commands.c:lxc_cmd_accept:1522 - Accepted new client as fd 14 on command server fd 7
lxc a1 20200331094221.740 TRACE    commands - (path to lxc src)/src/lxc/commands.c:lxc_cmd_rsp_recv:123 - Command "seccomp_notify_add_listener" received response
lxc a1 20200331094221.740 DEBUG    commands - (path to lxc src)/src/lxc/commands.c:lxc_cmd_rsp_recv:156 - Response data length for command "seccomp_notify_add_listener" is 0
lxc a1 20200331094221.740 TRACE    commands - (path to lxc src)/src/lxc/commands.c:lxc_cmd:293 - Opened new command socket connection fd 9 for command "seccomp_notify_add_listener"
lxc a1 20200331094221.740 TRACE    commands - (path to lxc src)/src/lxc/commands.c:lxc_cmd_fd_cleanup:1434 - Closing client fd 14 for command "seccomp_notify_add_listener"

これで解決!と思ったのですが、次のように続けて別のファイルを作ろうとすると、まただんまりになります。

a1:~# mknod test c 5 1  (ちゃんと作成できる)
a1:~# mknod test2 c 0 0 (だんまり)
^C
a1:~# ls -l
total 0
crw-rw-rw-    0 root     root        5,   1 Mar 31 10:04 test

このときのコンテナログはまた

lxc a1 20200331095933.691 ERROR    seccomp - /home/karma/work/PlamoBuild/lxc_git/lxc/src/lxc/seccomp.c:seccomp_notify_handler:1359 - Invalid argument - Failed to read seccomp notification

LXDのログは

t=2020-03-31T19:04:23+0900 lvl=dbug msg="Handling mknod syscall" audit_architecture=3221225534 container=a1 project=default seccomp_notify_flags=0 seccomp_notify_id=16212327395031920484 syscall_args="&{cMode:8630 cDev:1281 cPid:31237 path:test}" syscall_number=133

うーむ、また謎が

オレ、何か mknod について勘違いしてる? 😅(続くかも)

(2020-04-09 追記)

Ubuntu 20.04 LTS の beta で試してみました。LXD は snap で 3.23 が動いていましたが、alpine コンテナで実行すると同じ(最初のmknodはうまくいくが次はうまくいかない)ような感じになりました。