不安全的Haskell代码的安全执行

27

我正在寻找一种安全运行任意Haskell代码的方法(或拒绝运行不安全的代码)。

必须具备以下功能:

  • 模块/函数白名单
  • 执行超时
  • 内存使用限制

我希望看到的功能包括:

  • 能够终止线程
  • 编译模块为本机代码
  • 缓存编译代码
  • 同时运行几个解释器
  • 编译器错误的复杂数据类型(而不是字符串中的简单消息)

有了这样的功能,就可以实现一个浏览器插件,能够运行任意的Haskell代码,这是我想要的想法。

编辑:我得到了两个答案,都很好。谢谢!不幸的是,似乎没有现成的库,只有类似的程序。它是一个有用的资源。无论如何,我想我会等待7.2.1发布,并尝试在自己的程序中使用SafeHaskell。

2个回答

31

lambdabot 中,我们已经这样做了大约8年,它支持:

  • 受控命名空间
  • 操作系统强制超时
  • 本地代码模块
  • 缓存
  • 并发交互式顶层
  • 自定义错误消息返回。

这一系列规则已有文档记录,见:

在 lambdabot 中采取的安全性方法启发了Safe Haskell语言扩展工作。


关于编译后的 Haskell 应用程序动态扩展的方法,在 Haskell 中,请参见以下两篇论文:


我接受这个答案,因为更多的人投票支持它。Simon的回答也很好。感谢大家的回复! - Tener

26

GHC 7.2.1 很可能会有一个名为SafeHaskell的新机制,其中包括您想要的一些内容。 SafeHaskell 确保类型安全性(例如,unsafePerformIO等不合法),并建立了一种信任机制,以便可以信任使用不安全功能实现的具有安全 API 的库。 它专门设计用于运行不受信任的代码。

对于其他实际方面(超时等),正如Don所说,lambdabot将是一个很好的参考。


7.2.1 版本将实现 SafeHaskell 提案的哪一部分?全部吗? - Tener
David Terei已经实现了SafeHaskell的编译器部分,该补丁正在等待我的审核队列。其余部分是修改基础包和其他库以适当地使用Safe和Trustworthy。David正在处理这部分工作。我预计SafeHaskell将在7.2.1的某个实验状态下可用。 - Simon Marlow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接