【问题标题】:Is there an LLVM-based programming language that can guarantee sandbox-safe fast binaries?是否有基于 LLVM 的编程语言可以保证沙盒安全的快速二进制文件?
【发布时间】:2025-12-31 02:05:12
【问题描述】:

我正在为服务器(使用 C/C++)编写计算量很大的代码。在内部循环中,我需要调用一些外部用户函数,数百万次,因此它们必须在本机上快速运行,并且它们的调用开销不应超过 C 函数调用。每次收到用户函数,源码形式,我会自动编译成二进制,并由主代码动态链接。

这些函数将仅用作简单的数学内核,例如在伪 C 中:

Function f(double x) ->double {
  return x * x;
}

或使用数组访问:

Function f(double* ar, int length) ->double {
  double sum = 0;
  for(i = 0 to length) {
    sum = sum + ar[i];
  }
  return sum;
}

或使用基本的数学库调用:

Function f(double x) ->double {
  return cos(x);
}

但是,它们必须对服务器安全。如果他们停止(图灵完备)是可以的,但如果他们访问不属于他们自己的进程内存,如果他们进行系统调用,如果他们导致堆栈溢出,或者概括地说,外部代码“能够破解服务器代码”是不受欢迎的。

所以我的问题是:如果有一种设计安全的语言与 LLVM 前端(没有指针等,具有数组/堆栈的边界检查,系统调用的隔离),没有速度,我正在徘徊我可以使用的惩罚(指主管、垃圾收集器)。 LLVM 不是必需的,但它是首选。

我查看了 Mozilla 的“Rust”,但它似乎不够安全 [rust-dev]

如果没有这样的语言,我现在的后备选项是使用 NodeJS 沙盒虚拟机。

我相信这样的语言,如果简单的话,是可行的,但它存在吗?

语言类型无关紧要。设计简单且易于证明安全的玩具语言就可以了。

编辑:关于系统调用和有害的依赖关系,对于任何语言,用普通的 bash 隔离它们应该很容易。只需尝试将生成的 .bc 与没有库的链接。如果失败,.bc 有依赖关系,所以放弃它。由于 LLVM IR 在其他方面完全无害,因此该语言唯一应该保证的是内存访问。

【问题讨论】:

  • 非常有趣的问题。不过,这里可能是题外话,因为它要求指向场外资源的指针。
  • 你考虑过 PNaCl 吗?
  • @500-InternalServerError 感谢您的评论。我认为它会提供信息,但规则仍然不完全是我的情况,因为我问的是一些不太常见的东西的存在。
  • @EliBendersky 是的,我不知何故跳过了它,尽管从我读到的内容中假设它可能会增加一些复杂性、主管,以及每次调用该方法时可能会增加一些(昂贵的?)开销.然而,这只是我的印象,因为我没有找到足够的资源。
  • 这听起来完全符合您的要求 - 我建议您阅读更多相关信息。从这里开始:developer.chrome.com/native-client/nacl-and-pnacl

标签: security llvm sandbox


【解决方案1】:

我真的很想添加评论,但是 Stack-Overflow 阻止了我。因此,我将其添加为答案。也许会有用。

您可以尝试查看https://github.com/andoma/vmir。我一直在使用它,希望能对任意 c++/swift 代码进行沙盒处理。我认为,有可能创建一个“安全”的解释器/JIT。

您可以控制所有被调用的函数。您可以控制访问内存的方式。所以...基本上,我认为(并且希望)我可以对 JIT 和解释器进行足够的修改,以便我可以拒绝本质上不安全的代码,并设置内存边界/功能限制。

拥有不同的进程 ala PNaCL 是显而易见的沙盒选择,但开销很大。我相信沙盒是明智地完成的。

【讨论】:

  • 这听起来很有趣,但是您的自述文件谈到了运行时开销。我想知道是否有一个答案涉及编译器(内部托管)而不是沙箱实现的安全性
  • @tikwi 我想知道您是否可以查看编译为机器代码的 java 或 c#。 (使用自定义系统类路径)。这些语言的垃圾收集方面很不幸,但是......
最近更新 更多