UnixおよびLinux のアクセス権フラグsetuidおよびsetgid ( set user identityおよびset group identityの略) [1]を使用すると、ユーザーはそれぞれ実行可能ファイルの所有者またはグループのファイルシステム権限で実行可能ファイルを実行し、ディレクトリ内の動作を変更できます。これらは、コンピューターシステム上のユーザーが特定のタスクを実行するために一時的に昇格された権限でプログラムを実行できるようにするためによく使用されます。提供される想定ユーザー ID またはグループ ID の権限は常に昇格されるわけではありませんが、少なくとも特定の権限です。
フラグsetuidとフラグsetgidは、システムファイルやデータベースを変更してログインパスワードを変更する機能など、ユーザーに通常付与されている権限とは異なる権限を必要とするタスクに必要です。[2]ただし、ネットワークインターフェイス上で
制御パケットpingを送信およびリッスンする必要があるコマンドなど、追加の権限を必要とするタスクの中には、すぐにはわからないものもあります。
ファイルモード
およびビットsetuidはsetgid通常、ファイル モードの上位 8 進数で、 の場合は 4 setuid、 の場合は 2として表されます。たとえば、 ではおよびビット ( 4 + 2 = 6 ) の両方が設定されており、ファイルは所有者に対して読み取り/書き込み/実行可能 (7) であり、グループ (最初の 1) とその他 (2 番目の 1) によって実行可能です。ほとんどの実装では、これらのビットの記号表現があります。前の例では、 になります。
setgid6711setuidsetgidu=rwx,go=x,ug+s
通常、 にはchmodディレクトリに限定された再帰モードがないため、既存のディレクトリ ツリーを変更するには、 などのコマンドを使用して手動で行う必要があります。
find /path/to/directory -type d -exec chmod g+s '{}' '\'
効果
フラグsetuidとsetgidフラグの効果は、ファイル、ディレクトリ、バイナリ実行ファイル、非バイナリ実行ファイルのどれに適用されるかによって変わります。 フラグsetuidとsetgidフラグはバイナリ実行ファイルにのみ効果があり、スクリプト(Bash、Perl、Pythonなど)には効果がありません。[3]
実行ファイルに設定すると
setuidまたは属性が実行可能setgidファイルに設定されている場合、ファイルを実行できるすべてのユーザーは、設定されたフラグに応じて、ファイルの所有者(通常はroot )および/またはファイルのグループの権限でファイルを自動的に実行します。 [2]これにより、システム設計者は、ユーザーが通常は実行を許可されない信頼できるプログラムの実行を許可できます。これらは常に明らかであるとは限りません。たとえば、pingコマンドは、通常のユーザーがアクセスできないネットワーク権限にアクセスする必要がある場合があります。したがって、別のシステムに ping する必要があるユーザーのアカウントにパケットの送信に必要な権限がない場合でも、そのユーザーが実行できるように、setuid フラグが付与される場合があります。
セキュリティへの影響
ptraceセキュリティ上の理由から、通常、呼び出し元のユーザーは、 を使用したり、シグナルを送信したりして、高められた権限を利用するなど、新しいプロセスをいかなる方法でも変更することはシステムによって禁止LD_LIBRARY_PATHされています。ただし、端末からのシグナルは引き続き受け入れられます。
このsetuid機能は多くの場合非常に便利ですが、属性が慎重に設計されていない実行可能プログラムに割り当てられた場合、不適切な使用によってセキュリティリスクが発生する可能性があります[2] 。潜在的なセキュリティ上の問題のため、 [4]多くのオペレーティングシステムでは、実行可能なシェルスクリプトに適用されたときにこの属性を無視します。[引用が必要]setuidsetuid
実行可能ファイルが存在するsetuidため、Unix ではシステム コールが非ルートchrootユーザーに使用できません。詳細については、
の制限を参照してください。chroot
ディレクトリに設定すると
setgidディレクトリに権限を設定すると、その中に作成されたファイルとサブディレクトリは、ファイル作成プロセスのプライマリ グループではなく、そのグループの所有権を継承します。作成されたサブディレクトリもsetgidビットを継承します。ポリシーは作成時にのみ適用されるため、将来的にのみsetgid適用されます。ビットが適用されたときに存在するディレクトリとファイルは影響を受けません。また、ビットが設定されているディレクトリに移動されたディレクトリとファイルにも影響を受けません。
したがって、明示的に権限を設定せずにユーザー グループ間でファイルを操作できるようになりますが、既存のファイル権限が暗黙的に変更されないというセキュリティ モデルの期待によって制限されます。
setuidディレクトリに設定されたパーミッションは、ほとんどの UNIX および Linux システムでは無視されます。[ 5 ] [要出典]ただし、FreeBSD はsetuidと同様の方法で解釈するように設定できますsetgid。その場合、ディレクトリ内に作成されたすべてのファイルとサブディレクトリは、そのディレクトリの所有者によって所有されるようになります。これは単純な継承形式です。[6]これは、 BSDから派生したほとんどのシステムでは通常必要ありません。これは、デフォルトではディレクトリがsetgid実際の値に関係なく、常にビットが設定されているものとして扱われるためです。 で述べられているようにopen(2)、「新しいファイルが作成されると、それを含むディレクトリのグループが与えられます。」[7]
例
権限の確認
ファイルの権限はコマンドラインツールで8進数形式および/またはアルファベット形式で確認できます。stat
[ torvalds ~ ] $ stat -c "%a %A" ~/test/
1770 drwxrwx--T
スイド
4701 は、「root」およびグループ「root」が所有する実行可能ファイルにあります。
「thompson」というユーザーがファイルを実行しようとします。すべてのユーザーの実行権限が設定されているため (「1」)、「thompson」はファイルを実行できます。ファイルの所有者は「root」で、SUID 権限が設定されているため (「4」)、ファイルは「root」として実行されます。
実行可能ファイルが「root」として実行される理由は、ユーザーに完全な root アクセスを与えることなく、通常は許可されない特定のファイルを変更できるようにするためです。
このデフォルトの使用法は、/usr/bin/passwdバイナリ ファイルで確認できます。/usr/bin/passwd変更する必要があり/etc/passwd、/etc/shadowすべてのユーザーのアカウント情報とパスワード ハッシュを保存します。これらは、ユーザー「root」によってのみ変更できます。
[ thompson ~ ] $ stat -c "%a %U:%G %n" /usr/bin/passwd
4701 root:root /usr/bin/passwd
[ thompson ~ ] $ passwd
passwd: thompsonのパスワードを変更する
プロセスの所有者は、実行ファイルを実行しているユーザーではなく、実行ファイルの所有者です。
SGID
2770 は、ユーザー「root」とグループ「engineers」が所有する「music」というディレクトリにあります。
'torvalds' というユーザーは、主にグループ 'torvalds' に属し、副次的にグループ 'engineers' に属しており、'music' というディレクトリの下に 'electronic' というディレクトリを作成します。'electronic' という新しいディレクトリのグループ所有権は 'engineers' を継承します。これは、'imagine.txt' という 新しいファイルを作成する場合も同様です。
SGID がない場合、新しいディレクトリ/ファイルのグループ所有権は、ユーザー「torvalds」のプライマリ グループである「torvalds」になります。
[ torvalds ~ ] $グループ torvalds
torvalds : torvalds エンジニア
[ torvalds ~ ] $ stat -c "%a %U:%G %n" ./music/
2770 root:engineers ./music/
[ torvalds ~ ] $ mkdir ./music/electronic
[ torvalds ~ ] $ stat -c "%U:%G %n" ./music/electronic/
torvalds:engineers ./music/electronic/
[ torvalds ~ ] $ echo '新しいファイル' > ./music/imagine.txt
[ torvalds ~ ] $ stat -c "%U:%G %n" ./music/imagine.txt
torvalds:engineers ./music/imagine.txt
[ torvalds ~ ] $ touch ~/test
[ torvalds ~ ] $ stat -c "%U:%G %n" ~/test
torvalds:torvalds ~/test
スティッキービット
1770 は、ユーザー「torvalds」とグループ「engineers」が所有する「videogames」というディレクトリにあります。
「torvalds」というユーザーが、「videogames」というディレクトリの下に「tekken」というファイルを作成します。「engineers」グループのメンバーでもある「wozniak」というユーザーが「tekken」というファイルを削除しようとしますが、所有者ではないため削除できません。
スティッキー ビットがなければ、'videogames' というディレクトリは 'engineers' による読み取りと書き込みを許可しているため、'wozniak' はファイルを削除できた可能性があります。このデフォルトの使用法は、/tmpフォルダーで確認できます。
[ torvalds /home/shared/ ] $ groups torvalds
torvalds : torvalds engineers
[ torvalds /home/shared/ ] $ stat -c "%a %U:%G %n" ./videogames/
1770 torvalds:engineers ./videogames/
[ torvalds /home/shared/ ] $ echo '新しいファイル' > videogames/tekken
[ torvalds /home/shared/ ] $ su - wozniak
パスワード:
[ wozniak ~/ ] $グループ wozniak
wozniak : wozniak エンジニア
[ wozniak ~/ ] $ cd /home/shared/videogames
[ wozniak /home/shared/videogames/ ] $ rm tekken
rm: 'tekken' を削除できません: 操作は許可されていません
SGID のスティッキービット
3171 は、グループ「engineers」とユーザー「root」が所有する「blog」というディレクトリにあります。
'torvalds' というユーザーは、主にグループ 'torvalds' に属し、副次的にグループ 'engineers' に属しており、ディレクトリ 'blog' 内に 'thoughts' というファイルまたはディレクトリを作成します。'engineers' グループにも属している 'wozniak' というユーザーは、所有者ではなくスティッキー ビットが設定されているため、'thoughts' というファイルまたはディレクトリを削除、名前変更、または移動することはできません。ただし、'thoughts' がファイルである場合、'wozniak' はそれを編集できます。
スティッキー ビットが最終決定権を持ちます。スティッキー ビットと SGID が設定されていない場合、ユーザー「wozniak」は「thoughts」という名前のファイルを名前変更、移動、または削除できます。これは、「blog」という名前のディレクトリがグループによる読み取りと書き込みを許可されており、wozniak がそのグループに属しており、デフォルトの 0002 umaskによってグループによる新しいファイルの編集が許可されているためです。スティッキー ビットと SGID は、読み取り専用 umask や追加専用属性などと組み合わせることができます。
[ torvalds /home/shared/ ] $ groups torvalds
torvalds : torvalds engineers
[ torvalds /home/shared/ ] $ stat -c "%a %U:%G %n" ./blog/
3171 root:engineers ./blog/
[ torvalds /home/shared/ ] $ echo '新しいファイル' > ./blog/thoughts
[ torvalds /home/shared/ ] $ su - wozniak
パスワード:
[ wozniak ~/ ] $ cd /home/shared/blog
[ wozniak /home/shared/blog/ ] $グループ wozniak
wozniak : wozniak エンジニア
[ wozniak /home/shared/blog/ ] $ stat -c "%a %U:%G %n" ./thoughts
664 torvalds:engineers ./thoughts
[ wozniak /home/shared/blog/ ] $ rm thoughts
rm: 'thoughts' を削除できません: 操作は許可されていません
[ wozniak /home/shared/blog/ ] $ mv thoughts /home/wozniak/
mv: 'thoughts' を '/home/wozniak/thoughts' に移動できません: 操作は許可されていません
[ wozniak /home/shared/blog/ ] $ mv thoughts pondering
mv: 'thoughts' を 'pondering' に移動できません: 操作は許可されていません
[ wozniak /home/shared/blog/ ] $ echo 'REWRITE!' >考え
[ wozniak /home/shared/blog/ ] $猫の 考えを
書き直す!
安全
開発者は、バッファ オーバーランやパス インジェクションなどのセキュリティ上の脆弱性を回避するために、実行可能ファイルでこのビットを使用するプログラムを慎重に設計および実装します。脆弱なアプリケーションに対するバッファ オーバーラン攻撃が成功すると、攻撃者は悪用されたプロセスの権限で任意のコードを実行できるようになります。脆弱なプロセスがsetuidビットを使用して として実行する場合root、コードはルート権限で実行され、実質的に、脆弱なプロセスが実行されているシステムへのルート アクセスを攻撃者に与えます。
プロセスの場合、特に重要なのはプロセスの環境setuidです。特権プロセスによって環境が適切にサニタイズされていない場合、そのプロセスを起動した非特権プロセスによってその動作が変更される可能性があります。[8]たとえば、GNU libc は、信頼できない共有ライブラリからのコードの実行を許可する環境変数を使用したエクスプロイトに対して脆弱でした。[9]setuid
歴史
このビットはデニス・リッチー[10]setuidによって発明され、に含まれていました。[10]彼の雇用主であったベル電話研究所は1972年に特許を申請し、1979年に特許番号US 4135240 「データファイルコンテンツの保護」として付与されました。この特許は後にパブリックドメインになりました。[11]su
参照
参考文献
- ^ フォン・ハーゲン、ウィリアム (2010-05-13). Ubuntu Linux の聖書。 3–59ページ。ISBN 9780470881804。
- ^ abc Frisch, Æleen (2009-02-09). Essential system administrator. O'Reilly. p. 351. ISBN 9780596550493。
- ^ Billimoria, Kaiwan N. (2018). 実践的な Linux システムプログラミング: Linux システムプログラミングインターフェース、理論、実践を探る。Packt Publishing Ltd. p. 250. ISBN 978-1-78899-674-7。
- ^ 「Unix - よくある質問」.
- ^ 「27.5 ディレクトリと Set-User-ID ビットおよび Set-Group-ID ビット」。GNU Coreutils 9.1。フリーソフトウェア財団。2022年12 月 13 日閲覧。
- ^ 「chmod -- ファイルモードを変更する」. freebsd.org .
- ^ 「open、openat -- 読み取り、書き込み、または実行用にファイルを開くか作成する」。freebsd.org。
- ^ Brown, Neil (2010 年 11 月 23 日). 「Unix の過去の亡霊、パート 4: メンテナンスに手間のかかる設計」. LWN.net . 2014 年3 月 30 日閲覧。
- ^ Edge, Jake (2010 年 10 月 27 日)。「2 つの glibc の脆弱性」。LWN.net。2014年3 月 30 日閲覧。
- ^ ab McIlroy, M. Douglas (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (技術レポート). CSTR. Bell Labs. 139.
- ^ 「主要なソフトウェア特許の概要」。
外部リンク
- チェン、ハオ、ワグナー、デイビッド、ディーン、ドリュー、「Setuid Demystified」(pdf)
- Tsafrir, Dan; Da Silva, Dilma ; Wagner, David; プロセスアイデンティティの変更に関する曖昧な問題: Setuid の改訂の解明 (pdf)
- ポロック、ウェイン; Unix ファイルとディレクトリのパーミッションとモード
