SETUIDを使用すると、 `/proc/PID/status`に無効なeUIDがあります。

SETUIDを使用すると、 `/proc/PID/status`に無効なeUIDがあります。

ウォーゲームチャレンジの実行中に権限の問題が発生しました。提供された情報は、/proc/PID/statusプロセスに付与する必要がある権限と一致しません。

私はuser1ユーザーです。 SETUIDプログラムを使用する必要があります。

-r-sr-x---  1 user2 user1       6297 Jun 20  2013 program

したがって、user2の有効なUIDで実行する必要があります。

プログラムが終了しないように、プログラムを起動して一時停止します。

~/program "test" &
PID=$!
kill -SIGSTOP $PID
echo $PID

それから私はcat /proc/$PID/status次を見ました。

Uid:    1003    1003    1003    1003
Gid:    1003    1003    1003    1003

IDは次のとおりです

$ id user1
uid=1003(user1) gid=1003(user1) groups=1003(user1)
$ id user2
uid=1035(user2) gid=1035(user2) groups=1035(user2),1003(user1)

マニュアル( man 5 proc)が与えられたとき、/proc/$PID/status与えられなければならないUid, Gid: Real, effective, saved set, and filesystem UIDs (GIDs).

ただし、ここでプロセスの有効IDはuser1であり、user2の有効なIDが必要です。

プログラムがあまりにも早く中断したからかもしれないと思って、実際に関数のコードがgdb実行されるまで接続して実行し続けてみましたが(提供されたソース)、有効なUIDはまだuser2ではなくuser1でした。mainprogram/proc/$PID/status

私は何を逃したことがありませんか?

編集:チャレンジのソースを削除しました。投稿する権限がないようです。

ベストアンサー1

早すぎるため、UIDが変更されるのを待つとプロセスは終了しますuser2

./program "test" &
PID=$!
sleep 0.0005
kill -SIGSTOP $PID
grep ^Uid /proc/$PID/status

別の試みは、遅延を追加し、usleep()睡眠中に後者を送信することです。SIGSTOPその後、プログラムはuser2有効なuidで実行されます。gdbまたはを追加せずに確認できますstrace。プロセスがUIDを変更するのに時間がかかるLinuxカーネル内の問題である可能性が高いです。

execve()マンページの端末でプロセスを実行すると、システムコールが呼び出されます。

filename[...] が指すプログラムファイルに set-user-ID ビットが設定されていて、呼び出しプロセスが追跡されない場合、呼び出しプロセスの実効ユーザー ID がプログラム所有者のユーザー ID に変更されます。プログラムファイル。

プロセスに接続すると、上記のマニュアルページに記載されているようにプロセスが実行されるため、gdbuidは表示されません。あるいは、プロセスに接続してroot権限を取得することもできます。user2ptracesudo

SIGSEGVただし、このプログラムはを使用しない限り、分割エラー()を生成しませんkill -SIGSEGV $PIDもしあなたのプログラムにはSIGSEGVルーチンlaunch_debugger()と呼ばれるルーチンがあります。これは引数なしでバイナリgdbのみを引数として呼び出し、現在実行中のプロセスを置き換えます。programしたがって、デバッガには権限があるので、そこでuser2必要な操作を実行してuser2権限を持つことができます。

たとえば、内部的には次のことができますgdb

(gdb) file bash
Reading symbols from /bin/bash...(no debugging symbols found)...done.
(gdb) run
Starting program: /bin/bash
user2@host:~$ id
uid=1035(user2) gid=1003(user1) groups=1035(user2),1003(user1)

さて、setuidビットを持ち、所有者がルートである同じバイナリを考えてみましょう。

おすすめ記事