我知道这可能是不可能的,但我真的希望有办法实现它。有什么办法请告诉我。
我想用 C++ 编写一个沙盒应用程序,并允许其他开发人员编写可以直接加载到应用程序中的原生插件。我可能想通过 Windows 上的 DLL 执行此操作,但我也想支持 Linux,希望支持 Mac。
我的问题是我希望能够阻止插件自行进行 I/O 访问。我想要求他们使用我包装的例程,这样我就可以确保没有插件编写恶意代码,这些代码会开始损害用户磁盘上的文件或在网络上做一些不受欢迎的事情。
我对如何完成这样的事情的最佳猜测是在应用程序中包含一个编译器,并要求在最终用户平台上分发和编译插件的源代码。然后我需要一个代码扫描器,它可以搜索插件未编译的代码以查找将出现在硬盘或网络或其他存储介质的 I/O 操作中的签名。
我的理解是像 fstream 这样的 STD 库包装了特定于平台的函数,所以我认为只需扫描所有将为特定于平台的函数编译的代码就可以让我完成任务。因为最终,任何 C native 代码都不能执行任何 I/O,除非它使用操作系统提供的方法之一与操作系统对话,对吧??
如果我的思路是正确的,有没有人推荐一本书或资源来告诉我在哪里可以找到这些适用于 Windows、Linux 和 Mac 的细节?
如果我的思路不正确并且我不可能真正阻止 native 代码(已编译或未编译)自行执行 I/O 操作,请告诉我,这样我就不会创建我认为是的应用程序安全但实际上不是。
在绝对理想的世界中,我不想要求插件分发未编译的代码。我想让开发人员自己编译和保留他们的代码。也许我可以扫描二进制文件以查找与 I/O 访问有关的签名????
最佳答案
对执行代码的程序进行沙箱处理肯定比仅仅扫描代码以获取特定访问更难!例如,程序可以综合执行系统调用的汇编程序语句。
UNIX 上的原始方法是 chroot()
程序,但我认为该方法也存在问题。另一种方法是像 selinux 这样的安全环境,可能与 chroot()
结合使用。用于执行此类操作的现代方法似乎是在虚拟机中运行程序:程序启动时启动合适的 VM 快照。终止后只需倒带到快照。这只需要允许的访问以某种方式引导到某个地方。
关于c++ - 如何防止 C++ 或 native 编译代码中的 I/O 访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20291555/