【问题标题】:How to forbid executable to read/modify any files except the given directories?如何禁止可执行文件读取/修改除给定目录之外的任何文件?
【发布时间】:2023-04-05 05:34:01
【问题描述】:

我想,我的情况很常见。我是一名新手老师,我必须教我的学生 C 编程语言的基础知识。检查他们的作业需要很多时间,我想知道如何使这个过程自动化。为此,我决定使用我的电子邮件地址。基本上,我想编写一个脚本(并将其放在 cron 中),检查我的电子邮件地址是否有来自学生的新消息,下载附件(每个学生都有自己的目录,其中存储源代码),编译它们,运行一些测试,然后将结果发回给学生。问题是有人可以向我发送包含 system("rm -rf ../.."); 等命令的程序。我想阻止运行这些命令。但是应该允许学生修改自己目录中的文件,并从不同目录中读取带有测试数据的文件。有没有一种简单而安全的方法来实现这一目标?如果可能的话,你能提供一些例子吗?

我知道我不是第一个在这里提出这个问题的人,但我能找到的所有答案对我来说都不清楚,并且是几年前发布的。人们通常推荐使用chroot jail,但这种方法需要root权限,据我了解,它并不安全,因为它很容易越狱。我也读过 strace,但它会将所有系统调用打印到标准输入中。是否可以禁止某些系统调用或使用 strace 停止程序?

感谢您的耐心等待。

【问题讨论】:

  • 我不知道你在教什么,但我希望不是 devops/sysadmin。无论如何,您可以作为受限用户运行这些程序吗?
  • 如果您只教授基本编程,那么有两个问题会导致这不是一个好主意。首先,作业不应该太大,以至于看它们太费时间。其次,由于学生是初学者,您应该查看他们的代码,而不仅仅是确认代码通过了测试套件。
  • @chepner,作业不是很大,但我有很多学生,如果他们的算法正确并通过测试,我应该正式提出。我仍然会查看他们的程序,但我希望测试系统能帮助我减少做这件事的仔细,只关注重要的部分和错误。而且我还想知道如何解决我最初的问题,并且不仅能够教授基础编程。
  • @andlrc,我不确定,如果我明白你的意思。我应该创建一个只允许修改一个目录的新用户吗?如果是,我应该为每个学生设置不同的用户吗?如何在脚本中更改用户?我需要root吗?
  • 非常有趣的问题。在我的学校,我们有一个程序可以完全满足您的需求。也许你想检查'Moulinette'@ ecole 42。无论如何我会推荐@alk建议的方法,因为它是一种非常安全的方法。

标签: c bash strace chroot


【解决方案1】:

在虚拟机中运行学生的代码之前,设置一个测试虚拟机并对其进行镜像。

使用镜像从任何灾难中恢复。

您还可以编写虚拟机脚本,使其每晚、每周等自动重新初始化(从镜像)。

【讨论】:

    【解决方案2】:

    不确定您使用的是哪种 Linux,但您是否尝试过查看fakechroot?它通过创建一个 shim 库来工作,该库拦截某些系统调用并允许非 root 用户使用 chroot。看起来它可能很适合你。如果由于某种原因不适合,您可以考虑使用容器系统,如 LXCdocker

    【讨论】:

      【解决方案3】:

      也许您可以使用

      查看导出的符号
      nm
      

      它会向您显示使用程序导出的每个功能,然后如果系统被导出或任何其他未经授权的功能,您将在不执行程序的情况下看到它。

      【讨论】:

      • 目前看起来相当不错和简单,但不知道除了系统我应该寻找什么调用。我应该考虑一下。如果没有其他方法可以捕获系统调用,我将使用您的方法。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多