安全执行不受信任的 Haskell 代码
Posted
技术标签:
【中文标题】安全执行不受信任的 Haskell 代码【英文标题】:Safe execution of untrusted Haskell code 【发布时间】:2011-08-23 19:06:52 【问题描述】:我正在寻找一种安全运行任意 Haskell 代码(或拒绝运行不安全代码)的方法。
必须:
模块/功能白名单 执行超时 内存使用限制我希望看到的能力:
能够杀死线程 将模块编译为本机代码 已编译代码的缓存 同时运行多个解释器 编译器错误的复杂数据类型(在字符串中插入简单消息)有了这样的功能,就有可能实现一个能够运行任意 Haskell 代码的浏览器插件,这是我的想法。
编辑:我有两个答案,都很好。谢谢!可悲的是,似乎没有现成的库,只有一个类似的程序。这是一个有用的资源。无论如何,我想我会等待 7.2.1 发布并尝试在我自己的程序中使用 SafeHaskell。
【问题讨论】:
【参考方案1】:我们在lambdabot 已经做了大约 8 年了,它支持:
受控命名空间 操作系统强制超时 本机代码模块 缓存 并发交互式顶层 自定义错误消息返回。这一系列的规则都有记录,见:
Safely running untrusted Haskell code mueval,基于 ghc-api 的替代实现lambdabot 中采取的安全方法启发了Safe Haskell 语言扩展工作。
有关在 Haskell 中动态扩展已编译的 Haskell 应用程序的方法,请参阅两篇论文:
Dynamic Extension of Typed Functional Languages,和 Dynamic applications from the ground up。【讨论】:
我接受这个答案是因为有更多人对此进行了投票。西蒙的回答也很棒。感谢您的回复!【参考方案2】:GHC 7.2.1 可能会有一个名为SafeHaskell 的新功能,它涵盖了您想要的一些功能。 SafeHaskell 确保类型安全(因此 unsafePerformIO
之类的东西是非法的),并建立了信任机制,因此可以信任具有安全 API 但使用不安全功能实现的库。它专为运行不受信任的代码而设计。
对于其他实际方面(超时等),Don 所说的 lambdabot 将是一个不错的选择。
【讨论】:
SafeHaskell 提案的哪一部分将在 7.2.1 中实施?整件事? David Terei 已经实现了 SafeHaskell 的编译器部分,补丁正在我的审核队列中等待。剩下的就是修改基础包和其他库以酌情使用 Safe and Trustworthy。大卫现在正在做这部分工作。我预计 SafeHaskell 将在 7.2.1 中以某种实验状态提供。以上是关于安全执行不受信任的 Haskell 代码的主要内容,如果未能解决你的问题,请参考以下文章
防止不受信任的 C# 代码启动新线程或黑名单/白名单 API