【发布时间】:2013-11-29 18:27:14
【问题描述】:
我知道这可能是不可能的,但我真的希望有办法解决这个问题。有什么办法请告诉我。
我想用 C++ 编写一个沙盒应用程序,并允许其他开发人员编写可以即时加载到应用程序中的本机插件。我可能想通过 Windows 上的 DLL 来做到这一点,但我也想支持 Linux 并希望支持 Mac。
我的问题是我希望能够阻止插件自己进行 I/O 访问。我想要求他们使用我打包的例程,这样我就可以确保没有任何插件编写恶意代码,这些代码会开始损害用户在磁盘上的文件或在网络上做一些不受欢迎的事情。
对于如何实现这样的事情,我最好的猜测是在应用程序中包含一个编译器,并要求插件的源代码在最终用户平台上分发和编译。然后,我需要一个代码扫描器,它可以搜索插件未编译的代码以查找将出现在硬盘或网络或其他存储介质的 I/O 操作中的签名。
我的理解是,像 fstream 这样的 STD 库包装了特定于平台的函数,所以我认为只需扫描所有将为特定于平台的函数编译的代码就可以让我完成任务。因为最终,任何 C 本机代码都无法执行任何 I/O,除非它使用操作系统提供的方法之一与操作系统对话,对吗??
如果我在这方面的想法是正确的,有没有人推荐一本书或资源,告诉我在哪里可以找到适用于 Windows、Linux 和 Mac 的这些东西的具体细节?
如果我的思路不正确并且我无法真正阻止本机代码(已编译或未编译)自行执行 I/O 操作,请告诉我,这样我就不会创建我认为是的应用程序安全,但实际上并不安全。
在一个绝对理想的世界中,我不想要求插件分发未编译的代码。我想让开发人员自己编译和保留他们的代码。也许我可以扫描二进制文件以查找与 I/O 访问有关的签名????
【问题讨论】:
-
我想到的唯一想法是将插件隔离在单独的进程中并将它们沙箱化,从而允许通过 IPC 进行通信。如何沙盒应用程序的详细信息会有所不同,但我认为不可能通过 DLL 来完成。其他方法是嵌入禁止 I/O 的解释器,例如 LUA。
标签: c++ networking io operating-system storage