
root@macine:~# getcap ./some_bin
./some_bin =ep
"ep"とはどういう意味ですか?このバイナリにはどのような機能がありますか?
答え1
# getcap ./some_bin ./some_bin =ep
バイナリには、p
最初から許可された()機能と有効な()機能の両方があります。e
機能のテキスト表現では、先行は=
次のようになります。all=
。cap_to_text(3)
マンページから:
支配演算子があり、関数リストが提供されていない場合、
=
演算リストは以下を参照すると仮定されます。みんな能力。たとえば、次の3つのセクションは互いに同じです(完全に空の機能セットを表します)all=
。=
cap_chown,<every-other-capability>=
これらのバイナリは必要なものは何でも構いません。一般的なデスクトップシステムでは、すべてを含む機能の境界セットによってのみ制限されます(そうしないと、setuidバイナリはsu
期待どおりに機能しません)。
これは、使用されたテキスト表現の「知っているもの」にすぎません。すべての意味のあるビットは、libcap
印刷されるsecurity.capability
ファイルの拡張属性で有効です。getcap
/file/path =ep
存在する;のための空 security.capability
、/file/path =
(後に=
何もない)が印刷されます。
まだ確信していない人がいる場合は、次の簡単な実験をしてください。
# cp /bin/ping /tmp/ping # will wipe setuid bits and extented attributes
# su user -c '/tmp/ping localhost'
ping: socket: Operation not permitted
# setcap =ep /tmp/ping
# su user -c '/tmp/ping localhost' # will work because of cap_net_raw
PING localhost(localhost (::1)) 56 data bytes
64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.073 ms
^C
# setcap = /tmp/ping
# su user -c '/tmp/ping localhost'
ping: socket: Operation not permitted
ご注意ください、空ファイル機能も異なります。削除済み能力( capset -r /file/path
),空ファイル機能は、実行時にファイルがAmbientセットを継承するのを防ぎます。
ファイル機能の1つの微妙さは、=ep
境界セットが完全でないとカーネルがプログラムの=ep
実行を防ぐことです(機能愚かなバイナリのセキュリティチェックセクションで説明されています)。capabilities(7)
マンページ)。
答え2
これは能力ではありません。
有効なセットと許可されたセットを意味します。
これは、これらの能力が許可されたセット()に入り、許可されたすべての能力が有効なセット()p
にコピーされることを意味します。e
レガシープログラム(おそらく今日のほとんどのプログラム)に使用されますe
。つまり、機能を理解していないため、自分で許可された機能から有効な機能にコピーできないプログラムに使用されます。
@mosvyが指摘したように、空のセットが見える理由について、ライブラリ作成者はすべてをなしと混同しました(無限大と0は最も混乱している2つの数値です)。