我目前正在研究类似 ACM 的公共编程竞赛系统的后端。在这样的系统中,任何用户都可以提交一个代码源,该源代码将被自动编译和运行(这意味着不进行人眼预审核),以尝试解决一些计算问题。
后端是一个 GNU/Linux 专用机器,将为每个参赛者创建一个用户,所有这些用户都是用户组的一部分。任何特定用户发送的源将存储在用户的主目录中,然后编译并执行以针对各种测试用例进行验证。
我想要的是禁止对源代码使用 Linux 系统调用。这是因为问题需要独立于平台的解决方案,而启用不安全源的系统调用是潜在的安全漏洞。这样的源可以成功地放在 FS 中,甚至可以编译,但永远不会运行。每当发送包含系统调用的源时,我也希望得到通知。
到目前为止,我看到可以放置此类检查器的以下位置:
- 前端/预编译分析- 源代码已在系统中检查,但尚未编译。针对系统调用名称的简单文本检查器。平台相关、编译器无关、语言相关的解决方案。
- 编译器补丁- 遇到系统调用时使 GCC(或工具链中包含的任何其他编译器)崩溃。依赖于平台、依赖于编译器、独立于语言的解决方案(如果我们将检查器放置“足够远”)。兼容性也可能会丢失。事实上,我最不喜欢这种选择。
- 运行时检查器- 每当从进程调用系统调用时,终止该进程并报告。此解决方案独立于编译器和语言,但取决于平台 - 我对此表示同意,因为我将在短期和中期将后端部署在类似平台上。
所以问题是:GNU/Linux 是否为管理员提供了禁止用户组、用户或特定进程使用系统调用的机会?它可能是一个安全策略或一个轻量级的 GNU 实用程序。
我试图谷歌,但谷歌今天不喜欢我。