回答:
UNIXのファイルに対する通常の読み取り、書き込み、実行の権限を知っているかもしれません。
ただし、多くのアプリケーションでは、このタイプの許可構造(特定のユーザーに特定のファイルを読み取るための完全な許可を与える、またはファイルを読み取るための許可をまったく与えないなど)は粗すぎます。このため、Unixには別の許可ビット、ビットがありset-user-ID
ます。実行可能ファイルに対してこのビットが設定されている場合、所有者以外のユーザーがファイルを実行するたびに、そのユーザーは、所有者の他のファイルへのアクセスにおける所有者のすべてのファイルの読み取り/書き込み/実行特権を取得します。
ファイルのユーザーID設定ビットを設定するには、次のように入力します。
chmod u+s filename
group-other実行権限も設定していることを確認してください。group-otherの読み取り権限もあるとよいでしょう。これはすべて1つのステートメントで実行できます
chmod 4755 filename
これは、保存されたUIDとも呼ばれます。Set-UIDビットがオンになっている起動されたファイル。保存されたUIDは、ファイルの所有者のUIDになります。それ以外の場合、保存されたUIDは実際のUIDになります。
このUIDは、特定のアクションを実行するプロセスの特権を評価するために使用されます。EUIDは、実際のUID、またはEUID!= 0の場合はスーパーユーザーUIDのいずれかに変更できます。EUID = 0の場合は、何にでも変更できます。
そのようなプログラムの例はpasswd
です。完全にリストすると、Set-UIDビットがあり、所有者が「root」であることがわかります。通常のユーザー、たとえば「mtk」を実行するとpasswd
、次のように始まります。
Real-UID = mtk
Effective-UID = mtk
Saved-UID = root
man credentials
この場合、良い情報源です。SOに関するこの質問もご覧ください。歴史的な説明については、このアーカイブされた投稿を参照してください。
「set UID」および「実効UID」メカニズムを呼び出すのではなく、UIDの概念全体をそれと呼ぶ必要があります。さまざまなUIDが存在する理由は、特権の分離に関するさまざまな問題です。通常の(特権のない)ユーザーでも、特権のあるユーザーだけが実行できること(リソースにアクセスする)が必要になる場合があります。これを簡単に実現するために、プログラムはUIDを変更できます。これらには3つのタイプがあります。
実UID-プロセスを所有するUID
実効UID-プロセスが現在実行されているUID-これは、特定の瞬間におけるプロセスの実際の機能を決定します。これはps
、USERフィールドにも表示されます。
保存セットUID-実際のUIDと有効なUIDを切り替えるために使用されるプレースホルダー
最後のものの必要性は、通常のユーザーはこれら3つだけを切り替えることができ、他には何もできないという事実から生じます。通常、setuidプログラムは、なんらかの方法でそれをロードしたユーザーを知る必要があります(さらに、実際のUIDは変更しないでください)それはさらに大きな混乱を引き起こすでしょう)。
mtkの拡張は良いものです。
このpasswd
例は、特権の昇格の1つです。passwdは、rootだけが変更できるファイルを変更する必要があるため、常にrootとして実行されます。これにより、passwd実行可能ファイルがバッファオーバーフローなどになりにくくなり、賢い通常のユーザーが意図しない用途に使用できるようになることが重要になります。
別の論理的根拠はsu
、rootとしてログインしている場合と同じ方法でユーザーを保護することです- 特定のタスクの特権を減らしたり制限したりして、エスカレーションしないでください。たとえば、自分のものへのアクセスを必要としないデーモンサービスを開始する権限があり、それ自体に必要なもの(ロガーなど)がある場合、それを実行すると、そのものにのみアクセスできます。私や他の人ではありません。
実行可能ファイルでsuidビットが設定されていなくても、プログラムでuidを設定することは可能ですが、エスカレーションでは機能しません。つまり、通常のユーザーで、ある時点でuidを設定するプログラムを作成した場合、そのプログラムはrootに切り替えることができません。Apacheはこのように動作すると思います。これは通常、rootによって開始され、uidを非特権ユーザー(たとえば、「httpd」)に切り替える子をフォークする1つのプロセスがあります。これらの子プロセスは、実際のWebサーバーが機能するものです。