web-dev-qa-db-ja.com

読み取り権限のない実行可能ファイルのトレース

実行可能ファイルでstraceを使用すると、Ubuntu 14.04で驚くべき動作が見つかりましたが、読み取り権限がありません。これはバグなのか、それともいくつかの標準がこのあいまいな動作を義務付けているのだろうか。

まず、通常の実行可能ファイルをバックグラウンドで起動してアタッチするとどうなるか見てみましょう。予想通りこれは機能します:

$ /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

これは私には予想外です。これはセキュリティバグですか、それとも標準で義務付けられている機能ですか?

17
kasperd

これは答えではなく、誰かが同様に勉強したい場合のリンクと考えの集まりです。これはかなり興味深いことです。

nixとLinuxの関連する回答 読み取り専用のバイナリをこの方法でダンプすることが可能である(または、現在、Vanillaカーネルでテストできない)ことを言及。

Grsecurityはこれを修正しようとしていました configオプション および パッチ自体 (それ以降変更されている可能性があります)

このコミット 実際には、カーネル開発者はsuidバイナリのダンプのみに関心があるように見えます。

しかし、実際にはこれから カーネルは、SUIDステータスの読み取り不可能なバイナリをダンプしないようにしたいと思います。そしてこれ line は、ダンプできないバイナリは追跡できないことを示唆しています。

したがって、一見すると、セキュリティに影響するカーネルのバグを見つけたようです。しかし、私はカーネル開発者ではないので、はっきりとは言えません。 LKMLでお願いします。

編集:デバッガーに関して、元の投稿へのコメントで言及されているもう1つの発見-(再び)クイックストラッシングから、gdbはトレースされたバイナリと/proc/<pid>/memを使用しているようです。実行中のバイナリが読み取れなくなると、cat /proc/<pid>/memEPERMを返します。バイナリが読み取り可能な場合は、EIOを返します。 (Ubuntu 14.10でこれをテストしました。いくつかのセキュリティパッチを実行しているため、これはVanillaカーネルとは異なる場合があります。繰り返しますが、便利な場所で実行されているVanillaカーネルはありません:()

7
Fox