[解決済み] Linuxで信頼できないCプログラムをサンドボックスで実行し、ファイルを開いたり、フォークしたりできないようにしますか?
質問
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 では nice(1)
はこれらのプログラムの優先順位を下げ、コンピューターがより重要だと思われるタスクに問題なく使用できるようにします。
関連
-
Linux sarコマンドによるシステム性能の詳細解析事例
-
deepinシステムからログアウトする方法は?deepinシステムからログアウトし、ユーザーを切り替える方法
-
Kali Linuxのデスクトップの外観スタイルを変更するには? KALIの外観の最適化のヒント
-
Linux Mintシステムでプログラムをアンインストールするには? Linux で不要なアプリケーションをアンインストールするためのヒント
-
Linux Mintでフェード効果をオンにする方法は?
-
TclError: 表示名がなく、$DISPLAY環境変数もない。
-
makeの低レベルエラー:セパレータストップがない
-
[解決済み] bash sh - command not found [重複].
-
[解決済み] Linuxのシェルから、カレントと異なる作業ディレクトリでプログラムを実行するには?
-
[解決済み】ファイル一覧から入力を受けるTarアーカイブ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
deepin linuxでroot権限に切り替えるには?Deepinでrootに切り替えるためのヒント
-
2020年deepin Deep OS V20のアップデートによる更新情報
-
makeの低レベルエラー:セパレータストップがない
-
Centos7 dns service named installation, encountered ** server can't find xxx.com: NXDOMAIN問題
-
floor'への未定義の参照/`&'への未定義の参照
-
[解決済み] IOCTL Linuxデバイスドライバ [終了しました]
-
[解決済み] エラーです。Can't open display: (null)と表示されることがあります。
-
[解決済み] Linuxで特定のテキストを含むすべてのファイルを検索するにはどうすればよいですか?
-
[解決済み] ワイルドカードマッチングに基づいて、現在のフォルダとサブフォルダ内のすべてのファイルを再帰的に検索するにはどうすればよいですか?
-
[解決済み] すべてのディレクトリとサブディレクトリを再帰的にgrepするにはどうしたらいいですか?