我正在为服务器编写一个计算量很大的代码(在C / C ++中)。在内部循环中,我需要调用一些外部用户函数,数百万次,因此它们必须快速运行,并且它们的调用应该没有比C函数调用更多的开销。每次我收到一个用户函数时,我会自动将它编译成二进制文件,它将由主代码动态链接。
这些函数仅用作简单的数学内核,例如:在peudo-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不是必需的,但它是首选。
我看过Mozillas“Rust”,但它似乎不够安全[rust-dev]。
如果没有这样的语言,我现在的后备选项是使用NodeJS沙盒虚拟机。
我认为,如果这种语言变得简单,这种语言是可行的,但它是否存在?
语言的类型并不重要。一种设计简单且易于证明安全的玩具语言。
编辑:关于系统调用和有害依赖,对于任何语言,应该很容易用普通的 bash 隔离它们。只是尝试将生成的.bc链接到没有库。如果失败,则.bc具有依赖关系,因此将其删除。由于LLVM IR在其他方面完全无害,因此该语言唯一应该保证的是内存访问。
答案 0 :(得分:1)
我真的想添加评论,但Stack-Overflow阻止了我。所以我只想添加它作为答案。也许它会有用。
您可以尝试查看https://github.com/andoma/vmir。我一直在努力处理沙盒任意c ++ / swift代码的希望。我想,有可能创建一个“安全”的解释器/ JIT。
您可以控制所有被调用的函数。您可以控制内存的访问方式。所以...基本上,我认为,(并希望),我可以修改JIT和解释器,以便我可以拒绝本质上不安全的代码,并设置内存边界/功能限制。
具有不同的进程ala PNaCL是明显的沙盒选择,但开销很大。我相信沙盒是在过程中完成的。