【问题标题】:Safe execution of untrusted Haskell code安全执行不受信任的 Haskell 代码
【发布时间】:2011-08-23 19:06:52
【问题描述】:

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

必须:

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

我希望看到的能力:

  • 能够杀死线程
  • 将模块编译为本机代码
  • 已编译代码的缓存
  • 同时运行多个解释器
  • 编译器错误的复杂数据类型(在字符串中插入简单消息)

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

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

【问题讨论】:

    标签: haskell execution isolation sandbox


    【解决方案1】:

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

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

    这一系列的规则都有记录,见:

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


    有关在 Haskell 中动态扩展已编译的 Haskell 应用程序的方法,请参阅两篇论文:

    【讨论】:

    • 我接受这个答案是因为有更多人对此进行了投票。西蒙的回答也很棒。感谢您的回复!
    【解决方案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 中以某种实验状态提供。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多