我正在构建一个游戏,每个玩家都必须为自己的机器人编程。关键的想法是播放器将用C(或C++,或任何兼容的语言)编程,构建一个动态链接库并将此动态链接库发送到服务器,这样就没有人能得到他的代码。问题是:如何确保他没有调用任何非法函数?比如创建文件或打开套接字。将使用LoadLibrary加载DLL,并调用一个函数。所有交互都将与回调函数一起发生。一种可能的解决方案是放置一个空的kernel32.dll (和其他),这样所有的winapi调用都会失败。这是安全的,并且适用于所有情况吗?有没有更好的方法呢?
请注意,玩家线程(如何调用dll的线程)必须仍然能够与游戏通信,可能是使用打开的套接字。在Linux上,这可以通过seccomp很容易地完成。
发布于 2012-09-07 23:36:24
如果没有在加载之前完全分析所有DLL(这基本上是不可能的),或者在与seccomp相同的级别上创建某种魔术,这将不会起作用。给定您采取的任何限制其访问的措施,例如创建一个虚拟kernel32.dll,用户提交的DLL可以采取对策,例如加载您不考虑的DLL,调用由宿主进程加载的DLL(可能是通过宿主应用程序中的函数!),或者直接提交Windows系统调用。
一种选择可能是利用Windows安全令牌功能,Google Chrome使用该功能来“沙箱”web渲染器进程。然而,这是非常神秘的东西,而且它涉及到在一个单独的进程中运行DLL。如果你仍然感兴趣,你可以读一读the Windows Chrome sandbox design documents。但是,请记住,Google已经花费了大量的开发时间来使沙箱“正确”,但仍然有一些高调的妥协--您自己能够做到同样的事情的机会很小,特别是在没有丰富的Windows安全经验的情况下。
发布于 2012-09-07 23:18:56
最好的办法是创建一个权限较低的用户,这将允许您非常容易地控制文件访问,并在以该用户身份运行的子进程中运行bot代码。
如果您还想限制网络连接,设置防火墙也很容易,这样前面提到的进程就没有连接到外部主机的权限。
如果您需要更多地控制您允许或不允许哪些API调用,有一种称为“通过DLL重定向进行API拦截”的技术,下面举例说明:
http://109.163.225.194/download/files/other/DLL_Redirection_en.pdf(通过谷歌找到)
发布于 2017-07-27 00:17:36
也许我的答案不会很有帮助,但我认为使用DLL或任何其他包含机器代码的可执行文件是不安全的,即使它是作为有限用户运行的,甚至在虚拟机中,它仍然会打开攻击向量。首先想到的是使用现成的解释器,并使用它编译您自己的字节码。但是,如果您坚持使用DLL,您可以编辑DLL导入地址表,并丢弃不需要的功能。尽管这听起来很复杂,但有一个library for this
https://stackoverflow.com/questions/12320763
复制相似问题