tki*_*iwi 6 security sandbox llvm
我正在为服务器编写一个计算量很大的代码(在C/C++中).在内部循环中,我需要调用一些外部用户函数,数百万次,因此它们必须快速本地运行,并且它们的调用应该没有比C函数调用更多的开销.每次我收到一个用户函数时,我会自动将它编译成二进制文件,它将由主代码动态链接.
这些函数将仅用作简单的数学内核,例如在peudo-C中:
Function f(double x) ->double {
return x * x;
}
Run Code Online (Sandbox Code Playgroud)
或者使用数组访问:
Function f(double* ar, int length) ->double {
double sum = 0;
for(i = 0 to length) {
sum = sum + ar[i];
}
return sum;
}
Run Code Online (Sandbox Code Playgroud)
或者使用基本的数学库调用:
Function f(double x) ->double {
return cos(x);
}
Run Code Online (Sandbox Code Playgroud)
但是,它们必须对服务器安全.它们可以暂停(图灵完整性),但如果它们访问不是它们自己的进程内存,如果它们进行系统调用,如果它们导致堆栈溢出,或者为了概括,则外部代码不需要" 能够破解服务器代码 ".
所以我的问题是:如果有一个带有LLVM前端的安全设计语言,(没有指针等,绑定检查数组/堆栈,隔离系统调用),我就会徘徊,没有速度惩罚(参考我可以使用的监督员,垃圾收集者).LLVM不是必需的,但它是首选.
我看过Mozillas"Rust",但它似乎不够安全[rust-dev].
如果没有这样的语言,我现在的后备选项是使用NodeJS沙盒VM.
我相信这种语言,如果简单,是可行的,但它是否存在?
语言的类型无关紧要.一种设计简单且易于证明安全的玩具语言.
编辑:关于系统调用和有害依赖,对于任何语言,它应该很容易用普通的bash隔离它们.只是尝试将生成的.bc链接到没有库.如果失败,则.bc具有依赖关系,因此将其删除.由于LLVM IR在其他方面完全无害,因此该语言唯一应该保证的是内存访问.
我真的很想添加评论,但是 Stack-Overflow 阻止了我。所以我将其添加为答案。也许它会有用。
您可以尝试查看https://github.com/andoma/vmir。我一直在研究它,希望对任意 c++/swift 代码进行沙箱处理。我认为,创建一个“安全”解释器/JIT 是可能的。
您可以控制所有被调用的函数。您可以控制内存的访问方式。所以......基本上,我认为(并且希望)我可以充分修改 JIT 和解释器,以便我可以拒绝本质上不安全的代码,并设置内存边界/函数限制。
拥有不同的进程(如 PNaCL)是明显的沙箱选择,但开销很大。我相信沙箱是明智地完成的。