権限のないファイルで有効なビットを有効にするにはどうすればよいですか? (POSIX機能)

権限のないファイルで有効なビットを有効にするにはどうすればよいですか? (POSIX機能)

私はPOSIXの機能原理とexecve()の間の変換をより具体的に理解しようとしています。一部を引用します。文書私が尋ねたとき:

       P'(ambient)     = (file is privileged) ? 0 : P(ambient)

       P'(permitted)   = (P(inheritable) & F(inheritable)) |
                         (F(permitted) & P(bounding)) | P'(ambient)

       P'(effective)   = F(effective) ? P'(permitted) : P'(ambient)

       P'(inheritable) = P(inheritable)    [i.e., unchanged]

       P'(bounding)    = P(bounding)       [i.e., unchanged]

   where:

       P()   denotes the value of a thread capability set before the
             execve(2)

       P'()  denotes the value of a thread capability set after the
             execve(2)

       F()   denotes a file capability set

これに基づいて、まず実行可能ファイルに権限があることを確認します。特権ファイルは、対応する機能があるか、set-user-IDまたはset-group-IDビットが有効なファイルとして定義されます。

When determining the transformation of the ambient set during execve(2), 
a privileged file is one that has capabilities or 
has the set-user-ID or set-group-ID bit set.

次に、ファイルの有効なビットが有効になっていることを確認します。今、2つの確認に基づいて4つの状況があります。

  • 特権ファイルには有効なビットが有効になっています。 -> ファイルに考慮すべき機能があります。 -> 新機能を計算します。
  • 権限のないファイルでは有効なビットが無効になっています。 -> ファイルに機能がありません。 -> スレッドを使用して環境を設定しました。
  • 特権ファイルでは有効なビットが無効になっています。 ->ファイルにはsetuid / setguidビットが有効になっている可能性があります。これが意味するのは、機能をまったく使用してはならず、2つの異なる権限ツールを混在させてはならないということです。 -> 有効スレッドセットは 0 になります。

しかし、4番目のケースは理解できません。権限のないファイルでは有効なビットが有効になっています。機能がありません(権限がないため)。

  1. 権限のないファイルが有効なビットを有効にするにはどうすればよいですか?
  2. 有効なビットがファイルの権限状態に影響を与えない場合でも、なぜ権限や有効な機能なしで有効にするのですか?

だから私の質問は、具体的な状況が4番目のシナリオにつながる可能性があるということです。

ベストアンサー1

このようなことはないと思いましたが、つまり許可または継承された機能がないと、有効なビットを設定できません。

現れた動作は、setcap次のことを確認するようです。

$ sudo setcap cap_chown=ep mybinary
$ getcap mybinary
mybinary = cap_chown+ep
$ sudo setcap cap_chown=e mybinary
$ getcap mybinary
mybinary =

しかし、あなたが見つけたように、はい保存機能がなくても有効なビットを設定できます。

$ xattr -l mybinary
0000   01 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00    ................
0010   00 00 00 00                                        ....

この値はvfs_cap_data構造、バージョン2(0x02000001)。最初の32ビット値の最後のビットは、これが有効な機能であることを示すために設定されますが、機能(継承および許可)は0に設定されます。

おすすめ記事