読み取り許可なしで実行可能ファイルをトレースする


17

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

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


3
@StéphaneChazelas:ポイントは、単にstraceの引数として使用することで、ptrace できることです。根本的な原因は、execve呼び出し時に、プロセスが既にトレースされている場合、実行されたファイルの読み取り許可が再度チェックされないためと思われます。彼の質問は、それがセキュリティバグなのか、必須の機能なのか(後者の場合、セキュリティバグであり、仕様のセキュリティバグにすぎないと考えています)。
celtschk 14

@celtschk、ごめんなさい、私は質問をあまりにも早く読みました。
ステファンシャゼラス14

1
EPERM来ているようだget_dumpable()から呼び出された(コアダンプが許可されているかどうかをチェックするためにも使用され、したがって、「ダンプ可能」)__ptrace_may_access()から呼び出されたptrace_attach()kernel/ptrace.c
ninjalj 14

プログラムの実行中、デバッガーはコードを含む実行可能な実行可能ファイルを生成するのに十分な情報を利用できますか、またはプログラムローダーは、プログラムを実際に動作させるために必要な再配置フィックスアップなどを破棄しますか?
supercat 14

@supercat私の知る限り、デバッガーは、再配置コードを含む、実行されているすべてのユーザーモードコードのシングルステップにアクセスできます。そのアクセスレベルでは、実行可能な実行可能ファイルを再現するのがそれほど難しくないはずです。
カスペルド14

回答:


7

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

Unix&Linuxに関する関連する回答では、読み取り専用のバイナリをこの方法でダンプすることは可能です(または、現在はバニラカーネルでテストできませんでした)。

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

このコミットにより、カーネル開発者は本当にsuidバイナリをダンプすることだけを気にしているように見えます。

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

したがって、一見するとカーネルにバグがあり、セキュリティに影響しているようです。しかし、私はカーネル開発者ではないので、確実に言うことはできません。LKMLで尋ねます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.