FIFO以外のプロセスがファイルIOを実行できないように無効にする

FIFO以外のプロセスがファイルIOを実行できないように無効にする

完了できないプロセスを開始する方法どの事前に生成されたFIFOを読み書きする以外のファイルIO(ファイルを開く/閉じる、ファイルを作成/削除、ファイルを読み書きするなど)?

chrootプロセスが中断される可能性があるため動作しませんが、カーネルなどを操作/修正するのは大丈夫です)

ところで:実行中のプログラムを変更できません。

答え1

もし

  1. 信頼できないコードの前に必要なシステムコールを実行するようにプログラムを変更できます(これは次の方法で実行できます)。LD_予圧)、そして
  2. exit()sigreturn()プログラムは、以外のシステム呼び出しを行う必要はありません。read()write()

それからあなたは利用可能ですセキュリティコンピューティング(ウィキペディア記事)。より多くのシステムコールを可能にするためにseccomp-bpfがあります。Berkeleyパケットフィルタ許可されるシステムコールを決定します。これlibseccompライブラリはseccomp-bpfを簡素化するので(たとえば)システムコールを許可したい場合close()

seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0);

または、似ているが壊れない場合はchroot試してみてください。LinuxコンテナオープンVZまたはLinux仮想サーバー

答え2

最善の方法は、権限のないユーザーとして問題を実行することです。 FIFOに正しい権限を付与します。

つまり、権限のないユーザーは、権限のない他のユーザーが所有するすべてのファイルにアクセスできます。

より多くの作業を行うには、ファイルシステムのエントリを真剣に変更する必要があります。しかし:

chmod o-rwx/-R

確かに物をロックします。しかし、他のユーザーも何も読めません。

私が自分に尋ねたいより重要な質問は、「なぜこの制限が必要なのですか」です。たぶん目標を達成するより良い方法がありますか?

答え3

正しく実行された場合、つまり独自のユーザーIDでプロセスを実行することによって(つまり、chrootの外側のプロセスを同じユーザーとして実行してはいけません)、プロセスはchrootを離れることはできません。

プロセスが書き込めず、FIFOのみを含むディレクトリにプロセスをルートに移動します。実行可能ファイルと必要なライブラリとデータファイルを適切なchrootに入れるか、rootとしてプロセスを起動し、chrootを起動してユーザーIDを変更する必要があります。

ルートを含めることができない場合は、次のものを使用できます。名前空間ただし、最新のカーネル(≥3.8)が必要です。まずユーザーネームスペースその後、chrootし、必要な権限なしで名前空間内のユーザーIDに変更します。

あるいは、SELinuxやAppArmorなどのセキュリティフレームワークを介してrootで作業することもできます。 、、、を除くすべてのファイルシステム固有のシステムコールを無効にし、openFIFOを含むディレクトリにread制限します。それも無効にしてください。writecloselseekopenptrace

関連情報