task_struct *
私はfind_task_by_vpid(get_pid())
に電話しました。どのユーザがそのプロセスを所有しているのか分かりたいので、私が書いているシステムコールで何らかのパーミッションチェックをすることができますが、task_struct
のソースコードを見てもそれほど助けにはなりません。役に立ったと思われるのはloginuid
ですが、何らかの理由でこれにアクセスしようとするとカーネルはコンパイルされません:my_task_struct->loginuid
。 task_struct
からプロセスを呼び出したユーザーを取得する別の方法はありますか?プロセスのtask_structからプロセスを所有しているユーザーを見つける方法はありますか?
答えて
残念ながら、ユーザーIDとグループIDはタスク構造体に格納されず、代わりに、同じIDを持つすべてのタスク間で動的に割り当てられ、共有される別個の権限構造に格納されます。これは、順番にsetuid
が枯渇資源に起因する失敗する可能性が状況を作成し、権限を支えるためにsetuid
の失敗は、脆弱性の悪名高い源である...とにかく
、それはtask_struct
のこれらのメンバーである:
const struct cred __rcu *real_cred; /* objective and real subjective task
* credentials (COW) */
const struct cred __rcu *cred; /* effective (overridable) subjective task
* credentials (COW) */
あなたは(Linuxの4.9.13のように)以下の線に沿って何かを行うことができますカーネル空間内のユーザーID(UID)にアクセスする
本当に助けていただきありがとうございます。その初期化されたuser_structを初期化する方法を知っていますか? – saman
@サマン:そうではありませんが、 'setuid()'などのコードを見つけてください。 –
@R ..私はsetuidシステムコールの宣言をunistd.hで見つけることができますが、私はこのシステムコールの実装を見つけることができません[ここ](http://stackoverflow.com/questions/27594865/add-another -field-to-user-struct)は私の質問です。あなたはそれに答えることができますか? – saman
:
struct task_struct *task;
for_each_process(task) {
uid_t uid = __kuid_val(task_uid(task));
}
task_uid
は、構造体を返しますkuid_t
と呼ばれ、実際の値にアクセスするには、__kuid_val
に電話するか、直接アクセスしてください(task_uid(task).val
)。
また、from_kuid(&init_user_ns, task_uid(task))
を使用することもできます。
'geteuid'の実装を見てください。しかし、権限チェックのために、システムの残りの部分と矛盾する独自のロジックを作り上げるのではなく、そのようなもののために既存の一般的なフレームワークを使用したいと思うことはほぼ確実です。 – zwol
私は 'geteuid()'を使ってシステムコールを呼び出したユーザの 'euid 'を取得しますが、' task_struct'の 'uid'(または' euid')をどのように取得するのかはわかりません。 'pid'がシステムコール自体に渡されます。 – Mason