web-dev-qa-db-ja.com

プロセスのcredポインタからではないのに、プロセスのUID / GIDはどこから来ていますか?

状況

大学で「クラウドセキュリティ」の講義をしていて、現在仮想マシンのイントロスペクションのプロジェクトをやっています。

私の演習の目標は、あるプロセスの特権をroot特権に昇格させることでした。これは、volatilityおよび-を使用して、initからstruct credへのポインターを「借用」することで達成しました。 libvmi。基本的には一部のルートキットと同じですが、あるVMから別のルートキットへ。保護されたメモリへの書き込みを繰り返し試行するプロセスの特権を昇格させることで、このメソッドの効果を証明できます。そのように:

#!/bin/bash
while true
do
    echo 1 >> /etc/test
    id
    sleep 2
done

これにより、次の出力が生成されます(特権が変更されたとき)。

# last time permission is denied
./test.sh: line 3: /etc/test: Permission denied
uid=1000(tester) gid=1000(tester)groups=1000(tester),24(cdrom),
25(floppy),29(audio),30(dip),44(video),46(plugdev),108(netdev),
111(scanner),115(bluetooth)

# tada, magic

# now I'm root
uid=0(root) gid=0(root) groups=0(root)

質問

したがって、いくつかのプロセス(上記の例ではbash)にroot権限があることを証明できます。しかし、ps uを使用して、または/proc/$PIDを介して直接プロセスを見ると、UIDGIDは変更されていないようです。

ps -A u | grep 2368の出力:

前:

# ...
tester    2368  0.0  0.9  23556  4552 pts/2    S+   22:24   0:00 -bash

後:

# ...
tester    2368  0.0  0.9  23556  4552 pts/2    S+   22:24   0:00 -bash

ここでは何も変わっていません。

また、/proc/$PID/statusは変更されていません:

~# cat /proc/2368/status | grep Uid
Uid:    1000    1000    1000    1000
~# cat /proc/2368/status | grep Gid
Gid:    1000    1000    1000    1000

それで、あなたは説明できますか、なぜそこでは変わらない、そしてどこでその情報はプロセスのstruct credから取得されていないのに、そこから来たのです。明らかに変更されました。

4
Simon

タスクには構造体の資格がありません。彼らはtwostruct cred'sを持っています:

 * A task has two security pointers.  task->real_cred points to the objective
 * context that defines that task's actual details.  The objective part of this
 * context is used whenever that task is acted upon.
 *
 * task->cred points to the subjective context that defines the details of how
 * that task is going to act upon another object.  This may be overridden
 * temporarily to point to another security context, but normally points to the
 * same context as task->real_cred.

どれをチェックしましたか/procが表示されますが、おそらく推測できます:-P。

https://elixir.bootlin.com を使用してfs/proc /を参照してください。procfsの「ステータス」ファイルはfs/proc/base.cで定義されています。)

3
sourcejedi