我正在爲服務器編寫一個計算繁重的代碼(在C/C++中)。在內部循環中,我需要調用一些外部用戶函數,上百萬次,因此它們必須快速運行,並且它們的調用不應該比C函數調用更具開銷。每次我收到一個用戶函數,在源代碼中,我都會自動將它編譯成二進制,並且它將通過主代碼動態鏈接。是否有基於LLVM的編程語言可以保證沙箱安全的快速二進制文件?
這些函數將僅用作簡單的數學內核,例如,在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不是必需的,但它是首選。
我看了一下Mozilla的「鏽」,但它似乎不夠安全[rust-dev]。
如果沒有這種語言,我現在的回退選項是使用NodeJS沙盒虛擬機。
我相信這樣一種語言,如果做得簡單,是可行的,但它是否存在?
語言的類型無關緊要。一個簡單的設計和易於證明安全的玩具語言可以做到。
編輯:關於系統調用和有害的依賴關係,對於任何語言,應該很容易將它們與純樸的bash隔離。試着將生成的.bc鏈接到沒有庫的鏈接上。如果失敗,則.bc具有依賴關係,因此請將其刪除。由於LLVM IR本來是完全無害的,因此語言應該保證的唯一事情就是內存訪問。
非常有趣的問題。儘管如此,這可能會成爲無關緊要的話題,因爲它要求指向非現場資源。 – 2015-02-08 20:57:24
你認爲PNaCl? – 2015-02-08 23:20:50
@ 500-InternalServerError感謝您的評論。儘管如此,我認爲這將是信息量大的,但仍然不符合我的情況,因爲我在詢問是否存在一些不太常見的事情。 – tkiwi 2015-02-08 23:54:52