我目前正在开发一个类似ACM的公共编程竞赛系统的后端。在这样的系统中,任何用户都可以提交代码源文件,该文件将自动编译和运行(这意味着不进行人工审核),以尝试解决某些计算问题。
后端是一个专用的GNU/Linux机器,在其中为每个参赛者创建一个用户,所有这些用户都是用户组的一部分。由特定用户发送的源文件将存储在该用户的主目录中,然后进行编译和执行,以便根据各种测试用例进行验证。
我想禁止使用Linux系统调用功能来处理源文件。原因是问题需要平台无关的解决方案,而启用不安全源文件的系统调用可能会导致潜在的安全漏洞。这样的源文件可能会成功地放置在文件系统中,甚至编译,但永远不会运行。我还希望在发送包含系统调用的源文件时得到通知。
到目前为止,我看到了以下几个检查程序可能放置的位置:
- 前端/预编译分析-已经在系统中检查了源文件,但尚未编译。对系统调用名称进行简单的文本检查器。平台相关,与编译器无关,与语言有关的解决方案。 - 编译器补丁-每当遇到系统调用时,崩溃GCC(或任何其他包含在工具链中的编译器)。平台相关,与编译器相关,与语言无关的解决方案(如果我们将检查器放置“足够远”)。也可能失去兼容性。实际上,我最不喜欢这个选择。 - 运行时检查器-每当从进程中调用系统调用时,终止此进程并报告。此解决方案与编译器和语言无关,但取决于平台-我对此感到满意,因为我将在短期和中期内在类似的平台上部署后端。
所以问题是:GNU/Linux是否提供了管理员禁止用户组、用户或特定进程使用系统调用的机会?这可能是一种安全策略或轻量级GNU实用程序。
我试图搜索谷歌,但今天谷歌不喜欢我。
后端是一个专用的GNU/Linux机器,在其中为每个参赛者创建一个用户,所有这些用户都是用户组的一部分。由特定用户发送的源文件将存储在该用户的主目录中,然后进行编译和执行,以便根据各种测试用例进行验证。
我想禁止使用Linux系统调用功能来处理源文件。原因是问题需要平台无关的解决方案,而启用不安全源文件的系统调用可能会导致潜在的安全漏洞。这样的源文件可能会成功地放置在文件系统中,甚至编译,但永远不会运行。我还希望在发送包含系统调用的源文件时得到通知。
到目前为止,我看到了以下几个检查程序可能放置的位置:
- 前端/预编译分析-已经在系统中检查了源文件,但尚未编译。对系统调用名称进行简单的文本检查器。平台相关,与编译器无关,与语言有关的解决方案。 - 编译器补丁-每当遇到系统调用时,崩溃GCC(或任何其他包含在工具链中的编译器)。平台相关,与编译器相关,与语言无关的解决方案(如果我们将检查器放置“足够远”)。也可能失去兼容性。实际上,我最不喜欢这个选择。 - 运行时检查器-每当从进程中调用系统调用时,终止此进程并报告。此解决方案与编译器和语言无关,但取决于平台-我对此感到满意,因为我将在短期和中期内在类似的平台上部署后端。
所以问题是:GNU/Linux是否提供了管理员禁止用户组、用户或特定进程使用系统调用的机会?这可能是一种安全策略或轻量级GNU实用程序。
我试图搜索谷歌,但今天谷歌不喜欢我。
seccomp
,它是一种模式,其中进程只能读/写预先打开的管道。通过prctl()
调用启用。在stackoverflow.com上有类似的问题:http://www.google.com/search?q=seccomp+site%3Astackoverflow.com&btnG=Buscar&oe=utf-8 - ninjalj