如何防止C++或本机编译代码中的I/O访问
How to Prevent I/O Access in C++ or Native Compiled Code
我知道这可能是不可能的,但我真的希望有办法实现。如果有办法,请告诉我。
我想用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指令。
- 我的简单if-else语句是如何无法访问的代码
- 访问被拒绝后,c++中的故障保护代码
- 为什么示例代码访问IUnknown中已删除的内存
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 无法访问的代码 在 C++11 中,可能导致这种情况的原因是什么?
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 无法访问的代码如何导致我的程序崩溃?
- 是否可以访问代码中的调用堆栈?
- C++/CLI访问字符串::来自非CLI代码的格式
- Java 本机访问代码错误:"Invalid memory access"
- 访问C 代码中的PWD
- 我们还能使用任何其他方法来访问Android中的C 代码,而不是使用JNI访问C 代码
- 如何将DLL访问代码从C++移植到C#
- 警告级别4中的不可访问代码警告
- 使用.open()成员函数C++的ifstream数组的错误访问代码
- 在 Apache Cordova for Android 中访问C++代码
- 错误的访问代码 1 glDrawElements
- 外部"C"访问代码的函数
- 访问代码中的Makefile变量
- 使用Unicode终止符的QString中的访问代码