ユーザー (競技者) から受け取った信頼できないコードを実行する Linux アプリケーションを開発しました。より具体的には、アプリケーションはオンライン審査員であり、UVa OJ、SPOJ、Codeforcesのようなものですが、主にBOCA オンライン コンテスト管理者のようなものです。私の OJ は、C、C++、Java、および Python をサポートしています。
現在、私の OJ は非常に安全ではありません。これは、信頼できないコードを実行するときにサンドボックス化が行われないためです。だから私はそれを行うための最良の方法を探しています。ソリューションの主な要件は次のとおりです。ユーザー (競技者ではなく、コンテストを設定する人) は、アプリケーションの設定にできるだけ労力を費やさないようにする必要があります。git clone repo
、make
、sudo make install
、
pjudge install <contest_dir>
、cd <contest_dir>
いくつかのファイルを変更.txt
し、秘密のテストケースを中に入れてproblems/
、pjudge start <port>
もう多すぎると思います。
まず第一に、chroot(2)
/を使用したソリューションを考慮して、ユーザーにルートディレクトリのセットアップを強制するよりも、ソフトウェアを安全でないままにしたいと思いますchroot(8)
。このソリューションは、開発者およびユーザーとして、私がこの個人的なプロジェクトで喜んで苦しむよりも苦痛です。
ptrace(2)
また、プロセスが禁止されたシステムコールを行った場合にプロセスを強制終了するという解決策も検討しました。簡単なコードを試して動作するかどうかを確認しましたが、一部のシステムコールでは正しく動作しないようでした。また、多くのシステムコールをフィルタリングする必要があると思います...そして、JVM / Pythonランタイムが必要とするシステムコールがわかりません...このソリューションが機能するかどうかはわかりません。誰かがこのソリューションを適切に使用する方法を知っている場合は、助けてください!
そして、私も見つけましseccomp(2)
た。read(2)
これにより、プロセスは、write(2)
、_exit(2)
およびのみを呼び出すことができますsigreturn(2)
。この解決策は素晴らしいようです。私のアプリケーションに実装するのは簡単で、必要に応じて正確に動作するはずです...ただし、C および C++ のみです。Java と Python が再び問題になります。このソリューションが後者の 2 つの言語でどのように機能するかはわかりません。ソース コード (ちなみに C++ です) でfork(2)
+ exec(2)
/を使用していることを考えると、system(3)
どんな助けでも本当にありがたいです。ptrace(2)
/を使用するための正しい/効果的な方法seccomp(2)
、または私が見逃している他の解決策かもしれません。しかし、私の唯一の要件を満たす何かをお願いします! ユーザーがアプリケーションをセットアップするのは、非常に簡単、単純、かつ高速でなければなりません。
前もって感謝します!