おそらく、suid バイナリでは ptrace を実行できないことは理解しています。しかし、バイナリが euid ではなく uid に権限を落とした後に、なぜ ptrace を実行できないのか疑問に思います。
たとえば、バイナリでは、suid バイナリはいくつかのステップの後に権限を削除します。
seteuid (euid);
ret_chdir = chdir (path);
seteuid (ruid);
system("whoami");
printf("Enter any char");
scanf("%c", &junk);
私の場合、「whoami」が出力されるのはプロセスのユーザー名ですが、プロセスの所有者ではありません。プログラムがジャンク入力を待機しているときに、ユーザー名として uid を使用して実行中のプロセスに接続しようとしましたが、バイナリが権限を削除したにもかかわらず失敗しました。ptrace アタッチが保存された uid 状態を使用して、私が所有者ではないと判断する可能性はありますか?
答え1
サンプル コードでは権限が削除されません。 を呼び出すことで、権限を自由に再度昇格できますseteuid(euid)
。 ptrace を実行できる場合は、 を呼び出しseteuid(euid)
て権限付きコードを実行できます。
読み取り専用だと思っていたから、こう尋ねているのptrace
ですか? いいえ、そうではありません。strace
これは、ptrace
トレーサーがトレース対象内で任意のコードを実行できるようにするだけで、単に観察するだけではありません。「読み取り専用」の ptrace アクセスを許可するきめ細かいアクセス制御はありません。
しかし、読み取り専用の ptrace も危険です。昇格された権限を持つアプリケーションは、機密データを操作している可能性があります。そのため、権限が付与されていたプロセスは、たとえ権限が付与されなくなったとしても、ptrace を実行することはできません。プロセスは、execve
権限が付与されていたことの痕跡をすべて削除するために、 を呼び出す必要があります。
答え2
それは良い推測のようです。なぜなら、切り替えの可能性があるからです戻るこれは、セキュリティ上の問題が発生することが知られている領域です。
参考文献: