私は現在、ACMのようなパブリックプログラミングコンテストシステムのバックエンドに取り組んでいます。このようなシステムでは、すべてのユーザーがコードソースを送信できます。このコードソースは、計算上の問題を解決するために、自動的にコンパイルおよび実行されます(つまり、人間の目の事前モデレーションは実行されません)。
バックエンドはGNU/Linux専用のマシンであり、参加者ごとにユーザーが作成され、そのようなユーザーはすべてユーザーグループの一部になります。特定のユーザーによって送信されたソースは、ユーザーのホームディレクトリに保存され、コンパイルおよび実行されて、さまざまなテストケースに対して検証されます。
私が欲しいのは、ソースに対するLinuxシステムコールの使用を禁止することです。これは、問題にはプラットフォームに依存しないソリューションが必要であるのに対し、安全でないソースのシステムコールを有効にすると、セキュリティ違反が発生する可能性があるためです。このようなソースは、コンパイルされていてもFSに正常に配置される可能性がありますが、実行されることはありません。また、システムコールを含むソースが送信されたときに通知を受け取りたいです。
今では、そのようなチェッカーが配置される可能性のある次の場所が表示されます。
- フロントエンド/コンパイル前の分析-ソースはすでにシステムにチェックインされていますが、まだコンパイルされていません。システムコール名に対する単純なテキストチェッカー。プラットフォームに依存し、コンパイラに依存せず、言語に依存するソリューション。
- コンパイラパッチ-システムコールが発生するたびにGCC(またはツールチェーンに含まれる他のコンパイラ)をクラッシュさせます。プラットフォームに依存し、コンパイラに依存し、言語に依存しないソリューション(チェッカーを「十分に」配置した場合)。互換性も失われる可能性があります。実際、私はこの代替案が最も嫌いです。
- ランタイムチェッカー-システムコールがプロセスから呼び出されるたびに、このプロセスを終了してレポートします。このソリューションはコンパイラと言語に依存しませんが、プラットフォームによって異なります。短期的および中期的に同様のプラットフォームにバックエンドをデプロイするので、問題ありません。
したがって、問題は次のとおりです。GNU/ Linuxは、管理者がユーザーグループ、ユーザー、または特定のプロセスのシステムコールの使用を禁止する機会を提供しますか?これは、セキュリティポリシーまたは軽量のGNUユーティリティである可能性があります。
私はグーグルにしようとしました、しかしグーグルは今日私を嫌いました。