2011-06-16 116 views
1

我们的应用程序从SU或普通用户运行。我们有一个我们已经连接到我们的项目的图书馆。在那个库中有一个我们想要调用的函数。在我们运行应用程序的目录中有一个名为notRestricted的文件夹。我们已经创建了一个新线程。我们想限制线程对文件系统的访问。我们想做的事情很简单 - 调用该函数,但限制其只能写入该文件夹(我们更喜欢让它从任何应用程序可以读取的地方读取)。C++,linux:如何限制函数访问文件系统?

更新: 所以我看到,有没有办法禁止从所有FS只有一个线程,但一个文件夹...

我看了你的命题亲爱的,因此用户并张贴某种analog to this question here所以在那里给了我们一个链接sandboxnot a bad api,但我真的不知道它是否可以在GentOS上运行,但是在使用Boost.Process command line来运行它并且运行期望的ex-线程(迁移到分离应用程序=))。

回答

1

注入open(2)的替代项,该替换项检查参数并酌情返回-EACCES

+3

这很哈克。如果恶意代码执行“open”系统调用指令(例如x86 Linux上的“int $ 0x80”),也可以轻松解决此问题。 – asveikau 2011-06-16 06:46:06

+0

你能否提供这种替换注入的任何代码示例? – Rella 2011-06-16 07:19:50

+0

http://www.linuxjournal.com/article/7795 – 2011-06-16 07:23:30

3

是不是真的有什么办法可以防止单个线程,因为它在为你,除了黑客之类的函数挂钩的方法来检测任何类型的文件系统访问相同的进程空间。

也许你可能想重新思考你是如何实现你的应用程序的 - 将本机不受信任的代码作为su运行并不是一个好主意。也许使用另一个进程并通过通信。 RPC,或使用您可以在运行时检查的解释型语言。

2

在我看来,最好的策略是:

  1. 不要运行在不同的线程的代码,但在不同的过程运行它。

  2. 当您创建此过程时(在fork之后但在拨打execve之前),请使用chroot更改文件系统的根目录。

这会给你一些很好的隔离。不过这样做会让你的代码需要root ......请不要运行子进程的根,因为root可以平凡解决这个问题。

+0

所以...没有办法做这样的(或任何类似的chroot)在非root?(这将完全限制应用程序从阅读FS上的其他文件夹。 .. – Rella 2011-06-16 07:14:44

1

这听起来不像是正确的事情。如果你仔细想想,你试图防止的是电脑游戏行业众所周知的问题。处理这个问题的最常见的方法是简单的编码加密您不希望他人访问的数据,以这种方式只有您知道如何阅读/理解它。

+0

我没有创建游戏......我想为C++ MPI开发人员创建类似于http://wonderfl.net/的模拟器...所以我需要一些FS限制...... – Rella 2011-06-16 21:38:10