5

我正在构建一个游戏,每个玩家都必须对他的机器人进行编程。关键的想法是玩家将使用 C(或 C++,或任何兼容的语言)进行编程,构建一个 DLL 并将这个 DLL 发送到服务器,这样任何人都无法获得他的代码。问题是:如何确保他没有调用任何非法函数?就像创建文件或打开套接字一样。DLL 将使用 LoadLibrary 加载并调用一个函数。所有交互都将通过回调函数进行。一个可能的解决方案是放置一个空的 kernel32.dll(和其他),这样所有的 winapi 调用都会失败。这是否安全并且适用于每种情况?有更好的方法吗?

请注意,玩家线程(也就是所谓的 dll)必须仍然能够与游戏通信,可能使用打开的套接字。在 Linux 上,这可以通过seccomp.

4

4 回答 4

11

您最好的选择是创建一个具有降低权限的用户,这将允许您非常轻松地控制文件访问,并在以该用户身份运行的子进程中运行机器人代码。

如果你还想限制网络连接,也很容易设置防火墙,使上述进程无权连接到外部主机。

如果您需要更多地控制允许或不允许哪些 API 调用,可以使用一种称为“通过 DLL 重定向的 API 拦截”的技术,例如此处说明:

http://109.163.225.194/download/files/other/DLL_Redirection_en.pdf

(通过谷歌找到)

于 2012-09-07T15:18:55.713 回答
9

如果没有在加载所有 DLL 之前完全分析它们(这基本上是不可能的),或者在与seccomp. 考虑到您为限制其访问而采取的任何措施,例如创建一个 dummy kernel32.dll,用户提交的 DLL 可以采取对策,例如加载您没有考虑的 DLL,调用由主机进程加载的 DLL(可能通过宿主应用程序!),或直接提交 Windows 系统调用。

一种选择可能是利用 Windows 安全令牌功能,Google Chrome 使用该功能来“沙盒”Web 渲染器进程。不过,这是非常神秘的东西,无论如何它都涉及在单独的进程中运行 DLL。如果您仍然感兴趣,您可能需要阅读Windows Chrome 沙盒设计文档。不过请记住,谷歌已经花费了大量的开发时间来“正确”沙盒,但仍然存在一些引人注目的妥协——你可以在你的自己很苗条,尤其是以前没有丰富的 Windows 安全经验。

于 2012-09-07T15:36:23.697 回答
1

也许我的回答不会很有帮助,但我认为使用 DLL 或任何其他包含机器代码的可执行文件是不安全的,即使它以受限用户身份运行,甚至在虚拟机中运行,它仍然会打开攻击向量。首先想到的是使用现成的解释器并用它来编译你自己的字节码。但是,如果您坚持使用 DLL,您可以编辑 DLL 导入地址表并丢弃不需要的功能。听起来很复杂,有一个

于 2017-07-26T16:17:35.917 回答
0

本地防火墙可以解决网络方面的问题 - 但我认为您问题的其他部分没有简单的防弹解决方案。我也相信放置一个“空”的 kernel32 和 ntdll 可能会对许多合法进程造成一些严重的问题。

于 2015-11-01T18:04:07.710 回答