1. ホーム
  2. linux

[解決済み] Linuxで信頼できないCプログラムをサンドボックスで実行し、ファイルを開いたり、フォークしたりできないようにしますか?

2022-09-07 02:21:48

質問

Linux で信頼されていない C プログラムをサンドボックス下で実行する方法があるかどうか疑問に思っています。プログラムがファイル、ネットワーク接続、フォーク、実行などを開くことを防ぐような何か?

それは、サーバーにアップロードされ、その上で実行されるユニットテストを持つ小さなプログラム、宿題になるでしょう。したがって、プログラムは短命です。

どのように解決するのですか?

私は シストレ を使って、信頼できないプログラムを対話的に、あるいは自動モードでサンドボックス化しています。これには ptrace() -ベースのバックエンドがあり、特別な権限なしに Linux システムで使用することができます。

また、Unix 系のシステムで chroot(1) を使うこともできますが、これはかなり簡単で安全ではありません。 Linux コンテナ FreeBSD のジェイル は、chroot のより良い代替案です。Linux でのもうひとつの選択肢は、セキュリティフレームワークのような SELinux または AppArmor というのがあり、私はこれを本番システム用に提案します。

あなたがしたいことが何であるかを正確に教えていただければ、私たちはもっとあなたを助けることができるでしょう。

EDITです。

Systraceはあなたのケースには有効でしょうが、私は、何かベースとなるものが Linux セキュリティモデル に基づくものが、ディストリビューションにもよりますが、より標準的で、したがって好ましい選択肢だと思います。

編集 2:

一方 chroot(1) はほとんどの (すべての?) Unix 系システムで利用可能ですが、かなり多くの問題があります。

  • 脱走される可能性がある。信頼できない C プログラムを実際にコンパイルしたり、システム上で実行したりする場合、この問題に対して特に脆弱になります。そして、もしあなたの生徒が私のようなものであれば、誰かが牢屋から抜け出そうとすることでしょう。

  • タスクに必要なすべてのものを含む、完全な独立したファイルシステム階層を作成する必要があります。chroot にコンパイラを置く必要はありませんが、コンパイルされたプログラムを実行するために必要なものはすべて含まれている必要があります。これを支援するユーティリティはありますが、それでも些細なことではありません。

  • chroot を維持しなければなりません。独立したものなので、chroot のファイルはディストリビューションと一緒に更新されることはありません。定期的に chroot を再作成するか、必要な更新ツールを含める必要があり、基本的に本格的な Linux ディストリビューションであることが必要になります。また、システムおよびユーザー データ (パスワード、入力ファイルなど) をホスト システムと同期させておく必要があります。

  • chroot() はファイルシステムのみを保護します。悪意のあるプログラムがネットワーク ソケットを開いたり、ひどく書かれたプログラムが利用可能なリソースをすべて吸い上げたりすることは防げません。

リソース使用の問題は、すべての代替品に共通しています。 ファイルシステムクォータ は、プログラムがディスクをいっぱいにするのを防ぎます。適切な ulimit ( setrlimit() C では ) 設定は、メモリの使い過ぎやフォーク爆弾から保護し、 CPU の占有を止めさせることができます。 nice(1) はこれらのプログラムの優先順位を下げ、コンピューターがより重要だと思われるタスクに問題なく使用できるようにします。