2012-10-27 21 views
7

task_struct *私はfind_task_by_vpid(get_pid())に電話しました。どのユーザがそのプロセスを所有しているのか分かりたいので、私が書いているシステムコールで何らかのパーミッションチェックをすることができますが、task_structのソースコードを見てもそれほど助けにはなりません。役に立ったと思われるのはloginuidですが、何らかの理由でこれにアクセスしようとするとカーネルはコンパイルされません:my_task_struct->loginuidtask_structからプロセスを呼び出したユーザーを取得する別の方法はありますか?プロセスのtask_structからプロセスを所有しているユーザーを見つける方法はありますか?

+1

'geteuid'の実装を見てください。しかし、権限チェックのために、システムの残りの部分と矛盾する独自のロジックを作り上げるのではなく、そのようなもののために既存の一般的なフレームワークを使用したいと思うことはほぼ確実です。 – zwol

+0

私は 'geteuid()'を使ってシステムコールを呼び出したユーザの 'euid 'を取得しますが、' task_struct'の 'uid'(または' euid')をどのように取得するのかはわかりません。 'pid'がシステムコール自体に渡されます。 – Mason

答えて

7

残念ながら、ユーザー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)にアクセスする
+0

本当に助けていただきありがとうございます。その初期化されたuser_structを初期化する方法を知っていますか? – saman

+0

@サマン:そうではありませんが、 'setuid()'などのコードを見つけてください。 –

+0

@R ..私はsetuidシステムコールの宣言をunistd.hで見つけることができますが、私はこのシステムコールの実装を見つけることができません[ここ](http://stackoverflow.com/questions/27594865/add-another -field-to-user-struct)は私の質問です。あなたはそれに答えることができますか? – saman

0

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))を使用することもできます。

関連する問題