POSIX機能の拡散防止

POSIX機能の拡散防止

通常、Unix(または特にLinux)プログラムは、ICMP_ECHO("ping")を使用してルータのアクセシビリティを確認するなどの操作を実行できません。誰でもスーパーユーザーとして実行またはsetuid ルートまたは適切なPOSIX機能を備えている必要があります。明らかに、setuidまたはPOSIX機能をバイナリに適用するには、すべてのオペレーティングシステムにスーパーユーザー介入が必要です。

開発環境にCAP_SETFCAP機能がある場合は、少なくともローカル操作に関する限り、ビルドするプログラムに適切なPOSIX機能を設定できる必要があります。

ケン・トンプソンに敬意を表します信頼に関する考え論文によると、すべてのライブラリの静的リンクを仮定すると、原則として各プログラムソースモジュールに指紋を作成し、それをオブジェクトとバイナリに伝播して、特定のバイナリが特定のセットで構築されたことを証明する監査証跡を提供できる必要があります。資源になる。したがって、新しく作成されたIDEのコピーを承認するように求める管理者は、IDEが独自に生成するプログラムでのみ機能を設定し、文書化されていないコードを通過できるように悪意のあるユーザーが変更できないことを自分で満たすことができなければなりませんします。たとえば、起動オプションを setcap のプライベートコピーとして使用します。

ここでの問題は、最も成熟した開発環境(例:ラザルス統合開発環境)は独自にビルドされる可能性があるため、ローカル管理者がCAP_SETFCAPで証明できるクリーンなコピーを祝福すると、悪意のあるユーザーがそれを再構築してマルウェアを含め、CAP_SETFCAPを直接適用してローカルシステムのセキュリティを損なう可能性があります。

他のCAP_SETFCAPまたは上位セット機能のいずれかによって新しく生成されたプログラムに伝播できないように、POSIX CAP_SETFCAP機能をバイナリファイルに適用できますか?

ベストアンサー1

setcapアクティブ化したばかりのユーザーに使用をスケジュールするには、ここにsudo機能を追加する必要はありません。ただします。

信頼できるユーザーについて知っている場合は、この機能を使用するには2つのオプションがあります。また、自分が能力あるように見せたい場合は、パッケージファイルなどを含む3番目のオプションも含めました。

  1. ローカルコピーを作成してsetcap公開グループ(建築者)ユーザーに許可された機能を提供します。これは、このグループのユーザーメンバーが正しく機能することを信頼します。
$ cp $(which setcap) ./builder-setcap
$ sudo chgrp builders ./builder-setcap
$ chmod 0750 ./builder-setcap
$ sudo ./builder-setcap cap_setfcap=p ./builder-setcap
  1. 使用継承可能builder-setcap権限で実行できる人を制限するファイル機能です。実際に実行時にその権限を取得するには、別の手順が必要です(いずれかの方法で実行中のユーザーがプロセスを事前に取得します)。継承可能capshまたは同じ能力pam_cap.so)。このメカニズムはビルドシステムの周りのラッパーです。次のように進みますcapsh
$ cp $(which setcap) ./builder-setcap
$ sudo chgrp builders ./builder-setcap
$ chmod 0750 ./builder-setcap
$ sudo ./builder-setcap cap_setfcap=i ./builder-setcap
$ sudo capsh --user=$(whoami) --inh=cap_setfcap --
... $ # in this shell cap_setfcap is available to ./builder-setcap
  1. 3番目のメカニズムは、ユーザーの名前空間コンテナを使用することです。そのようなコンテナの中には、誤った特権概念と誤った概念があります。ユーザー。この環境では、権限のないユーザーこのコンテナに対して単に次を呼び出すことで、setcap間違った機能を提供できます。
$ unshare -Ur
... $ id
uid=0(root) gid=0(root) groups=0(root),65534(nobody)
... $ cp $(which setcap) builder-setcap
... $ ./builder-setcap cap_setfcap=p ./builder-setcap

最後に、ファイル機能はコンテナ内で機能しますが、コンテナを終了した後は機能します。機能が有効になっているファイルには実際には機能がありません。

... $ exit
$ getcap -n ./builder-setcap 
./builder-setcap cap_setfcap=p [rootid=1000]

ここのパラメータは、-nユーザーの名前空間のルートIDを表します。名前空間の外側には、ファイルに実際にファイル機能がないことがわかります。

$ ./builder-setcap -r builder-setcap 
unable to set CAP_SETFCAP effective capability: Operation not permitted

あなたが望むものに対する最も実現可能なアプローチは、機能的にアプローチ2と同じビルド呼び出しラッパーを直接作成し、アプローチsudo capsh --user=$(whoami) --inh=cap_setfcap -- -c 'exec builder'2に従ってバイナリを準備することです。builder-setcap

もちろん、builder-setcap特定の機能を付与し、他の機能を付与したくない場合は、独自のバージョンを作成して、付与したいファイル機能をフィルタリングすることもできます。完全なコードの複雑さsetcapは次のとおりです。かなり小さい

おすすめ記事