exec() の機能規則をどのように理解しますか?

exec() の機能規則をどのように理解しますか?

Linuxプログラミングインターフェースでは:

許可されたセットは、有効で継承可能なセットに追加できる機能の限られた親セットです。

これは、プロセスの許可セットがプロセスの有効で継承可能なセットの親セットであることを意味しますか?

カーネルは、次の規則を使用してプロセスの新機能を計算します。

P'(許可)=(P(継承可能)&F(継承可能))(F(許可)&cap_bset)

P'(有効) = F(有効)? P'(許容):0

P'(継承可能) = P(継承可能)

上記の規則では、Pは以前の能力セット値を表し exec()、P 'は後続の能力セット値を表しexec()、Fはファイル能力セットを表します。 cap_bset 識別子は、能​​力境界セットの値を表します。

ルールは、P'(許可)がP'(継承可能)の親セットであることをどのように保証しますか?つまり、P '(許可)はP(継承可能)の親セットになりますか?

「F(有効)?P'(許可):0」とはどういう意味ですか?

P(xxx)アンセットですかF(xxx) 、それともビットセットですか?後者の場合、そのタスクはビットタスクですか?前者の場合、それらの演算は演算(和集合と交差点)を設定しますか?

答え1

「F(有効)?P'(許可):0」とはどういう意味ですか?

この表現は同様の言語predicate ? a : bに由来しています。Cこれは、述語がtrueの場合はelseを意味またはa if predicate else b評価します。ab

したがって、P'(effective) = F(effective) ? P'(permitted) : 0ファイル有効ビットが設定されている場合は、許可されたセットがプロセス有効セットにコピーされ、そうでない場合は有効なセットが空になります。

これは、機能を理解していない従来のアプリケーション(おそらく最近の大半)に必要です。機能認識アプリケーションは、有効な機能なしで起動し、必要に応じて機能を有効なセットにコピーし、完了すると有効なセットを消去します(バグによって発生する可能性のあるダメージを軽減します)。

許可されたセットは、有効で継承可能なセットに追加できる機能の限られた親セットです。

許可された範囲内にある場合にのみ有効または継承されたセットにのみ機能を追加できます。ただし、継承されたセットに機能を追加するには、境界セットにも存在する必要があります。 - この段落はコメントで議論されています(変更される可能性があります)。

P(xxx)とF(xxx)のセットですか、それともビットセットですか?後者の場合、その演算はビット演算ですか?前者の場合、それらの演算は演算(和集合と交差点)を設定しますか?

ほとんどはビットグループですが、F(effective)シングルビットです。

また、次のように質問しました。

ルールは、P'(許可)がP'(継承可能)の親セットであることをどのように保証しますか?つまり、P '(許可)はP(継承可能)の親セットになりますか?

そうではありません。あなたの声明はスペルが間違っています。

[allow] は、可能な機能の限られた親セットでもあります。次へ追加継承可能なセットとして。

したがって、プロセスは、許可されたセットにない継承セットから機能を継承できます。ただし、その機能がすでに許可されているセットに含まれていない場合、継承されたセットに機能を追加することはできません。

答え2

許可されたセットは、有効で継承可能なセットに追加できる機能の限られた親セットです。

これは、プロセスの許可セットがプロセスの有効で継承可能なセットの親セットであることを意味しますか?

いいえ、そのステートメントは簡潔ですが、そのような主張はしません(追加できるアイテムの親セット!=すでに存在するアイテムの親セット)。継承可能なセットは空の状態で開始する必要はありません。

私のシステムの function(7) マンページにこれの説明がよりよく示されています。

Permitted:
          This is a limiting superset for the effective capabilities  that
          the  thread  may assume.  It is also a limiting superset for the
          capabilities that may be added  to  the  inheritable  set  by  a
          thread  that  does  not  have  the CAP_SETPCAP capability in its
          effective set.

ルールは、P'(許可)がP'(継承可能)の親セットであることをどのように保証しますか?つまり、P '(許可)はP(継承可能)の親セットになりますか?

そのようなことを保証するものではありません。たとえば、スレッドがファイル拡張子属性に「security.capability」を持たないプログラム(つまり、空のF(継承可能)がある)を実行すると、P '(許可)は空のセットになります(つまり、親セットではありません) )。 P(継承可能))およびF(許可))。

"P'(有効) = F(有効)? P'(許可): 0" とはどういう意味ですか?

F(有効)が空でない場合は、P'(有効)をP'(許可)に設定します。つまり、許可されているすべての機能を最初から有効にします。 F(有効)の空/空ではない状態のみが重要であるため、ファイルの "security.capability"拡張属性のビット/フラグを介して実装されます。

P(xxx)とF(xxx)のセットですか、それともビットセットですか?

それらはビットグループです。

注:その内容は少し昔ながらです。周辺有効セットを計算する際に考慮される機能セット。最新のシステムでは、feature(7) マンページを確認してください。

関連情報