状態
私は大学で「クラウドセキュリティ」を教えており、現在仮想マシンの内部検査に関するプロジェクトを進めています。
私の練習の目的は、いくつかのプロセスの権限をrootに昇格させることです。これは、次のようにstruct cred
fromへのポインタを「借りる」ことです。init
揮発性そしてlibvmi。デフォルトでは、いくつかのルートキットに似ていますが、ある仮想マシンから別の仮想マシンに移動します。保護されたメモリへの書き込みを繰り返し試みる一部のプロセスの権限を上げることで、このアプローチの効率性を実証することができました。そう:
#!/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
したがって、上記の例では、一部のプロセスがルート権限を持っていることを証明できます。しかし、ビュープロセスを使用したり直接ps u
進んだりしても何も変わらないようです/proc/$PID
。UID
GID
出力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
プロセスが明らかに変更されたことに由来します。
答え1
ジョブに構造 cred がありません。彼らは持っている二つ構造的信用:
* 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。
(fs/proc/を参照し、https://elixir.bootlin.com。 procfs "ステータス"ファイルはfs/proc/base.cで定義されています。 )