通常のユーザーがpasswdファイルに変更を加えたい場合、ユーザーはsetuidによって有効なユーザーアクセスが与えられます。ユーザーは一時的にrootになり、passwdを編集できます。
しかし、あなただけが正しいパスワードを編集できます。ただし、効果的なユーザーアクセスはrootです。では、なぜ自分以外のパスワードを変更することができないのでしょうか。
Setuidを使用してプログラムを実行するとき、実効ユーザーがrootであるが、実際のユーザーIDがまだあなたの名前である場合、それは実際にはどういう意味ですか?
プログラムで許可されていないため、他のパスワードを変更することはできません。プログラムはroot
として実行されているため、必要なパスワードを変更するシステム権限を持っていますが、プログラムはユーザーにそれらの権限を使用させる方法をユーザーに与えないように特別に設計されています。
ユーザーが一時的にrootになるのは、完全ではありません。信頼されたプログラムがroot権限で実行されるということです。明らかに、ユーザーが許可されるべきことだけを行うようにユーザーを制限するように特別に設計されたプログラムだけを安全にsetuidすることができます。
Rootの有効なユーザーIDがあるにもかかわらず、パスワードのみを変更できます。これは、パスワードの変更時に、有効なユーザーIDではなく実際のユーザーIDがチェックされるためです。実際のユーザーIDではなく、有効なユーザーIDのみを変更できます。
rootユーザーのみが実際のユーザーIDを変更して、非特権ユーザーとしてプログラムを実行できます。実ユーザーIDは、セッション開始時に設定されるため、変更できません。
そのため、実際のユーザーIDは変更されないため(パスワードはまだrootのものではないため)、パスワードのみを変更できます。
Unixの初期のハックは、setuidシェルスクリプトへのシンボリックリンクを作成し、そのリンクを-i
と呼ぶことでした。これにより、スクリプトがsh -i
として呼び出され、-i
と呼ばれるスクリプトを実行する代わりにインタラクティブシェルが起動され、フルパワーが提供されます。有効なユーザーIDを使用して、任意のユーザーまたはルート自体のpasswd
ファイルを変更できます。これを防ぐ最善の方法は、SELinuxを使用して、信頼できるスクリプトまたはプログラムが、SELinuxが実行できる領域外で変更されないようにすることです。
別のテクニックは、重要なファイルに不変のビットを持たせることであり、1つのセットはrootユーザーでも変更できません(シングルユーザーモードを除く)
Rootとして、ユーザーにパスワードなしでシステムにログオンするように招待し、任意のユーザーとして表示することができますが、通常の特権プロセスはこれが起こらないように非常に努力しています。
ある種のネットワークファイリングシステムを使用している場合、ルートユーザーはルートではなくそのファイルスペースで誰としても扱われ、信頼されていないコンピューターが大学のキャンパスなどの信頼されたネットワークに参加できるようになります。
Set-passwordプログラムは何かを実行する能力はありますが、パスワードを変更するようにプログラムされているため、パスワードの変更のみが許可されています。実際のユーザーIDをチェックして、変更するパスワードを決定します。
Set-uidプログラムを呼び出しても実際のユーザーIDを変更することはできないため、プログラムはそれを使用してセキュリティを実装できます。オペレーティングシステムは、set uid rootプログラムへのセキュリティを放棄します。
注:set uid rootプログラムは、実際のユーザーIDを変更することもできます(ただし、これはこの使用例では使用されません)。
警告:set uid rootは有害であると考えられています(理想的とは言えません)。最近は機能を使用する必要があります( gnu/linuxでファイルのアクセス許可などを設定するさまざまな方法は何ですか および http://man7.org/linux/man-pages/man7を参照してください) /capabilities.7.html )