【发布时间】:2013-11-11 04:43:53
【问题描述】:
我需要能够运行不受信任的 Python 脚本。经过大量研究,似乎只有 Python 的沙箱并不安全,至少使用 CPython(我需要使用它)。
因此,我们也计划使用操作系统级别的沙盒(SELinux、AppArmor 等)。
我的问题是:我们如何安全地与沙盒通信?沙箱中的代码将需要返回 Python 类型,例如 int 和 str,以及 Numpy 数组。未来可能会有更多类型。
显而易见的方法是使用 pickle,但沙箱中的一些恶意代码似乎可能会获取输出管道(我们正在考虑使用 0MQ)并发送回一些可能导致任意代码执行的东西在沙盒外解封。
是否有没有 JSON 等性能开销的更安全的序列化替代方案来替代 pickle?
我们使用的是 Python 3.3。
【问题讨论】:
-
从使用包含 100 个元素的 100K 列表的简单 dict 进行的快速测试中,
pickle.dumps耗时 35.6 毫秒,json.dumps耗时 71.6 毫秒。这是您担心的性能开销吗?还是您的数据有什么不同? (通过快速测试,same 列表的 100K 副本会极大地加快pickle的速度,但json根本不会;您正在处理的是那种事情吗?) -
无论如何,如果你想要一些只适用于受限类型白名单的东西,从 YAML 的安全子集开始并为你的白名单添加显式处理程序(而不是使用可扩展的 YAML 并尝试限制它)应该与您需要的一样安全。但它可能不会比您可能考虑的自定义扩展 JSON 更快;它甚至可能更慢。只是 YAML 被设计为以这种方式扩展,而 JSON 不是(这意味着,例如,通用可扩展 YAML 解析器将能够读取您的数据以进行调试),因此可能值得尝试。跨度>
-
最后,你确定限制类型就足够了吗?很可能任何能够掌握管道的人都可以创建巨大的整数或其他东西来拒绝您的代码;如果字符串代表任何类型的外部资源,如 URL 或路径名,它们可以传递任何他们想要的字符串;等等这样可以吗?
-
字典很好,但 numpy 数组和 pandas DataFrames(基于 numpy 数组)似乎不太好。对于 1000x100 的 DataFrame,转储到 JSON 需要 15 毫秒,加载需要 65 毫秒。通过 pickle 倾倒需要 250 微秒(不是毫秒),加载需要 150 微秒。
-
谢谢。我会看看 YAML。 DoS 也是值得考虑的事情。
标签: python security sandbox pickle python-3.3