完了できないプロセスを開始する方法どの事前に生成されたFIFOを読み書きする以外のファイルIO(ファイルを開く/閉じる、ファイルを作成/削除、ファイルを読み書きするなど)?
(chroot
プロセスが中断される可能性があるため動作しませんが、カーネルなどを操作/修正するのは大丈夫です)
ところで:実行中のプログラムを変更できません。
答え1
もし
- 信頼できないコードの前に必要なシステムコールを実行するようにプログラムを変更できます(これは次の方法で実行できます)。LD_予圧)、そして
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で作業することもできます。 、、、を除くすべてのファイルシステム固有のシステムコールを無効にし、open
FIFOを含むディレクトリにread
制限します。それも無効にしてください。write
close
lseek
open
ptrace