English 中文(简体)
嵌入式IronPython安全
原标题:Embedded IronPython Security

我正在将IronPython嵌入到我的游戏引擎中,在那里你可以将脚本附加到对象上。我不希望脚本能够随时访问CLR,因为这样它们几乎可以做任何事情。

拥有随机脚本,尤其是从互联网下载的脚本,能够打开互联网连接、访问用户硬盘或修改内部游戏状态是一件非常糟糕的事情。

通常人们只会建议“使用单独的AppDomain”。然而,除非我严重错误,否则跨AppDomain是缓慢的。非常慢。对于游戏引擎来说太慢了。因此,我正在寻找替代方案。

我考虑过编译一个自定义版本的IronPython,使您无法导入clr或任何命名空间,从而将其限制在标准库中。

我更愿意采用的选项大致如下:

__builtins__.__import__ = None #Stops imports working
reload = None #Stops reloading working (specifically stops them reloading builtins
          #giving back an unbroken __import___!

I read this in another stack overflow post. Assume that instead of setting __ builtins_._ import__ to none, I instead set it to a custom function that lets you load the standard API.

问题是,使用上面概述的方法,脚本是否有任何方法能够访问clr模块、.net BCL或其他可能造成不良影响的东西?或者我应该修改源代码吗?第三种选择?

最佳回答

保证它的唯一方法是使用AppDomain。我不知道表演的重点是什么;这取决于你的用例,所以你应该先测量它,以确保它实际上太慢了。

如果你只需要一个尽力而为的系统,如果脚本不需要导入任何东西,而且你从主机提供了它们所需的所有对象,那么你的方案应该是可以接受的。您还可以避免发布Python标准库,这将节省一些空间。

你会想检查其他内置组件是否有任何可能与外界对话的东西<首先想到的是代码>打开、文件输入raw_input执行文件,但可能还有其他exec也可能是一个问题,由于它是一个关键字,如果有空缺,关闭它可能会更棘手。永远不要低估一个坚定的攻击者的能力!

问题回答

我以前在应用程序中嵌入过Iron Python,并分享了类似的安全问题。我为降低风险所做的工作是为脚本运行时创建特殊对象,这些对象本质上是我的核心对象的包装,只暴露了“安全”功能。

创建仅用于脚本编写的对象的另一个好处是,您可以使用辅助函数优化它们以用于脚本编写,使您的脚本更加简洁整洁。

无论是否使用Appdomain,都没有什么能阻止某人在他们的脚本中加载外部.py模块。。。。这是你为灵活性付出的代价。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...