2017-08-06 32 views
1

使用OCALL,我想獲得一個在非信任內存中動態創建的C字符串副本到我的飛地。因此,我必須使用[out, string]屬性。爲什麼在SGX enclave字符串參數必須與[in]屬性配合使用

但是,我不能那樣做,因爲我還必須添加[in]屬性。問題是我真的不知道字符串的大小,並且我不希望每次製作OCALL時都會從字符串不必要地複製字符串到不受信任的內存,從而導致開銷([in]附帶)。

我EDL文件:

enclave { 
    trusted { 
     public void ecall_open(void); 
    }; 
    untrusted { 
     void ocall_get_string([out, string] char* str); 
    }; 
}; 

error: string/wstring/sizefunc should be used with an 'in' attribute

爲什麼我要補充[in]屬性?

出於性能的原因,有沒有辦法避免這種開銷?

+0

開發者手冊上說 「'string'和'wstring'不能 用'單獨out'使用。」也許你可以讓你的OCALL使用自己的ECALL把數據發送到飛地,像這樣:'ocall_get_string()允許ecall_to_pass_string([in,string] char * str)''。在手冊中,這是寫在第59頁的標題*授予訪問ECALLs *。 – Daniel

回答

0

我想,一個解決辦法是將指針傳遞給char*[out]屬性和長度:

void ocall_get_string([out] char** str, [out] size_t* length);

,然後手動從不可信的存儲器複製C字符串使用memcpy()信賴。

內飛地:

char* untrusted_str; // pointer to string in untrusted memory that we would get form OCALL 
size_t length; // length of string 

ocall_get_string(&untrusted_str, &length); 

char *trusted_str = new char[length]; // pointer to string in trusted memory 
memcpy(trusted_str, untrusted_str, length); 

// delete it later 
delete[] trusted_str; 
+0

似乎是一個非常糟糕的做法。你相信一個不可信的長度和不可信的指針。如果攻擊者會通過你一個指向你在飛地內的祕密的指針呢? – Tal

+0

@Tal,同意,但我可以調用'sgx_is_outside_enclave()'來檢查我的字符串是否嚴格在飛地之外,對嗎? – yerzhan7

+0

不要重新發明輪子,決定你想要的性能或安全性。 – Tal

相關問題