【问题标题】:How to Prevent I/O Access in C++ or Native Compiled Code如何防止 C++ 或本机编译代码中的 I/O 访问
【发布时间】: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


【解决方案1】:

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

UNIX 上的原始方法是chroot() 程序,但我认为这种方法也存在问题。另一种方法是像 selinux 这样的安全环境,可能与chroot() 结合使用。用于执行此类操作的现代方法似乎是在虚拟机中运行程序:在程序启动时启动虚拟机的合适快照。终止后只需倒回快照即可。这只要求允许的访问以某种方式引导到某个地方。

【讨论】:

  • 你能澄清一下合成汇编语句执行系统调用是什么意思吗?
  • UNIX 上的系统调用只是汇编语句,也就是说,您可以调用 write() 而不会显示该函数的符号。汇编程序代码可以很容易地嵌入到 C 源代码中,但即使没有,您也可以使用故意的越界内存写入来操作堆栈并进行函数调用它们不打算调用的东西。虽然通常不可能在数据段中调用代码,但将东西放在堆栈上并导致使用预期之外的参数并不难。 ...您将与世界互动。
  • 我不足以成为一个黑客来创建演示,但我不太希望我能检测到代码中的所有方式(无论是源代码还是二进制文件),其中试图获得恶意访问资源被制作出来了。
【解决方案2】:

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

如果您想确保插件不执行 I/O,您可以扫描它的 DLL 以查找它的所有导入函数,并针对 I/O 函数的黑名单运行函数列表。 Windows 有 dumpbin 实用程序,Linux 有 nm。两者都可以通过system() 函数调用运行,并将工具的输出定向到文件。

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

用户代码不能自己进行 I/O。只有内核。如果您担心插件获得 ring0/kernel 权限,则需要扫描 DLL 的 ASM 以获取 I/O 指令。

【讨论】:

  • 虚拟机不会阻塞 I/O?我的印象是,VM 绝对是沙盒应用程序的最佳方式。当然,该应用程序可以写入 VM 中的虚拟磁盘,但我从未听说过有应用程序能够超出这个范围。
  • 取决于“VM”的含义。在管理程序下运行的虚拟机是终极沙箱。但是用于提供运行时环境的虚拟机(例如,Java 的 JVM)根本没有多大帮助。
  • @Jim - 是的,VM(例如 VirtualBox)是沙盒的绝佳方法 - 它不会损坏主机操作系统。但是虚拟机内部的进程有 I/O。此 I/O 可能只影响虚拟设备,但直到 I/O。根据您的问题,我了解到您想测试 IF 插件是否执行 I/O。
  • 我明白了。好吧,我谈论限制 I/O 的原因是为了保证数据的安全。例如,只要我能保证磁盘上的备份是安全的,我就不太担心流氓插件会破坏内存中的数据。这样,如果内存数据损坏并且损坏的数据被应用程序保存到磁盘,您至少可以返回到以前的备份以恢复良好的数据。我只需要一个能够提供某种故障安全数据保护的生态系统。
  • 详细说明,Virtual Box 提供了一个故障安全生态系统,因为您可以备份虚拟磁盘快照。如果快照受到威胁,您始终可以返回到以前的快照。而且插件无法篡改快照备份。
猜你喜欢
  • 2011-09-17
  • 2010-10-18
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多