Ubuntu 14.04でstrace
実行可能ファイルを使用すると、驚くべき動作が見つかりましたが、これには読み取り権限がありません。これがバグなのか、それとも標準がこのあいまいな動作を義務付けているのだろうか。
最初に、バックグラウンドで通常の実行可能ファイルを起動し、それに添付したときに何が起こるかを見てみましょう。予想どおり、これは機能します。
$ /bin/sleep 100 &
[2] 8078
$ strace -p 8078
Process 8078 attached
restart_syscall(<... resuming interrupted call ...>
次に、読み取り権限のない実行可能ファイルを試します。
---x--x--x 1 root root 26280 Sep 3 09:37 sleep*
この実行中のプロセスへの接続は許可されていません。
$ ./sleep 100 &
[1] 8089
$ strace -p 8089
strace: attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
これも私が期待することです。デバッガーをプロセスにアタッチし、その方法で実行可能ファイルの読み取りアクセス許可を効果的に設定できる場合、読み取りアクセス許可なしで実行アクセス許可を付与してもあまり効果はありません。
しかし、すでにトレースされたプロセスの下で実行可能ファイルを開始する場合、それを行うことは許可されています。
$ strace ./sleep 100
execve("./sleep", ["./sleep", "100"], [/* 69 vars */]) = 0
brk(0) = 0x9b7a000
これは私にとって予想外のことです。これはセキュリティのバグですか、それとも標準で義務付けられている機能ですか?
EPERM
来ているようだget_dumpable()
から呼び出された(コアダンプが許可されているかどうかをチェックするためにも使用され、したがって、「ダンプ可能」)__ptrace_may_access()
から呼び出されたptrace_attach()
のkernel/ptrace.c
。
execve
呼び出し時に、プロセスが既にトレースされている場合、実行されたファイルの読み取り許可が再度チェックされないためと思われます。彼の質問は、それがセキュリティバグなのか、必須の機能なのか(後者の場合、セキュリティバグであり、仕様のセキュリティバグにすぎないと考えています)。