如何防止C++或本机编译代码中的I/O访问

How to Prevent I/O Access in C++ or Native Compiled Code

本文关键字:访问 代码 C++ 何防止 本机 编译      更新时间:2023-10-16

我知道这可能是不可能的,但我真的希望有办法实现。如果有办法,请告诉我。

我想用C++编写一个沙盒应用程序,并允许其他开发人员编写可以直接加载到应用程序中的本地插件。我可能想通过Windows上的DLL来实现这一点,但我也想支持Linux,希望支持Mac。

我的问题是,我希望能够阻止插件自己进行I/O访问。我想要求他们使用我的包装例程,这样我就可以确保没有插件编写恶意代码,开始伤害用户在磁盘上的文件或在网络上做不必要的事情。

我对如何实现这一目标的最佳猜测是在应用程序中包含一个编译器,并要求插件的源代码在最终用户平台上分发和编译。然后我需要一个代码扫描仪,可以在插件未编译的代码中搜索签名,这些签名将显示在硬盘、网络或其他存储介质的I/O操作中。

我的理解是,像fstream这样的STD库包装了特定于平台的函数,所以我认为,只需扫描将为特定于平台函数编译的所有代码就可以完成任务。因为最终,任何C本机代码都不能进行任何I/O,除非它使用操作系统提供的方法之一与操作系统进行对话,对吧??

如果我在这方面的思路是正确的,有没有人有一本书或资源推荐,告诉我在哪里可以找到适用于Windows、Linux和Mac的这些东西的细节?

如果我的思路不正确,我不可能真正阻止本机代码(编译或未编译)自行执行I/O操作,请告诉我,这样我就不会创建一个我认为安全但实际上不安全的应用程序。

在一个绝对理想的世界里,我不想要求插件分发未编译的代码。我想让开发人员自己编译并保存他们的代码。也许我可以扫描二进制文件中与I/O访问有关的签名????

对执行代码的程序进行沙盒处理肯定比仅仅扫描代码以获取特定访问更难!例如,程序可以合成进行系统调用的汇编语句。

UNIXes最初的方法是chroot()程序,但我认为这种方法也存在问题。另一种方法是像selinux这样的安全环境,可以与chroot()结合使用。用来做类似事情的现代方法似乎是在虚拟机中运行程序:在程序启动时,启动一个合适的VM快照。终止后,只需倒带到快照。这只需要以某种方式将允许的访问引导到某个地方。

即使是虚拟机也不会阻止I/O。不过,它可以很容易地阻断网络流量。

如果你想确保插件不做I/O,你可以扫描它的DLL中的所有导入函数,并根据I/O函数的黑名单运行函数列表。Windows有dumpbin util,Linux有nm。两者都可以通过system()函数调用运行,并且工具的输出指向文件。

当然,您可以编写自己的分析器,但这要困难得多。

用户代码不能单独执行I/O操作。只有内核。如果你担心插件获得ring0/kernel权限,那么你需要扫描DLL的ASM以获取I/O指令。