安全执行不受信任的 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 代码的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中反序列化不受信任的数据有啥安全影响?

防止不受信任的 C# 代码启动新线程或黑名单/白名单 API

执行不受信任的代码

getJSON() 是不是可以安全地调用不受信任的 URL?

SSL安全证书不受信任怎么办

charles进行手机抓包:安全证书不受信任,错误码3 怎么解决下?