2015-02-08 41 views
5

我正在爲服務器編寫一個計算繁重的代碼(在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本來是完全無害的,因此語言應該保證的唯一事情就是內存訪問。

+1

非常有趣的問題。儘管如此,這可能會成爲無關緊要的話題,因爲它要求指向非現場資源。 – 2015-02-08 20:57:24

+1

你認爲PNaCl? – 2015-02-08 23:20:50

+0

@ 500-InternalServerError感謝您的評論。儘管如此,我認爲這將是信息量大的,但仍然不符合我的情況,因爲我在詢問是否存在一些不太常見的事情。 – tkiwi 2015-02-08 23:54:52

回答

1

我真的想添加一條評論,但Stack-Overflow阻止了我。所以我只是將其添加爲答案。也許它會有用。

您可以試試看https://github.com/andoma/vmir。我一直在努力,希望能夠沙箱化任意C++/swift代碼。我認爲,可能會創建一個「安全」的翻譯/ JIT。

您可以控制所有被調用的函數。您可以控制如何訪問內存。所以...基本上,我認爲(並且希望),我可以修改JIT和解釋器,以便我可以拒絕本質上不安全的代碼,並放置內存邊界/函數限制。

具有不同的進程ala PNaCL是顯而易見的沙盒選擇,但開銷很大。我相信沙盒的過程是明智的。

+0

這聽起來很有趣,但是您的自述文件討論了運行時開銷。我想知道是否有,在某個地方,涉及編譯器(內部託管),而不是沙箱 – tkiwi 2016-09-13 16:03:45

+0

@tikwi達到安全的答案我不知道你是否可以看看Java或c#編譯爲機器碼。 (使用自定義系統類路徑)。這些語言的垃圾收集方面是不幸的,但是...... – iamacomputer 2016-09-20 23:26:26

相關問題