gdbはsuid rootプログラムをデバッグできますか?


16

とを呼び出すプログラムを作成setuid(0)しましたexecve("/bin/bash",NULL,NULL)

それから私はやった chown root:root a.out && chmod +s a.out

実行する./a.outと、ルートシェルが取得されます。ただし、実行gdb a.outするとプロセスが通常のユーザーとして開始され、ユーザーシェルが起動します。

だから... setuid rootプログラムをデバッグできますか?

回答:


22

デバッガーがルートとして実行されている場合のみ、setuidまたはsetgidプログラムをデバッグできます。カーネルはptrace、追加の特権で実行されているプログラムを呼び出すことを許可しません。もしそうなら、あなたはプログラムに何でも実行させることができるでしょう、それは事実上あなたが例えば上のデバッガーを呼び出すことによってルートシェルを実行できることを意味するでしょう/bin/su

Gdbをrootとして実行すると、プログラムを実行できますが、rootで実行した場合のみその動作を観察できます。

ルートによって起動されていないときにプログラムをデバッグする必要がある場合は、Gdbの外部でプログラムを起動し、問題のある部分に到達する前に何らかの方法で一時停止させ、attachGdb内のプロセス(at 12341234はプロセスID)にします。


はい、私はそれを試しましたが、プロセスはルートとして起動され、ルートのプロセスをアタッチするにはgdbもルートとして起動する必要があります。
jyz

@jyzuzはい、私が書いているように、ルートとしてgdbを起動する必要があります。または、必要に応じて、リモートデバッグを使用してgdbserver、rootとして実行し、通常のユーザーとして接続できます。あなたのコメントから、あなたはそれを簡単な方法で管理していなかったようです(ルートとしてgdbを実行しています)が、私は何が間違っていたのか分かりませんので、私は助けることができません。
ジル 'SO-悪であるのをやめる'

7

必要に応じて、停止状態でプロセスを開始する方法を次に示します。以下を行うbashスクリプトを使用します。

echo $BASHPID; kill -STOP $BASHPID; exec sudo -u unpriviledged_user -g the_group_if_not_primary command

バックグラウンドで実行します。

次に、を開始しgdb、印刷されたpidに添付します。

を使用してexecコマンドをステップgdb実行する必要がありますが、最初からデバッグすることができます。

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