2

嗯,它是一种网络服务器。

我加载 .dll(.a) 文件并将它们用作程序模块。

我递归地遍历目录并将这些库中的“_main”函子放入名称下的 std::map 中,该名称是特殊的“.m”文件中的成员。

主目录中每个主机的目录很少。

问题是我需要防止使用“fopen”或任何其他文件系统函数使用此主机目录之外的目录。

我能看到的唯一方法 - 为 stdio.h 编写一个扭曲(我的意思是,编写具有文件名检查的 s_stdio.h)。

也许它可能是一个守护进程,捕捉系统调用并识别某些东西?

添加

那么,这种情况呢:我只上传 souses,然后在检查后直接在我的服务器上编译它?好吧,这是我找到的唯一方法(仍然将所有内容都放在一个地址空间中)。

4

2 回答 2

4

由于 C++ 是低级语言,并且 DLL 被编译为机器代码,它们可以做任何事情。即使您包装标准库函数,代码也可以直接执行系统调用,重新实现您包装的功能。

可能有效沙盒这样的 DLL 的唯一方法是某种虚拟化,因此代码不是直接运行,而是在虚拟机中运行。

更简单的解决方案是对应该被沙盒化的可加载模块使用一些更高级别的语言。一些高级语言更擅长沙盒(Lua、Java),而另一些则不太好(例如,AFAIK 目前没有为 Python 实现的官方受限环境)。

于 2010-02-28T17:24:01.337 回答
1

如果您是加载模块的人,您可以对代码执行静态分析以验证它调用了哪些 API,如果它没有检出,则拒绝链接它(即,如果它进行任何类型的可疑调用) .

话虽如此,这样做需要做很多工作,而且不是很便携。

于 2010-02-28T17:27:33.070 回答