嗯,它是一种网络服务器。
我加载.dll(.a)文件并将它们用作程序模块。
我递归地遍历目录,并将这些库中的“_main”仿函数放入名称下的 std::map 中,该名称包含在特殊的“.m”文件中。
主目录为每个主机提供了几个目录。
问题是我需要阻止使用“fopen”或任何其他文件系统函数来处理此主机目录之外的目录。
我能看到的唯一方法 - 为 stdio.h 编写一个扭曲(我的意思是,编写具有文件名检查的 s_stdio.h)。
它可能是一个守护进程,捕获系统调用并识别某些内容?
添加
那么,如果我只上传souses,然后检查后直接在我的服务器上编译呢?嗯,这是我发现的唯一方法(仍然将所有内容保留在一个地址空间内)。
最佳答案
由于 C++ 是低级语言,并且 DLL 被编译为机器代码,因此它们可以做任何事情。即使您包装了标准库函数,代码也可以直接执行系统调用,从而重新实现您所包装的功能。
有效沙箱此类 DLL 的唯一方法可能是某种虚拟化,因此代码不是直接运行,而是在虚拟机中运行。
更简单的解决方案是对应该沙箱化的可加载模块使用一些高级语言。一些高级语言更擅长沙箱(Lua、Java),其他语言则不太好(例如,据我所知,目前还没有为 Python 实现的官方限制环境)。
关于C++:有办法到达 'jail function' 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2351794/